{
  "$schema": "https://shadcn-vue.com/schema/registry-item.json",
  "name": "assignment-submission-dropzone",
  "title": "Assignment Submission Dropzone",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-vue/blocks/assignment-submission-dropzone/AssignmentSubmissionDropzone.vue",
      "content": "<script setup lang=\"ts\">\nimport type { HTMLAttributes } from 'vue'\nimport { computed, ref } from 'vue'\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-vue-next'\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\ninterface Props {\n  initialFile?: AttachedFile | null\n  initialNotes?: string\n  initialSubmitted?: boolean\n  class?: HTMLAttributes['class']\n}\n\nconst props = withDefaults(defineProps<Props>(), {\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:\n    '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})\n\nconst file = ref<AttachedFile | null>(props.initialFile)\nconst notes = ref(props.initialNotes)\nconst isSubmitted = ref(props.initialSubmitted)\nconst isDraftSaved = ref(false)\nconst isDragging = ref(false)\nconst fileInputRef = ref<HTMLInputElement | null>(null)\n\nconst rubricCategories: 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\nconst isCleanSimilarity = computed(() => {\n  if (!file.value) return true\n  return file.value.similarity < 10\n})\n\nfunction triggerBrowse() {\n  fileInputRef.value?.click()\n}\n\nfunction handleFileInput(e: Event) {\n  const target = e.target as HTMLInputElement\n  if (target.files && target.files.length > 0) {\n    const f = target.files[0]\n    file.value = {\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\nfunction handleDrop(e: DragEvent) {\n  isDragging.value = false\n  if (e.dataTransfer?.files && e.dataTransfer.files.length > 0) {\n    const f = e.dataTransfer.files[0]\n    file.value = {\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\nfunction removeFile() {\n  file.value = null\n}\n\nfunction restoreSampleFile() {\n  file.value = {\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\nfunction handleSaveDraft() {\n  isDraftSaved.value = true\n  setTimeout(() => {\n    isDraftSaved.value = false\n  }, 3000)\n}\n\nfunction handleSubmit() {\n  if (!file.value) return\n  isSubmitted.value = true\n}\n\nfunction handleResetSubmission() {\n  isSubmitted.value = false\n}\n</script>\n\n<template>\n  <div data-slot=\"assignment-submission-dropzone\" :class=\"cn('space-y-6', props.class)\">\n    <!-- Assignment Header Card -->\n    <Card class=\"shadow-xs\">\n      <CardContent class=\"p-6\">\n        <div class=\"flex flex-col gap-6 lg:flex-row lg:items-center lg:justify-between\">\n          <div class=\"space-y-2\">\n            <div class=\"flex flex-wrap items-center gap-2\">\n              <Badge wrap variant=\"outline\" class=\"gap-1.5 font-medium\">\n                <GraduationCap class=\"text-primary size-3.5\" aria-hidden=\"true\" />\n                CS 401 · Advanced Distributed Systems\n              </Badge>\n              <Badge wrap variant=\"secondary\" class=\"gap-1 text-xs\">\n                <Award class=\"text-muted-foreground size-3\" aria-hidden=\"true\" />\n                100 Points Possible\n              </Badge>\n            </div>\n\n            <h1 class=\"text-foreground text-xl font-semibold tracking-tight sm:text-2xl\">\n              Final Project: Distributed Microservices Architecture\n            </h1>\n\n            <p class=\"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 class=\"flex flex-col items-start gap-3 sm:flex-row sm:items-center lg:flex-col lg:items-end\">\n            <Badge wrap variant=\"warning\" class=\"gap-1.5 px-3 py-1 text-xs font-medium\">\n              <Clock class=\"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 class=\"border-border bg-muted/40 flex items-center gap-2 rounded-lg border px-3 py-1.5 shadow-xs\">\n              <Timer class=\"text-muted-foreground size-4 shrink-0\" aria-hidden=\"true\" />\n              <div class=\"flex items-center gap-1.5 text-xs font-medium\">\n                <div class=\"flex items-baseline gap-0.5\">\n                  <span class=\"text-foreground font-semibold\">04</span>\n                  <span class=\"text-muted-foreground text-xs\">d</span>\n                </div>\n                <span class=\"text-muted-foreground\">:</span>\n                <div class=\"flex items-baseline gap-0.5\">\n                  <span class=\"text-foreground font-semibold\">07</span>\n                  <span class=\"text-muted-foreground text-xs\">h</span>\n                </div>\n                <span class=\"text-muted-foreground\">:</span>\n                <div class=\"flex items-baseline gap-0.5\">\n                  <span class=\"text-foreground font-semibold\">32</span>\n                  <span class=\"text-muted-foreground text-xs\">m</span>\n                </div>\n                <span class=\"text-muted-foreground\">:</span>\n                <div class=\"flex items-baseline gap-0.5\">\n                  <span class=\"text-foreground font-semibold\">15</span>\n                  <span class=\"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    <div\n      v-if=\"isSubmitted\"\n      class=\"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 class=\"flex items-start gap-3\">\n        <div class=\"bg-success/20 text-success flex size-9 shrink-0 items-center justify-center rounded-full\">\n          <CheckCircle2 class=\"size-5\" aria-hidden=\"true\" />\n        </div>\n        <div class=\"space-y-1\">\n          <div class=\"flex flex-wrap items-center gap-2\">\n            <h2 class=\"text-base font-semibold\">Coursework Submitted Successfully</h2>\n            <Badge wrap variant=\"success\" class=\"text-xs\">Receipt #SUB-CS401-2026-98124</Badge>\n          </div>\n          <p class=\"text-muted-foreground text-xs sm:text-sm\">\n            Submission timestamp: August 24, 2026 at 14:25 PST · Hash:\n            <code class=\"font-mono text-xs\">sha256:4a8b...7f12</code>\n          </p>\n        </div>\n      </div>\n      <div class=\"flex items-center gap-2\">\n        <Button variant=\"outline\" size=\"sm\" @click=\"handleResetSubmission\">\n          <RotateCcw class=\"size-3.5\" aria-hidden=\"true\" />\n          Edit Submission\n        </Button>\n      </div>\n    </div>\n\n    <!-- 2-Column Submission Layout -->\n    <div class=\"grid grid-cols-1 gap-6 lg:grid-cols-12\">\n      <!-- Left Column: Submission & Dropzone Form -->\n      <div class=\"space-y-6 lg:col-span-7 xl:col-span-7\">\n        <Card class=\"shadow-xs\">\n          <CardHeader>\n            <div class=\"flex items-center justify-between\">\n              <div class=\"space-y-1\">\n                <CardTitle class=\"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\" class=\"text-xs\">Attempt 1 of 3</Badge>\n            </div>\n          </CardHeader>\n\n          <CardContent class=\"space-y-5\">\n            <!-- Submission Instructions & Constraints -->\n            <div class=\"border-border bg-muted/40 flex items-start gap-3 rounded-lg border p-3.5 text-xs shadow-xs\">\n              <Info class=\"text-primary mt-0.5 size-4 shrink-0\" aria-hidden=\"true\" />\n              <div class=\"space-y-0.5\">\n                <p class=\"text-foreground font-medium\">Accepted formats: PDF, ZIP, TAR.GZ · Max file size: 50 MB</p>\n                <p class=\"text-muted-foreground\">\n                  Ensure all Docker Compose manifests, benchmarking scripts, and unit tests are included in the archive\n                  root.\n                </p>\n              </div>\n            </div>\n\n            <!-- File Dropzone -->\n            <div>\n              <input\n                ref=\"fileInputRef\"\n                type=\"file\"\n                class=\"hidden\"\n                accept=\".zip,.tar.gz,.tar,.pdf\"\n                @change=\"handleFileInput\"\n              />\n\n              <div\n                class=\"group relative flex flex-col items-center justify-center rounded-xl border-2 border-dashed p-8 text-center transition-colors duration-200\"\n                :class=\"[\n                  isDragging\n                    ? 'border-primary bg-primary/5'\n                    : 'border-border bg-muted/10 hover:border-primary/50 hover:bg-muted/20',\n                ]\"\n                @dragover.prevent=\"isDragging = true\"\n                @dragleave.prevent=\"isDragging = false\"\n                @drop.prevent=\"handleDrop\"\n              >\n                <div\n                  class=\"bg-primary/10 text-primary flex size-12 items-center justify-center rounded-full transition-transform duration-200 group-hover:scale-105\"\n                >\n                  <UploadCloud class=\"size-6\" aria-hidden=\"true\" />\n                </div>\n\n                <div class=\"mt-3 space-y-1\">\n                  <p class=\"text-foreground text-sm font-medium\">Drag and drop your project archive here</p>\n                  <p class=\"text-muted-foreground text-xs\">or select a file directly from your local filesystem</p>\n                </div>\n\n                <div class=\"mt-4 flex items-center gap-2\">\n                  <Button variant=\"outline\" size=\"sm\" type=\"button\" @click=\"triggerBrowse\"> Browse files </Button>\n                </div>\n\n                <div class=\"text-muted-foreground mt-4 flex items-center gap-1.5 text-xs\">\n                  <span class=\"border-border bg-muted rounded px-1.5 py-0.5 font-mono text-xs\">.zip</span>\n                  <span class=\"border-border bg-muted rounded px-1.5 py-0.5 font-mono text-xs\">.tar.gz</span>\n                  <span class=\"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 class=\"space-y-2\">\n              <div class=\"flex items-center justify-between\">\n                <span class=\"text-foreground text-xs font-semibold tracking-wider uppercase\">\n                  Attached Files ({{ file ? '1' : '0' }} / 1)\n                </span>\n                <span v-if=\"!file\" class=\"text-muted-foreground text-xs\">No file attached</span>\n              </div>\n\n              <!-- File Item Card -->\n              <div\n                v-if=\"file\"\n                class=\"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              >\n                <div class=\"flex min-w-0 items-center gap-3\">\n                  <div class=\"bg-primary/10 text-primary flex size-10 shrink-0 items-center justify-center rounded-md\">\n                    <FileArchive class=\"size-5\" aria-hidden=\"true\" />\n                  </div>\n                  <div class=\"min-w-0 space-y-0.5\">\n                    <p class=\"text-foreground truncate text-sm font-medium\">\n                      {{ file.name }}\n                    </p>\n                    <p class=\"text-muted-foreground text-xs\">{{ file.size }} · {{ file.uploadedAt }}</p>\n                  </div>\n                </div>\n\n                <div class=\"flex items-center gap-2 self-end sm:self-center\">\n                  <Badge wrap variant=\"secondary\" class=\"text-xs\">\n                    {{ file.size }}\n                  </Badge>\n                  <Badge wrap variant=\"outline\" class=\"border-success/30 text-success text-xs font-medium\">\n                    {{ file.status }}\n                  </Badge>\n                  <Button\n                    variant=\"ghost\"\n                    size=\"icon-sm\"\n                    class=\"text-muted-foreground hover:text-destructive\"\n                    title=\"Remove file\"\n                    aria-label=\"Remove attached file\"\n                    @click=\"removeFile\"\n                  >\n                    <Trash2 class=\"size-4\" aria-hidden=\"true\" />\n                  </Button>\n                </div>\n              </div>\n\n              <!-- Re-add sample file helper when cleared -->\n              <div\n                v-else\n                class=\"border-border bg-muted/20 flex items-center justify-between rounded-lg border border-dashed p-3 text-xs\"\n              >\n                <span class=\"text-muted-foreground\">Sample archive cleared.</span>\n                <Button variant=\"ghost\" size=\"xs\" class=\"text-primary text-xs\" @click=\"restoreSampleFile\">\n                  Restore default file\n                </Button>\n              </div>\n            </div>\n\n            <!-- Plagiarism & Similarity Pre-scan Indicator -->\n            <div\n              v-if=\"file\"\n              :class=\"[\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 class=\"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between\">\n                <div class=\"flex items-center gap-2\">\n                  <ShieldCheck v-if=\"isCleanSimilarity\" class=\"text-success size-5 shrink-0\" aria-hidden=\"true\" />\n                  <ShieldAlert v-else class=\"text-warning size-5 shrink-0\" aria-hidden=\"true\" />\n                  <div>\n                    <h3 class=\"text-foreground text-sm font-semibold\">Academic Integrity & Plagiarism Pre-Scan</h3>\n                    <p class=\"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                  :variant=\"isCleanSimilarity ? 'success' : 'warning'\"\n                  class=\"gap-1 self-start text-xs font-medium whitespace-normal sm:self-auto\"\n                >\n                  <ShieldCheck class=\"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 class=\"space-y-1.5 pt-1\">\n                <div class=\"flex items-center justify-between text-xs\">\n                  <span class=\"text-muted-foreground\">Overall similarity index</span>\n                  <span class=\"text-foreground font-mono font-medium\"\n                    >{{ file.similarity }}% (Max threshold: 15.0%)</span\n                  >\n                </div>\n                <Progress :model-value=\"file.similarity * 6.66\" class=\"h-1.5\" />\n              </div>\n\n              <!-- Integrity breakdown chips -->\n              <div class=\"grid grid-cols-1 gap-2 pt-1 text-xs sm:grid-cols-3\">\n                <div class=\"border-border/60 bg-card/60 rounded border p-2\">\n                  <span class=\"text-muted-foreground block text-xs\">Internet Sources</span>\n                  <span class=\"text-foreground font-medium\">0.0% match</span>\n                </div>\n                <div class=\"border-border/60 bg-card/60 rounded border p-2\">\n                  <span class=\"text-muted-foreground block text-xs\">Peer Submissions</span>\n                  <span class=\"text-foreground font-medium\">0.0% match</span>\n                </div>\n                <div class=\"border-border/60 bg-card/60 rounded border p-2\">\n                  <span class=\"text-muted-foreground block text-xs\">Standard Boilerplate</span>\n                  <span class=\"text-foreground font-medium\">{{ file.similarity }}% (Apache 2.0)</span>\n                </div>\n              </div>\n            </div>\n\n            <!-- Student Submission Notes Textarea -->\n            <div class=\"space-y-2\">\n              <label for=\"submission-notes\" class=\"text-foreground text-sm font-medium\">\n                Student Submission Notes & Execution Instructions\n              </label>\n              <Textarea\n                id=\"submission-notes\"\n                v-model=\"notes\"\n                :rows=\"3\"\n                placeholder=\"Included benchmark logs in the /docs folder...\"\n                class=\"text-sm\"\n              />\n              <p class=\"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\n            class=\"border-border flex flex-col gap-3 border-t pt-4 sm:flex-row sm:items-center sm:justify-between\"\n          >\n            <div class=\"text-muted-foreground flex items-center gap-2 text-xs\">\n              <span class=\"bg-success size-2 rounded-full\" />\n              <span v-if=\"isDraftSaved\" class=\"text-success font-medium\">Draft saved successfully!</span>\n              <span v-else>Draft auto-saved 2 mins ago · rev 3</span>\n            </div>\n\n            <div class=\"flex w-full flex-wrap items-center gap-2.5 sm:w-auto\">\n              <Button\n                variant=\"outline\"\n                size=\"sm\"\n                class=\"flex-1 sm:flex-initial\"\n                :disabled=\"isSubmitted\"\n                @click=\"handleSaveDraft\"\n              >\n                <Save class=\"size-3.5\" aria-hidden=\"true\" />\n                Save Draft\n              </Button>\n              <Button\n                variant=\"default\"\n                size=\"sm\"\n                class=\"flex-1 sm:flex-initial\"\n                :disabled=\"!file || isSubmitted\"\n                @click=\"handleSubmit\"\n              >\n                <Send class=\"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 class=\"space-y-6 lg:col-span-5 xl:col-span-5\">\n        <Card class=\"shadow-xs\">\n          <CardHeader>\n            <div class=\"flex items-center justify-between\">\n              <div class=\"space-y-1\">\n                <CardTitle class=\"flex items-center gap-2 text-lg font-semibold\">\n                  <BookOpen class=\"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\" class=\"font-mono text-xs\"> Pass: 70 pts </Badge>\n            </div>\n          </CardHeader>\n\n          <CardContent class=\"space-y-5\">\n            <!-- Rubric Categories -->\n            <div v-for=\"(category, index) in rubricCategories\" :key=\"category.id\" class=\"space-y-3\">\n              <!-- Category Header -->\n              <div class=\"space-y-1.5\">\n                <div class=\"flex items-center justify-between\">\n                  <h4 class=\"text-foreground text-sm font-medium\">\n                    {{ category.title }}\n                  </h4>\n                  <Badge wrap variant=\"secondary\" class=\"font-mono text-xs\">\n                    {{ category.points }} pts ({{ category.percentage }}%)\n                  </Badge>\n                </div>\n                <Progress :model-value=\"category.percentage\" class=\"h-1.5\" />\n              </div>\n\n              <!-- Specific Sub-criteria -->\n              <ul class=\"border-border/60 bg-muted/20 space-y-2 rounded-lg border p-2.5 text-xs\">\n                <li\n                  v-for=\"(criterion, cIndex) in category.criteria\"\n                  :key=\"cIndex\"\n                  class=\"flex items-start justify-between gap-2\"\n                >\n                  <div class=\"flex min-w-0 items-start gap-1.5\">\n                    <span class=\"text-primary font-bold\">·</span>\n                    <span class=\"text-muted-foreground\">{{ criterion.label }}</span>\n                  </div>\n                  <span class=\"text-foreground shrink-0 font-mono font-medium\"> {{ criterion.points }} pts </span>\n                </li>\n              </ul>\n\n              <Separator v-if=\"index < rubricCategories.length - 1\" class=\"mt-4\" />\n            </div>\n          </CardContent>\n\n          <CardFooter\n            class=\"border-border bg-muted/30 text-muted-foreground flex flex-col gap-2 rounded-b-xl border-t p-4 text-xs\"\n          >\n            <div class=\"flex items-start gap-2\">\n              <Info class=\"text-muted-foreground mt-0.5 size-4 shrink-0\" aria-hidden=\"true\" />\n              <p>\n                <strong class=\"text-foreground font-medium\">Late Submission Policy:</strong> Deductions of 5% apply per\n                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</template>\n",
      "type": "registry:block",
      "target": "~/app/components/blocks/AssignmentSubmissionDropzone.vue"
    }
  ],
  "dependencies": [
    "lucide-vue-next"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/vue/badge.json",
    "https://uipkge.dev/r/vue/button.json",
    "https://uipkge.dev/r/vue/card.json",
    "https://uipkge.dev/r/vue/progress.json",
    "https://uipkge.dev/r/vue/separator.json",
    "https://uipkge.dev/r/vue/textarea.json"
  ],
  "description": "University coursework submission portal with plagiarism check indicator, grading rubric, and deadline timer.",
  "categories": [
    "education",
    "app",
    "forms",
    "dashboard"
  ]
}