{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "assignment-submission-dropzone",
  "title": "Assignment Submission Dropzone",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-react/blocks/assignment-submission-dropzone/AssignmentSubmissionDropzone.tsx",
      "content": "'use client'\n\nimport * as React from 'react'\nimport {\n  Award,\n  BookOpen,\n  CheckCircle2,\n  Clock,\n  FileArchive,\n  GraduationCap,\n  Info,\n  RotateCcw,\n  Save,\n  Send,\n  ShieldAlert,\n  ShieldCheck,\n  Timer,\n  Trash2,\n  UploadCloud,\n} from 'lucide-react'\nimport { cn } from '@/lib/utils'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@/components/ui/card'\nimport { Progress } from '@/components/ui/progress'\nimport { Separator } from '@/components/ui/separator'\nimport { Textarea } from '@/components/ui/textarea'\n\nexport interface AttachedFile {\n  name: string\n  size: string\n  uploadedAt: string\n  similarity: number\n  status: string\n}\n\nexport interface RubricCriterion {\n  label: string\n  points: number\n}\n\nexport interface RubricCategory {\n  id: string\n  title: string\n  points: number\n  percentage: number\n  criteria: RubricCriterion[]\n}\n\nexport interface AssignmentSubmissionDropzoneProps {\n  initialFile?: AttachedFile | null\n  initialNotes?: string\n  initialSubmitted?: boolean\n  className?: string\n}\n\nconst defaultRubricCategories: RubricCategory[] = [\n  {\n    id: 'architecture',\n    title: 'Architecture & Fault Tolerance',\n    points: 40,\n    percentage: 40,\n    criteria: [\n      { label: 'Consensus algorithm implementation (Raft / Paxos) & partition resilience', points: 20 },\n      { label: 'Service discovery, dynamic load balancing, & circuit breaking', points: 15 },\n      { label: 'Data replication & linearizable consistency guarantees', points: 5 },\n    ],\n  },\n  {\n    id: 'code-quality',\n    title: 'Code Quality & Test Coverage',\n    points: 30,\n    percentage: 30,\n    criteria: [\n      { label: 'Automated unit, fuzz, & integration test suite (>85% coverage)', points: 15 },\n      { label: 'Idiomatic concurrency patterns, memory safety, clean modularity', points: 10 },\n      { label: 'Reproducible CI/CD pipeline automation & static analysis pass', points: 5 },\n    ],\n  },\n  {\n    id: 'performance',\n    title: 'Performance Benchmarks',\n    points: 20,\n    percentage: 20,\n    criteria: [\n      { label: 'Sustained throughput under load (>15,000 req/sec benchmark)', points: 10 },\n      { label: 'P99 latency SLA (<25ms under 50% simulated node failure)', points: 10 },\n    ],\n  },\n  {\n    id: 'documentation',\n    title: 'Documentation & API Specs',\n    points: 10,\n    percentage: 10,\n    criteria: [\n      { label: 'OpenAPI 3.1 & gRPC Protobuf schema specifications', points: 5 },\n      { label: 'System architecture design doc & production deployment runbook', points: 5 },\n    ],\n  },\n]\n\nexport function AssignmentSubmissionDropzone({\n  initialFile = {\n    name: 'distributed_system_v1.zip',\n    size: '18.4 MB',\n    uploadedAt: 'Aug 24, 14:22 PST',\n    similarity: 0.8,\n    status: 'Ready to submit',\n  },\n  initialNotes = 'Included benchmark logs in the /docs folder. All 12 distributed Raft consensus nodes passed the Chaos Mesh partition tests under 500ms latency simulation.',\n  initialSubmitted = false,\n  className,\n}: AssignmentSubmissionDropzoneProps) {\n  const [file, setFile] = React.useState<AttachedFile | null>(initialFile)\n  const [notes, setNotes] = React.useState(initialNotes)\n  const [isSubmitted, setIsSubmitted] = React.useState(initialSubmitted)\n  const [isDraftSaved, setIsDraftSaved] = React.useState(false)\n  const [isDragging, setIsDragging] = React.useState(false)\n  const fileInputRef = React.useRef<HTMLInputElement | null>(null)\n\n  const isCleanSimilarity = !file || file.similarity < 10\n\n  const triggerBrowse = () => {\n    fileInputRef.current?.click()\n  }\n\n  const handleFileInput = (e: React.ChangeEvent<HTMLInputElement>) => {\n    if (e.target.files && e.target.files.length > 0) {\n      const f = e.target.files[0]\n      setFile({\n        name: f.name,\n        size: `${(f.size / (1024 * 1024)).toFixed(1)} MB`,\n        uploadedAt: 'Just now',\n        similarity: 0.8,\n        status: 'Ready to submit',\n      })\n    }\n  }\n\n  const handleDrop = (e: React.DragEvent<HTMLDivElement>) => {\n    e.preventDefault()\n    setIsDragging(false)\n    if (e.dataTransfer?.files && e.dataTransfer.files.length > 0) {\n      const f = e.dataTransfer.files[0]\n      setFile({\n        name: f.name,\n        size: `${(f.size / (1024 * 1024)).toFixed(1)} MB`,\n        uploadedAt: 'Just now',\n        similarity: 0.8,\n        status: 'Ready to submit',\n      })\n    }\n  }\n\n  const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {\n    e.preventDefault()\n    setIsDragging(true)\n  }\n\n  const handleDragLeave = (e: React.DragEvent<HTMLDivElement>) => {\n    e.preventDefault()\n    setIsDragging(false)\n  }\n\n  const removeFile = () => {\n    setFile(null)\n  }\n\n  const restoreSampleFile = () => {\n    setFile({\n      name: 'distributed_system_v1.zip',\n      size: '18.4 MB',\n      uploadedAt: 'Aug 24, 14:22 PST',\n      similarity: 0.8,\n      status: 'Ready to submit',\n    })\n  }\n\n  const handleSaveDraft = () => {\n    setIsDraftSaved(true)\n    setTimeout(() => {\n      setIsDraftSaved(false)\n    }, 3000)\n  }\n\n  const handleSubmit = () => {\n    if (!file) return\n    setIsSubmitted(true)\n  }\n\n  const handleResetSubmission = () => {\n    setIsSubmitted(false)\n  }\n\n  return (\n    <div data-slot=\"assignment-submission-dropzone\" className={cn('space-y-6', className)}>\n      {/* Assignment Header Card */}\n      <Card className=\"shadow-xs\">\n        <CardContent className=\"p-6\">\n          <div className=\"flex flex-col gap-6 lg:flex-row lg:items-center lg:justify-between\">\n            <div className=\"space-y-2\">\n              <div className=\"flex flex-wrap items-center gap-2\">\n                <Badge wrap variant=\"outline\" className=\"gap-1.5 font-medium\">\n                  <GraduationCap className=\"text-primary size-3.5\" aria-hidden=\"true\" />\n                  CS 401 · Advanced Distributed Systems\n                </Badge>\n                <Badge wrap variant=\"secondary\" className=\"gap-1 text-xs\">\n                  <Award className=\"text-muted-foreground size-3\" aria-hidden=\"true\" />\n                  100 Points Possible\n                </Badge>\n              </div>\n\n              <h1 className=\"text-foreground text-xl font-semibold tracking-tight sm:text-2xl\">\n                Final Project: Distributed Microservices Architecture\n              </h1>\n\n              <p className=\"text-muted-foreground text-sm\">\n                Term: Fall 2026 · Instructor: Prof. Elena Rostova · Stanford School of Engineering\n              </p>\n            </div>\n\n            {/* Deadline Timer & Badges */}\n            <div className=\"flex flex-col items-start gap-3 sm:flex-row sm:items-center lg:flex-col lg:items-end\">\n              <Badge wrap variant=\"warning\" className=\"gap-1.5 px-3 py-1 text-xs font-medium\">\n                <Clock className=\"size-3.5\" aria-hidden=\"true\" />\n                Due Friday, Aug 28 at 23:59 PST · 4 Days Left\n              </Badge>\n\n              {/* Countdown blocks */}\n              <div className=\"border-border bg-muted/40 flex items-center gap-2 rounded-lg border px-3 py-1.5 shadow-xs\">\n                <Timer className=\"text-muted-foreground size-4 shrink-0\" aria-hidden=\"true\" />\n                <div className=\"flex items-center gap-1.5 text-xs font-medium\">\n                  <div className=\"flex items-baseline gap-0.5\">\n                    <span className=\"text-foreground font-semibold\">04</span>\n                    <span className=\"text-muted-foreground text-xs\">d</span>\n                  </div>\n                  <span className=\"text-muted-foreground\">:</span>\n                  <div className=\"flex items-baseline gap-0.5\">\n                    <span className=\"text-foreground font-semibold\">07</span>\n                    <span className=\"text-muted-foreground text-xs\">h</span>\n                  </div>\n                  <span className=\"text-muted-foreground\">:</span>\n                  <div className=\"flex items-baseline gap-0.5\">\n                    <span className=\"text-foreground font-semibold\">32</span>\n                    <span className=\"text-muted-foreground text-xs\">m</span>\n                  </div>\n                  <span className=\"text-muted-foreground\">:</span>\n                  <div className=\"flex items-baseline gap-0.5\">\n                    <span className=\"text-foreground font-semibold\">15</span>\n                    <span className=\"text-muted-foreground text-xs\">s</span>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n        </CardContent>\n      </Card>\n\n      {/* Submitted Confirmation Banner */}\n      {isSubmitted && (\n        <div\n          className=\"border-success/30 bg-success/10 text-foreground flex flex-col gap-4 rounded-xl border p-5 sm:flex-row sm:items-center sm:justify-between\"\n          role=\"status\"\n        >\n          <div className=\"flex items-start gap-3\">\n            <div className=\"bg-success/20 text-success flex size-9 shrink-0 items-center justify-center rounded-full\">\n              <CheckCircle2 className=\"size-5\" aria-hidden=\"true\" />\n            </div>\n            <div className=\"space-y-1\">\n              <div className=\"flex flex-wrap items-center gap-2\">\n                <h2 className=\"text-base font-semibold\">Coursework Submitted Successfully</h2>\n                <Badge wrap variant=\"success\" className=\"text-xs\">\n                  Receipt #SUB-CS401-2026-98124\n                </Badge>\n              </div>\n              <p className=\"text-muted-foreground text-xs sm:text-sm\">\n                Submission timestamp: August 24, 2026 at 14:25 PST · Hash:{' '}\n                <code className=\"font-mono text-xs\">sha256:4a8b...7f12</code>\n              </p>\n            </div>\n          </div>\n          <div className=\"flex items-center gap-2\">\n            <Button variant=\"outline\" size=\"sm\" onClick={handleResetSubmission}>\n              <RotateCcw className=\"size-3.5\" aria-hidden=\"true\" />\n              Edit Submission\n            </Button>\n          </div>\n        </div>\n      )}\n\n      {/* 2-Column Submission Layout */}\n      <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-12\">\n        {/* Left Column: Submission & Dropzone Form */}\n        <div className=\"space-y-6 lg:col-span-7 xl:col-span-7\">\n          <Card className=\"shadow-xs\">\n            <CardHeader>\n              <div className=\"flex items-center justify-between\">\n                <div className=\"space-y-1\">\n                  <CardTitle className=\"text-lg font-semibold\">Submission & File Upload</CardTitle>\n                  <CardDescription>\n                    Upload your completed project archive, code repository bundle, and accompanying documentation.\n                  </CardDescription>\n                </div>\n                <Badge wrap variant=\"outline\" className=\"text-xs\">\n                  Attempt 1 of 3\n                </Badge>\n              </div>\n            </CardHeader>\n\n            <CardContent className=\"space-y-5\">\n              {/* Submission Instructions & Constraints */}\n              <div className=\"border-border bg-muted/40 flex items-start gap-3 rounded-lg border p-3.5 text-xs shadow-xs\">\n                <Info className=\"text-primary mt-0.5 size-4 shrink-0\" aria-hidden=\"true\" />\n                <div className=\"space-y-0.5\">\n                  <p className=\"text-foreground font-medium\">\n                    Accepted formats: PDF, ZIP, TAR.GZ · Max file size: 50 MB\n                  </p>\n                  <p className=\"text-muted-foreground\">\n                    Ensure all Docker Compose manifests, benchmarking scripts, and unit tests are included in the\n                    archive root.\n                  </p>\n                </div>\n              </div>\n\n              {/* File Dropzone */}\n              <div>\n                <input\n                  ref={fileInputRef}\n                  type=\"file\"\n                  className=\"hidden\"\n                  accept=\".zip,.tar.gz,.tar,.pdf\"\n                  onChange={handleFileInput}\n                />\n\n                <div\n                  className={cn(\n                    'group relative flex flex-col items-center justify-center rounded-xl border-2 border-dashed p-8 text-center transition-colors duration-200',\n                    isDragging\n                      ? 'border-primary bg-primary/5'\n                      : 'border-border bg-muted/10 hover:border-primary/50 hover:bg-muted/20',\n                  )}\n                  onDragOver={handleDragOver}\n                  onDragLeave={handleDragLeave}\n                  onDrop={handleDrop}\n                >\n                  <div className=\"bg-primary/10 text-primary flex size-12 items-center justify-center rounded-full transition-transform duration-200 group-hover:scale-105\">\n                    <UploadCloud className=\"size-6\" aria-hidden=\"true\" />\n                  </div>\n\n                  <div className=\"mt-3 space-y-1\">\n                    <p className=\"text-foreground text-sm font-medium\">Drag and drop your project archive here</p>\n                    <p className=\"text-muted-foreground text-xs\">\n                      or select a file directly from your local filesystem\n                    </p>\n                  </div>\n\n                  <div className=\"mt-4 flex items-center gap-2\">\n                    <Button variant=\"outline\" size=\"sm\" type=\"button\" onClick={triggerBrowse}>\n                      Browse files\n                    </Button>\n                  </div>\n\n                  <div className=\"text-muted-foreground mt-4 flex items-center gap-1.5 text-xs\">\n                    <span className=\"border-border bg-muted rounded px-1.5 py-0.5 font-mono text-xs\">.zip</span>\n                    <span className=\"border-border bg-muted rounded px-1.5 py-0.5 font-mono text-xs\">.tar.gz</span>\n                    <span className=\"border-border bg-muted rounded px-1.5 py-0.5 font-mono text-xs\">.pdf</span>\n                  </div>\n                </div>\n              </div>\n\n              {/* Attached Files List */}\n              <div className=\"space-y-2\">\n                <div className=\"flex items-center justify-between\">\n                  <span className=\"text-foreground text-xs font-semibold tracking-wider uppercase\">\n                    Attached Files ({file ? '1' : '0'} / 1)\n                  </span>\n                  {!file && <span className=\"text-muted-foreground text-xs\">No file attached</span>}\n                </div>\n\n                {/* File Item Card */}\n                {file ? (\n                  <div className=\"border-border bg-card flex flex-col gap-3 rounded-lg border p-3.5 shadow-xs transition-colors sm:flex-row sm:items-center sm:justify-between\">\n                    <div className=\"flex min-w-0 items-center gap-3\">\n                      <div className=\"bg-primary/10 text-primary flex size-10 shrink-0 items-center justify-center rounded-md\">\n                        <FileArchive className=\"size-5\" aria-hidden=\"true\" />\n                      </div>\n                      <div className=\"min-w-0 space-y-0.5\">\n                        <p className=\"text-foreground truncate text-sm font-medium\">{file.name}</p>\n                        <p className=\"text-muted-foreground text-xs\">\n                          {file.size} · {file.uploadedAt}\n                        </p>\n                      </div>\n                    </div>\n\n                    <div className=\"flex items-center gap-2 self-end sm:self-center\">\n                      <Badge wrap variant=\"secondary\" className=\"text-xs\">\n                        {file.size}\n                      </Badge>\n                      <Badge wrap variant=\"outline\" className=\"border-success/30 text-success text-xs font-medium\">\n                        {file.status}\n                      </Badge>\n                      <Button\n                        variant=\"ghost\"\n                        size=\"icon-sm\"\n                        className=\"text-muted-foreground hover:text-destructive\"\n                        title=\"Remove file\"\n                        aria-label=\"Remove attached file\"\n                        onClick={removeFile}\n                      >\n                        <Trash2 className=\"size-4\" aria-hidden=\"true\" />\n                      </Button>\n                    </div>\n                  </div>\n                ) : (\n                  <div className=\"border-border bg-muted/20 flex items-center justify-between rounded-lg border border-dashed p-3 text-xs\">\n                    <span className=\"text-muted-foreground\">Sample archive cleared.</span>\n                    <Button variant=\"ghost\" size=\"xs\" className=\"text-primary text-xs\" onClick={restoreSampleFile}>\n                      Restore default file\n                    </Button>\n                  </div>\n                )}\n              </div>\n\n              {/* Plagiarism & Similarity Pre-scan Indicator */}\n              {file && (\n                <div\n                  className={cn(\n                    'space-y-3 rounded-lg border p-4 shadow-xs transition-colors',\n                    isCleanSimilarity\n                      ? 'border-success/30 bg-success/5 dark:bg-success/10'\n                      : 'border-warning/30 bg-warning/5 dark:bg-warning/10',\n                  )}\n                >\n                  <div className=\"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between\">\n                    <div className=\"flex items-center gap-2\">\n                      {isCleanSimilarity ? (\n                        <ShieldCheck className=\"text-success size-5 shrink-0\" aria-hidden=\"true\" />\n                      ) : (\n                        <ShieldAlert className=\"text-warning size-5 shrink-0\" aria-hidden=\"true\" />\n                      )}\n                      <div>\n                        <h3 className=\"text-foreground text-sm font-semibold\">\n                          Academic Integrity & Plagiarism Pre-Scan\n                        </h3>\n                        <p className=\"text-muted-foreground text-xs\">\n                          Scanned against 14.2M academic repositories & public open-source codebases\n                        </p>\n                      </div>\n                    </div>\n\n                    <Badge\n                      wrap\n                      variant={isCleanSimilarity ? 'success' : 'warning'}\n                      className=\"gap-1 self-start text-xs font-medium sm:self-auto\"\n                    >\n                      <ShieldCheck className=\"size-3\" aria-hidden=\"true\" />\n                      {file.similarity}% Similarity · {isCleanSimilarity ? 'Clean' : 'Needs Review'}\n                    </Badge>\n                  </div>\n\n                  {/* Mini metric progress line */}\n                  <div className=\"space-y-1.5 pt-1\">\n                    <div className=\"flex items-center justify-between text-xs\">\n                      <span className=\"text-muted-foreground\">Overall similarity index</span>\n                      <span className=\"text-foreground font-mono font-medium\">\n                        {file.similarity}% (Max threshold: 15.0%)\n                      </span>\n                    </div>\n                    <Progress value={file.similarity * 6.66} className=\"h-1.5\" />\n                  </div>\n\n                  {/* Integrity breakdown chips */}\n                  <div className=\"grid grid-cols-1 gap-2 pt-1 text-xs sm:grid-cols-3\">\n                    <div className=\"border-border/60 bg-card/60 rounded border p-2\">\n                      <span className=\"text-muted-foreground block text-xs\">Internet Sources</span>\n                      <span className=\"text-foreground font-medium\">0.0% match</span>\n                    </div>\n                    <div className=\"border-border/60 bg-card/60 rounded border p-2\">\n                      <span className=\"text-muted-foreground block text-xs\">Peer Submissions</span>\n                      <span className=\"text-foreground font-medium\">0.0% match</span>\n                    </div>\n                    <div className=\"border-border/60 bg-card/60 rounded border p-2\">\n                      <span className=\"text-muted-foreground block text-xs\">Standard Boilerplate</span>\n                      <span className=\"text-foreground font-medium\">{file.similarity}% (Apache 2.0)</span>\n                    </div>\n                  </div>\n                </div>\n              )}\n\n              {/* Student Submission Notes Textarea */}\n              <div className=\"space-y-2\">\n                <label htmlFor=\"react-submission-notes\" className=\"text-foreground text-sm font-medium\">\n                  Student Submission Notes & Execution Instructions\n                </label>\n                <Textarea\n                  id=\"react-submission-notes\"\n                  value={notes}\n                  onValueChange={setNotes}\n                  rows={3}\n                  placeholder=\"Included benchmark logs in the /docs folder...\"\n                  className=\"text-sm\"\n                />\n                <p className=\"text-muted-foreground text-xs\">\n                  Provide notes on environment configurations, docker flags, or benchmark reproducibility steps.\n                </p>\n              </div>\n            </CardContent>\n\n            <CardFooter className=\"border-border flex flex-col gap-3 border-t pt-4 sm:flex-row sm:items-center sm:justify-between\">\n              <div className=\"text-muted-foreground flex items-center gap-2 text-xs\">\n                <span className=\"bg-success size-2 rounded-full\" />\n                {isDraftSaved ? (\n                  <span className=\"text-success font-medium\">Draft saved successfully!</span>\n                ) : (\n                  <span>Draft auto-saved 2 mins ago · rev 3</span>\n                )}\n              </div>\n\n              <div className=\"flex w-full flex-wrap items-center gap-2.5 sm:w-auto\">\n                <Button\n                  variant=\"outline\"\n                  size=\"sm\"\n                  className=\"flex-1 sm:flex-initial\"\n                  disabled={isSubmitted}\n                  onClick={handleSaveDraft}\n                >\n                  <Save className=\"size-3.5\" aria-hidden=\"true\" />\n                  Save Draft\n                </Button>\n                <Button\n                  variant=\"default\"\n                  size=\"sm\"\n                  className=\"flex-1 sm:flex-initial\"\n                  disabled={!file || isSubmitted}\n                  onClick={handleSubmit}\n                >\n                  <Send className=\"size-3.5\" aria-hidden=\"true\" />\n                  Submit Assignment\n                </Button>\n              </div>\n            </CardFooter>\n          </Card>\n        </div>\n\n        {/* Right Column: Grading Rubric & Assessment Criteria */}\n        <div className=\"space-y-6 lg:col-span-5 xl:col-span-5\">\n          <Card className=\"shadow-xs\">\n            <CardHeader>\n              <div className=\"flex items-center justify-between\">\n                <div className=\"space-y-1\">\n                  <CardTitle className=\"flex items-center gap-2 text-lg font-semibold\">\n                    <BookOpen className=\"text-primary size-5\" aria-hidden=\"true\" />\n                    Grading Rubric\n                  </CardTitle>\n                  <CardDescription>100 Points Total · Evaluated against course criteria</CardDescription>\n                </div>\n                <Badge wrap variant=\"outline\" className=\"font-mono text-xs\">\n                  Pass: 70 pts\n                </Badge>\n              </div>\n            </CardHeader>\n\n            <CardContent className=\"space-y-5\">\n              {/* Rubric Categories */}\n              {defaultRubricCategories.map((category, index) => (\n                <div key={category.id} className=\"space-y-3\">\n                  {/* Category Header */}\n                  <div className=\"space-y-1.5\">\n                    <div className=\"flex items-center justify-between\">\n                      <h4 className=\"text-foreground text-sm font-medium\">{category.title}</h4>\n                      <Badge wrap variant=\"secondary\" className=\"font-mono text-xs\">\n                        {category.points} pts ({category.percentage}%)\n                      </Badge>\n                    </div>\n                    <Progress value={category.percentage} className=\"h-1.5\" />\n                  </div>\n\n                  {/* Specific Sub-criteria */}\n                  <ul className=\"border-border/60 bg-muted/20 space-y-2 rounded-lg border p-2.5 text-xs\">\n                    {category.criteria.map((criterion, cIndex) => (\n                      <li key={cIndex} className=\"flex items-start justify-between gap-2\">\n                        <div className=\"flex min-w-0 items-start gap-1.5\">\n                          <span className=\"text-primary font-bold\">·</span>\n                          <span className=\"text-muted-foreground\">{criterion.label}</span>\n                        </div>\n                        <span className=\"text-foreground shrink-0 font-mono font-medium\">{criterion.points} pts</span>\n                      </li>\n                    ))}\n                  </ul>\n\n                  {index < defaultRubricCategories.length - 1 && <Separator className=\"mt-4\" />}\n                </div>\n              ))}\n            </CardContent>\n\n            <CardFooter className=\"border-border bg-muted/30 text-muted-foreground flex flex-col gap-2 rounded-b-xl border-t p-4 text-xs\">\n              <div className=\"flex items-start gap-2\">\n                <Info className=\"text-muted-foreground mt-0.5 size-4 shrink-0\" aria-hidden=\"true\" />\n                <p>\n                  <strong className=\"text-foreground font-medium\">Late Submission Policy:</strong> Deductions of 5%\n                  apply per 24 hours delayed up to a maximum 48-hour grace period.\n                </p>\n              </div>\n            </CardFooter>\n          </Card>\n        </div>\n      </div>\n    </div>\n  )\n}\n\nexport default AssignmentSubmissionDropzone\n",
      "type": "registry:block",
      "target": "~/components/blocks/AssignmentSubmissionDropzone.tsx"
    }
  ],
  "dependencies": [
    "lucide-react"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/react/badge.json",
    "https://uipkge.dev/r/react/button.json",
    "https://uipkge.dev/r/react/card.json",
    "https://uipkge.dev/r/react/progress.json",
    "https://uipkge.dev/r/react/separator.json",
    "https://uipkge.dev/r/react/textarea.json"
  ],
  "description": "University coursework submission portal with plagiarism check indicator, grading rubric, and deadline timer.",
  "categories": [
    "education",
    "app",
    "forms",
    "dashboard"
  ]
}