[{"data":1,"prerenderedAt":1153},["ShallowReactive",2],{"repo-tree":3,"repo-\u002Fapps\u002Fportal\u002Fapp\u002Fcomposables\u002Ffiles\u002Freadme":283},[4,7,10,13,16,19,22,25,28,31,34,37,40,43,46,49,52,55,58,61,64,67,69,72,75,78,81,84,86,88,90,93,96,99,102,105,108,111,114,117,120,123,125,127,129,131,133,135,138,141,143,146,149,152,155,158,161,164,167,169,172,175,178,180,183,186,189,192,195,198,201,203,206,209,212,215,218,221,224,227,230,233,236,239,242,245,248,251,254,257,260,263,266,269,272,275,278,281],{"path":5,"title":6},"\u002Fagents\u002Fbackend-code-style","Backend Conventions",{"path":8,"title":9},"\u002Fagents\u002Fdatabase","Database",{"path":11,"title":12},"\u002Fagents\u002Fportal-code-style","Portal Conventions",{"path":14,"title":15},"\u002Fagents\u002Ftranslation","Translation",{"path":17,"title":18},"\u002Fconventions\u002Fbackend-coding","Backend coding conventions",{"path":20,"title":21},"\u002Fconventions\u002Ffrontend-coding","Frontend coding conventions",{"path":23,"title":24},"\u002Fdevelopment-process","Development process",{"path":26,"title":27},"\u002Flearning-api-preview-hetzner-setup","Learning API Preview on Hetzner + Cloudflare",{"path":29,"title":30},"\u002Flearning-api-preview-vm-plan","Learning API Preview VM Plan",{"path":32,"title":33},"\u002Fmonorepo-structure","Monorepo structure",{"path":35,"title":36},"\u002Foperations","Operations — bugs and support",{"path":38,"title":39},"\u002Fpostmortems\u002F2026-03-16_onboarding-currency-regression","Onboarding Zod transform silently broken — web signups assigned wrong checkout currency",{"path":41,"title":42},"\u002Fpostmortems\u002Freadme","Postmortems",{"path":44,"title":45},"\u002Fpostmortems\u002F_template","TEMPLATE",{"path":47,"title":48},"\u002Fpostmortems\u002Fposthog-comparison","Postmortem practice — comparison with PostHog",{"path":50,"title":51},"\u002Fpreview-environment-plan","Preview Environment Plan",{"path":53,"title":54},"\u002Fprinciples","Engineering principles",{"path":56,"title":57},"\u002Fworking-with-ai","Working with AI",{"path":59,"title":60},"\u002F.claude\u002Fskills\u002Feval-playground\u002Fskill","Eval Playground — Co-development Skill",{"path":62,"title":63},"\u002F.claude\u002Fskills\u002Ffigma-diff-section\u002Fskill","Figma Diff Section Pipeline",{"path":65,"title":66},"\u002Fagents","AGENTS.md",{"path":68,"title":66},"\u002Fclaude",{"path":70,"title":71},"\u002Freadme","Studyflash",{"path":73,"title":74},"\u002Fapps\u002Fcore-api\u002Fagents","Core API (apps\u002Fcore-api)",{"path":76,"title":77},"\u002Fapps\u002Fcore-api\u002Freadme","README",{"path":79,"title":80},"\u002Fapps\u002Femail-previews\u002Fagents","Email Previews (apps\u002Femail-previews)",{"path":82,"title":83},"\u002Fapps\u002Flanding-page\u002Fagents","Landing Page (apps\u002Flanding-page)",{"path":85,"title":83},"\u002Fapps\u002Flanding-page\u002Fclaude",{"path":87,"title":66},"\u002Fapps\u002Flearning-api\u002Fagents",{"path":89,"title":77},"\u002Fapps\u002Flearning-api\u002Freadme",{"path":91,"title":92},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Feval_metrics_design","Surface-Specific Eval Metrics Design",{"path":94,"title":95},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Ftest_set","Quiz Eval Test Set",{"path":97,"title":98},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Ffrontend\u002Freadme","React + TypeScript + Vite",{"path":100,"title":101},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Fknown-issues\u002Fcontent-pillar-shallow-coverage\u002Freadme","Content pillar misses subtopics in dense documents",{"path":103,"title":104},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Fknown-issues\u002Fdocling-empty-section-headers\u002Freadme","Empty section headers dropped by docling chunker",{"path":106,"title":107},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Fknown-issues\u002Fdocling-table-reading-order\u002Freadme","Table\u002Fbox layout causes wrong reading order",{"path":109,"title":110},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Fmetrics\u002Freadme","Quiz eval metrics — canonical rubrics",{"path":112,"title":113},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Freports\u002F2026-04-12-quiz-summary-feedback-current-state","Quiz and Summary Feedback Current State",{"path":115,"title":116},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Freports\u002F2026-04-24-quiz-eval-metrics","Quiz Evaluation Metrics",{"path":118,"title":119},"\u002Fapps\u002Flearning-api\u002Fevals-playground\u002Freports\u002F2026-05-01-quiz-eval-current-state","Quiz Eval Current State",{"path":121,"title":122},"\u002Fapps\u002Flearning-api\u002Fmonitoring\u002Freadme","Monitoring Stack",{"path":124,"title":77},"\u002Fapps\u002Flearning-api\u002Fshared\u002Freadme",{"path":126,"title":77},"\u002Fapps\u002Flearning-api\u002Fworkers\u002Flearning_agents\u002Fflashcard_agent\u002Freadme",{"path":128,"title":77},"\u002Fapps\u002Flearning-api\u002Fworkers\u002Flearning_agents\u002Fingestion_agent\u002Freadme",{"path":130,"title":77},"\u002Fapps\u002Flearning-api\u002Fworkers\u002Flearning_agents\u002Fquiz_agent\u002Freadme",{"path":132,"title":77},"\u002Fapps\u002Flearning-api\u002Fworkers\u002Flearning_agents\u002Fsummary_agent\u002Freadme",{"path":134,"title":77},"\u002Fapps\u002Flearning-api\u002Fworkers\u002Fparser\u002Freadme",{"path":136,"title":137},"\u002Fapps\u002Fmarketing-emails-preview\u002Fagents","Marketing Emails Preview (apps\u002Fmarketing-emails-preview)",{"path":139,"title":140},"\u002Fapps\u002Fmobile-app\u002Fagents","StudyFlash Mobile App - Claude Code Configuration",{"path":142,"title":140},"\u002Fapps\u002Fmobile-app\u002Fclaude",{"path":144,"title":145},"\u002Fapps\u002Fmountain-max\u002Fagents","Mountain Max (apps\u002Fmountain-max)",{"path":147,"title":148},"\u002Fapps\u002Fmountain-max\u002Fgame\u002Freadme","Mountain Max Game",{"path":150,"title":151},"\u002Fapps\u002Fportal\u002Fagents","Portal (apps\u002Fportal)",{"path":153,"title":154},"\u002Fapps\u002Fportal\u002Freadme","Nuxt Minimal Starter",{"path":156,"title":157},"\u002Fapps\u002Fportal\u002Fapp\u002Fcomposables\u002Ffiles\u002Freadme","File Upload Composables",{"path":159,"title":160},"\u002Fapps\u002Fportal\u002Fdocs\u002Flibrary-routing","Library Routing Documentation",{"path":162,"title":163},"\u002Fapps\u002Fsupabase\u002Fagents","Supabase (apps\u002Fsupabase)",{"path":165,"title":166},"\u002Fapps\u002Fwrapped\u002Fagents","Wrapped (apps\u002Fwrapped)",{"path":168,"title":98},"\u002Fapps\u002Fwrapped\u002Freadme",{"path":170,"title":171},"\u002Finfra\u002Freadme","infra\u002F",{"path":173,"title":174},"\u002Finfra\u002Fdns\u002Freadme","DNS Infrastructure",{"path":176,"title":177},"\u002Finfra\u002Fdokploy\u002Freadme","studyflash-dokploy",{"path":179,"title":77},"\u002Finfra\u002Fdokploy\u002Fsdk\u002Fnodejs\u002Freadme",{"path":181,"title":182},"\u002Finfra\u002Finfisical\u002Freadme","Infisical Infrastructure",{"path":184,"title":185},"\u002Finfra\u002Flearning-api\u002Freadme","Pulumi GCP TypeScript Template",{"path":187,"title":188},"\u002Finfra\u002Fopenreplay\u002Freadme","OpenReplay on Hetzner",{"path":190,"title":191},"\u002Finfra\u002Fscripts\u002Freadme","infra\u002Fscripts\u002F",{"path":193,"title":194},"\u002Finfra\u002Fturborepo-cache\u002Freadme","Turborepo Remote Cache Infrastructure",{"path":196,"title":197},"\u002Finternal\u002Fchatwoot\u002Freadme","Chatwoot Infrastructure",{"path":199,"title":200},"\u002Finternal\u002Fchatwoot\u002Fprovider\u002Freadme","studyflash-chatwoot-provider",{"path":202,"title":77},"\u002Finternal\u002Fchatwoot\u002Fprovider\u002Fsdk\u002Fnodejs\u002Freadme",{"path":204,"title":205},"\u002Finternal\u002Fdocs\u002Freadme","internal\u002Fdocs",{"path":207,"title":208},"\u002Finternal\u002Fsupport-bot\u002Fclaude","Support Bot (Maximilian)",{"path":210,"title":211},"\u002Finternal\u002Fsupport-bot\u002Freadme","Studyflash Customer Support Bot (Maximilian)",{"path":213,"title":214},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Faccount_issues","Account Issues",{"path":216,"title":217},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fbilling_invoice","Billing Invoice",{"path":219,"title":220},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fcontent_upload","Content Upload",{"path":222,"title":223},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fdata_loss","Data Loss",{"path":225,"title":226},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fflashcard_issues","Flashcard Issues",{"path":228,"title":229},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fgarbage","Garbage",{"path":231,"title":232},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fgeneral_how_to","General How To",{"path":234,"title":235},"\u002Finternal\u002Fsupport-bot\u002Fkb","Knowledge Base Index",{"path":237,"title":238},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Flanguage_issues","Language Issues",{"path":240,"title":241},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fmindmap_issues","Mindmap Issues",{"path":243,"title":244},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fmisunderstanding","Misunderstanding",{"path":246,"title":247},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fmock_exam_issues","Mock Exam Issues",{"path":249,"title":250},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fpodcast_issues","Podcast Issues",{"path":252,"title":253},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fquiz_issues","Quiz Issues",{"path":255,"title":256},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Frefund_request","Refund Request",{"path":258,"title":259},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fsubscription_cancellation","Subscription Cancellation",{"path":261,"title":262},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fsubscription_info","Subscription Info",{"path":264,"title":265},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fsummary_issues","Summary Issues",{"path":267,"title":268},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Ftechnical_errors","Technical Errors",{"path":270,"title":271},"\u002Finternal\u002Fsupport-bot\u002Fkb\u002Fvideo_issues","Video Issues",{"path":273,"title":274},"\u002Fpackages\u002Fcommon\u002Fdocs\u002Fearly-access-features","Declarative Early Access Features",{"path":276,"title":277},"\u002Fpackages\u002Fcommon\u002Fscripts\u002Freadme","Common Package Scripts",{"path":279,"title":280},"\u002Fpackages\u002Fdevtools\u002Ffigma-plugins\u002Freadme","Figma plugins",{"path":282,"title":77},"\u002Fpackages\u002Fpulumi-infisical\u002Freadme",{"id":284,"title":157,"body":285,"description":295,"extension":1147,"lastReviewed":1148,"meta":1149,"navigation":364,"owner":1148,"path":156,"seo":1150,"status":1148,"stem":1151,"tags":1148,"__hash__":1152},"repo\u002Fapps\u002Fportal\u002Fapp\u002Fcomposables\u002Ffiles\u002FREADME.md",{"type":286,"value":287,"toc":1141},"minimark",[288,292,296,301,304,309,1028,1032,1038,1137],[289,290,157],"h1",{"id":291},"file-upload-composables",[293,294,295],"p",{},"This directory contains composables related to file handling and uploading.",[297,298,300],"h2",{"id":299},"usefiledropupload","useFileDropUpload",[293,302,303],{},"A composable that provides file drop and upload functionality with progress tracking, error handling, and file validation.",[305,306,308],"h3",{"id":307},"usage","Usage",[310,311,316],"pre",{"className":312,"code":313,"language":314,"meta":315,"style":315},"language-vue shiki shiki-themes github-light github-dark","\u003Cscript setup>\nimport { useFileDropUpload } from '~\u002Fcomposables\u002Ffiles\u002FuseFileDropUpload';\n\nconst {\n  \u002F\u002F Refs\n  selectedFile, \u002F\u002F The currently selected file (File | null)\n  isUploading, \u002F\u002F Whether an upload is in progress (boolean)\n  uploadProgress, \u002F\u002F Upload progress percentage (number 0-100)\n  uploadError, \u002F\u002F Error message if upload failed (string | null)\n  fileInputRef, \u002F\u002F Ref to file input element (must be passed to input element)\n  dropZoneRef, \u002F\u002F Ref to drop zone element (must be passed to container element)\n  isOverDropZone, \u002F\u002F Whether user is dragging a file over the drop zone (boolean)\n  uploadedFileUrl, \u002F\u002F URL of the successfully uploaded file (string | null)\n\n  \u002F\u002F Methods\n  resetUploadState, \u002F\u002F Reset all state variables\n  processFile, \u002F\u002F Process a file (validation)\n  handleUpload, \u002F\u002F Start the upload process\n  triggerFileInput, \u002F\u002F Trigger file input click\n  onFileSelect, \u002F\u002F Handle file selection from input\n  handleCancelUpload, \u002F\u002F Cancel ongoing upload\n  handleRetry, \u002F\u002F Retry a failed upload\n} = useFileDropUpload({\n  \u002F\u002F Options (all optional)\n  allowedTypes: [\n    \u002F\u002F Array of allowed MIME types\n    'application\u002Fpdf',\n    'application\u002Fvnd.openxmlformats-officedocument.wordprocessingml.document',\n  ],\n  bucketName: 'files', \u002F\u002F Storage bucket name\n  makePublic: false, \u002F\u002F Whether the uploaded file should be public\n  onUploadSuccess: (fileUrl) => {\n    \u002F\u002F Called when upload succeeds with the file URL\n    console.log('File uploaded:', fileUrl);\n  },\n});\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003C!-- Drop zone -->\n  \u003Cdiv\n    ref=\"dropZoneRef\"\n    :class=\"isOverDropZone ? 'border-blue-500 bg-blue-100' : 'border-gray-300 bg-gray-100'\"\n    class=\"rounded-lg border-2 border-dashed p-6 text-center\">\n    \u003Cp v-if=\"!selectedFile\">Drag and drop a file here, or\u003C\u002Fp>\n    \u003Cbutton @click=\"triggerFileInput\">Select a file\u003C\u002Fbutton>\n\n    \u003Cdiv v-if=\"isUploading\">\n      \u003Cp>Uploading: {{ uploadProgress }}%\u003C\u002Fp>\n      \u003Cbutton @click=\"handleCancelUpload\">Cancel\u003C\u002Fbutton>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv v-if=\"uploadError\">\n      \u003Cp>Error: {{ uploadError }}\u003C\u002Fp>\n      \u003Cbutton @click=\"handleRetry\">Retry\u003C\u002Fbutton>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- Hidden file input -->\n  \u003Cinput ref=\"fileInputRef\" type=\"file\" class=\"hidden\" @change=\"onFileSelect\" \u002F>\n\u003C\u002Ftemplate>\n","vue","",[317,318,319,339,359,366,375,382,395,406,417,428,439,450,461,472,477,483,494,505,516,527,538,549,560,575,581,587,593,602,610,616,630,644,665,671,689,695,701,711,716,726,732,741,752,763,776,799,822,827,844,859,880,890,895,911,925,946,955,965,970,976,1019],"code",{"__ignoreMap":315},[320,321,324,328,332,336],"span",{"class":322,"line":323},"line",1,[320,325,327],{"class":326},"sVt8B","\u003C",[320,329,331],{"class":330},"s9eBZ","script",[320,333,335],{"class":334},"sScJk"," setup",[320,337,338],{"class":326},">\n",[320,340,342,346,349,352,356],{"class":322,"line":341},2,[320,343,345],{"class":344},"szBVR","import",[320,347,348],{"class":326}," { useFileDropUpload } ",[320,350,351],{"class":344},"from",[320,353,355],{"class":354},"sZZnC"," '~\u002Fcomposables\u002Ffiles\u002FuseFileDropUpload'",[320,357,358],{"class":326},";\n",[320,360,362],{"class":322,"line":361},3,[320,363,365],{"emptyLinePlaceholder":364},true,"\n",[320,367,369,372],{"class":322,"line":368},4,[320,370,371],{"class":344},"const",[320,373,374],{"class":326}," {\n",[320,376,378],{"class":322,"line":377},5,[320,379,381],{"class":380},"sJ8bj","  \u002F\u002F Refs\n",[320,383,385,389,392],{"class":322,"line":384},6,[320,386,388],{"class":387},"sj4cs","  selectedFile",[320,390,391],{"class":326},", ",[320,393,394],{"class":380},"\u002F\u002F The currently selected file (File | null)\n",[320,396,398,401,403],{"class":322,"line":397},7,[320,399,400],{"class":387},"  isUploading",[320,402,391],{"class":326},[320,404,405],{"class":380},"\u002F\u002F Whether an upload is in progress (boolean)\n",[320,407,409,412,414],{"class":322,"line":408},8,[320,410,411],{"class":387},"  uploadProgress",[320,413,391],{"class":326},[320,415,416],{"class":380},"\u002F\u002F Upload progress percentage (number 0-100)\n",[320,418,420,423,425],{"class":322,"line":419},9,[320,421,422],{"class":387},"  uploadError",[320,424,391],{"class":326},[320,426,427],{"class":380},"\u002F\u002F Error message if upload failed (string | null)\n",[320,429,431,434,436],{"class":322,"line":430},10,[320,432,433],{"class":387},"  fileInputRef",[320,435,391],{"class":326},[320,437,438],{"class":380},"\u002F\u002F Ref to file input element (must be passed to input element)\n",[320,440,442,445,447],{"class":322,"line":441},11,[320,443,444],{"class":387},"  dropZoneRef",[320,446,391],{"class":326},[320,448,449],{"class":380},"\u002F\u002F Ref to drop zone element (must be passed to container element)\n",[320,451,453,456,458],{"class":322,"line":452},12,[320,454,455],{"class":387},"  isOverDropZone",[320,457,391],{"class":326},[320,459,460],{"class":380},"\u002F\u002F Whether user is dragging a file over the drop zone (boolean)\n",[320,462,464,467,469],{"class":322,"line":463},13,[320,465,466],{"class":387},"  uploadedFileUrl",[320,468,391],{"class":326},[320,470,471],{"class":380},"\u002F\u002F URL of the successfully uploaded file (string | null)\n",[320,473,475],{"class":322,"line":474},14,[320,476,365],{"emptyLinePlaceholder":364},[320,478,480],{"class":322,"line":479},15,[320,481,482],{"class":380},"  \u002F\u002F Methods\n",[320,484,486,489,491],{"class":322,"line":485},16,[320,487,488],{"class":387},"  resetUploadState",[320,490,391],{"class":326},[320,492,493],{"class":380},"\u002F\u002F Reset all state variables\n",[320,495,497,500,502],{"class":322,"line":496},17,[320,498,499],{"class":387},"  processFile",[320,501,391],{"class":326},[320,503,504],{"class":380},"\u002F\u002F Process a file (validation)\n",[320,506,508,511,513],{"class":322,"line":507},18,[320,509,510],{"class":387},"  handleUpload",[320,512,391],{"class":326},[320,514,515],{"class":380},"\u002F\u002F Start the upload process\n",[320,517,519,522,524],{"class":322,"line":518},19,[320,520,521],{"class":387},"  triggerFileInput",[320,523,391],{"class":326},[320,525,526],{"class":380},"\u002F\u002F Trigger file input click\n",[320,528,530,533,535],{"class":322,"line":529},20,[320,531,532],{"class":387},"  onFileSelect",[320,534,391],{"class":326},[320,536,537],{"class":380},"\u002F\u002F Handle file selection from input\n",[320,539,541,544,546],{"class":322,"line":540},21,[320,542,543],{"class":387},"  handleCancelUpload",[320,545,391],{"class":326},[320,547,548],{"class":380},"\u002F\u002F Cancel ongoing upload\n",[320,550,552,555,557],{"class":322,"line":551},22,[320,553,554],{"class":387},"  handleRetry",[320,556,391],{"class":326},[320,558,559],{"class":380},"\u002F\u002F Retry a failed upload\n",[320,561,563,566,569,572],{"class":322,"line":562},23,[320,564,565],{"class":326},"} ",[320,567,568],{"class":344},"=",[320,570,571],{"class":334}," useFileDropUpload",[320,573,574],{"class":326},"({\n",[320,576,578],{"class":322,"line":577},24,[320,579,580],{"class":380},"  \u002F\u002F Options (all optional)\n",[320,582,584],{"class":322,"line":583},25,[320,585,586],{"class":326},"  allowedTypes: [\n",[320,588,590],{"class":322,"line":589},26,[320,591,592],{"class":380},"    \u002F\u002F Array of allowed MIME types\n",[320,594,596,599],{"class":322,"line":595},27,[320,597,598],{"class":354},"    'application\u002Fpdf'",[320,600,601],{"class":326},",\n",[320,603,605,608],{"class":322,"line":604},28,[320,606,607],{"class":354},"    'application\u002Fvnd.openxmlformats-officedocument.wordprocessingml.document'",[320,609,601],{"class":326},[320,611,613],{"class":322,"line":612},29,[320,614,615],{"class":326},"  ],\n",[320,617,619,622,625,627],{"class":322,"line":618},30,[320,620,621],{"class":326},"  bucketName: ",[320,623,624],{"class":354},"'files'",[320,626,391],{"class":326},[320,628,629],{"class":380},"\u002F\u002F Storage bucket name\n",[320,631,633,636,639,641],{"class":322,"line":632},31,[320,634,635],{"class":326},"  makePublic: ",[320,637,638],{"class":387},"false",[320,640,391],{"class":326},[320,642,643],{"class":380},"\u002F\u002F Whether the uploaded file should be public\n",[320,645,647,650,653,657,660,663],{"class":322,"line":646},32,[320,648,649],{"class":334},"  onUploadSuccess",[320,651,652],{"class":326},": (",[320,654,656],{"class":655},"s4XuR","fileUrl",[320,658,659],{"class":326},") ",[320,661,662],{"class":344},"=>",[320,664,374],{"class":326},[320,666,668],{"class":322,"line":667},33,[320,669,670],{"class":380},"    \u002F\u002F Called when upload succeeds with the file URL\n",[320,672,674,677,680,683,686],{"class":322,"line":673},34,[320,675,676],{"class":326},"    console.",[320,678,679],{"class":334},"log",[320,681,682],{"class":326},"(",[320,684,685],{"class":354},"'File uploaded:'",[320,687,688],{"class":326},", fileUrl);\n",[320,690,692],{"class":322,"line":691},35,[320,693,694],{"class":326},"  },\n",[320,696,698],{"class":322,"line":697},36,[320,699,700],{"class":326},"});\n",[320,702,704,707,709],{"class":322,"line":703},37,[320,705,706],{"class":326},"\u003C\u002F",[320,708,331],{"class":330},[320,710,338],{"class":326},[320,712,714],{"class":322,"line":713},38,[320,715,365],{"emptyLinePlaceholder":364},[320,717,719,721,724],{"class":322,"line":718},39,[320,720,327],{"class":326},[320,722,723],{"class":330},"template",[320,725,338],{"class":326},[320,727,729],{"class":322,"line":728},40,[320,730,731],{"class":380},"  \u003C!-- Drop zone -->\n",[320,733,735,738],{"class":322,"line":734},41,[320,736,737],{"class":326},"  \u003C",[320,739,740],{"class":330},"div\n",[320,742,744,747,749],{"class":322,"line":743},42,[320,745,746],{"class":334},"    ref",[320,748,568],{"class":326},[320,750,751],{"class":354},"\"dropZoneRef\"\n",[320,753,755,758,760],{"class":322,"line":754},43,[320,756,757],{"class":334},"    :class",[320,759,568],{"class":326},[320,761,762],{"class":354},"\"isOverDropZone ? 'border-blue-500 bg-blue-100' : 'border-gray-300 bg-gray-100'\"\n",[320,764,766,769,771,774],{"class":322,"line":765},44,[320,767,768],{"class":334},"    class",[320,770,568],{"class":326},[320,772,773],{"class":354},"\"rounded-lg border-2 border-dashed p-6 text-center\"",[320,775,338],{"class":326},[320,777,779,782,784,787,789,792,795,797],{"class":322,"line":778},45,[320,780,781],{"class":326},"    \u003C",[320,783,293],{"class":330},[320,785,786],{"class":334}," v-if",[320,788,568],{"class":326},[320,790,791],{"class":354},"\"!selectedFile\"",[320,793,794],{"class":326},">Drag and drop a file here, or\u003C\u002F",[320,796,293],{"class":330},[320,798,338],{"class":326},[320,800,802,804,807,810,812,815,818,820],{"class":322,"line":801},46,[320,803,781],{"class":326},[320,805,806],{"class":330},"button",[320,808,809],{"class":334}," @click",[320,811,568],{"class":326},[320,813,814],{"class":354},"\"triggerFileInput\"",[320,816,817],{"class":326},">Select a file\u003C\u002F",[320,819,806],{"class":330},[320,821,338],{"class":326},[320,823,825],{"class":322,"line":824},47,[320,826,365],{"emptyLinePlaceholder":364},[320,828,830,832,835,837,839,842],{"class":322,"line":829},48,[320,831,781],{"class":326},[320,833,834],{"class":330},"div",[320,836,786],{"class":334},[320,838,568],{"class":326},[320,840,841],{"class":354},"\"isUploading\"",[320,843,338],{"class":326},[320,845,847,850,852,855,857],{"class":322,"line":846},49,[320,848,849],{"class":326},"      \u003C",[320,851,293],{"class":330},[320,853,854],{"class":326},">Uploading: {{ uploadProgress }}%\u003C\u002F",[320,856,293],{"class":330},[320,858,338],{"class":326},[320,860,862,864,866,868,870,873,876,878],{"class":322,"line":861},50,[320,863,849],{"class":326},[320,865,806],{"class":330},[320,867,809],{"class":334},[320,869,568],{"class":326},[320,871,872],{"class":354},"\"handleCancelUpload\"",[320,874,875],{"class":326},">Cancel\u003C\u002F",[320,877,806],{"class":330},[320,879,338],{"class":326},[320,881,883,886,888],{"class":322,"line":882},51,[320,884,885],{"class":326},"    \u003C\u002F",[320,887,834],{"class":330},[320,889,338],{"class":326},[320,891,893],{"class":322,"line":892},52,[320,894,365],{"emptyLinePlaceholder":364},[320,896,898,900,902,904,906,909],{"class":322,"line":897},53,[320,899,781],{"class":326},[320,901,834],{"class":330},[320,903,786],{"class":334},[320,905,568],{"class":326},[320,907,908],{"class":354},"\"uploadError\"",[320,910,338],{"class":326},[320,912,914,916,918,921,923],{"class":322,"line":913},54,[320,915,849],{"class":326},[320,917,293],{"class":330},[320,919,920],{"class":326},">Error: {{ uploadError }}\u003C\u002F",[320,922,293],{"class":330},[320,924,338],{"class":326},[320,926,928,930,932,934,936,939,942,944],{"class":322,"line":927},55,[320,929,849],{"class":326},[320,931,806],{"class":330},[320,933,809],{"class":334},[320,935,568],{"class":326},[320,937,938],{"class":354},"\"handleRetry\"",[320,940,941],{"class":326},">Retry\u003C\u002F",[320,943,806],{"class":330},[320,945,338],{"class":326},[320,947,949,951,953],{"class":322,"line":948},56,[320,950,885],{"class":326},[320,952,834],{"class":330},[320,954,338],{"class":326},[320,956,958,961,963],{"class":322,"line":957},57,[320,959,960],{"class":326},"  \u003C\u002F",[320,962,834],{"class":330},[320,964,338],{"class":326},[320,966,968],{"class":322,"line":967},58,[320,969,365],{"emptyLinePlaceholder":364},[320,971,973],{"class":322,"line":972},59,[320,974,975],{"class":380},"  \u003C!-- Hidden file input -->\n",[320,977,979,981,984,987,989,992,995,997,1000,1003,1005,1008,1011,1013,1016],{"class":322,"line":978},60,[320,980,737],{"class":326},[320,982,983],{"class":330},"input",[320,985,986],{"class":334}," ref",[320,988,568],{"class":326},[320,990,991],{"class":354},"\"fileInputRef\"",[320,993,994],{"class":334}," type",[320,996,568],{"class":326},[320,998,999],{"class":354},"\"file\"",[320,1001,1002],{"class":334}," class",[320,1004,568],{"class":326},[320,1006,1007],{"class":354},"\"hidden\"",[320,1009,1010],{"class":334}," @change",[320,1012,568],{"class":326},[320,1014,1015],{"class":354},"\"onFileSelect\"",[320,1017,1018],{"class":326}," \u002F>\n",[320,1020,1022,1024,1026],{"class":322,"line":1021},61,[320,1023,706],{"class":326},[320,1025,723],{"class":330},[320,1027,338],{"class":326},[305,1029,1031],{"id":1030},"options","Options",[293,1033,1034,1035,1037],{},"The ",[317,1036,300],{}," composable accepts the following options:",[1039,1040,1041,1060],"table",{},[1042,1043,1044],"thead",{},[1045,1046,1047,1051,1054,1057],"tr",{},[1048,1049,1050],"th",{},"Option",[1048,1052,1053],{},"Type",[1048,1055,1056],{},"Default",[1048,1058,1059],{},"Description",[1061,1062,1063,1082,1100,1119],"tbody",{},[1045,1064,1065,1071,1076,1079],{},[1066,1067,1068],"td",{},[317,1069,1070],{},"allowedTypes",[1066,1072,1073],{},[317,1074,1075],{},"string[]",[1066,1077,1078],{},"PDF, DOCX, PPTX",[1066,1080,1081],{},"Array of allowed MIME types",[1045,1083,1084,1089,1094,1097],{},[1066,1085,1086],{},[317,1087,1088],{},"bucketName",[1066,1090,1091],{},[317,1092,1093],{},"string",[1066,1095,1096],{},"'PDF'",[1066,1098,1099],{},"Storage bucket name",[1045,1101,1102,1107,1112,1116],{},[1066,1103,1104],{},[317,1105,1106],{},"makePublic",[1066,1108,1109],{},[317,1110,1111],{},"boolean",[1066,1113,1114],{},[317,1115,638],{},[1066,1117,1118],{},"Whether uploaded files should be public",[1045,1120,1121,1126,1131,1134],{},[1066,1122,1123],{},[317,1124,1125],{},"onUploadSuccess",[1066,1127,1128],{},[317,1129,1130],{},"(fileUrl: string) => void",[1066,1132,1133],{},"-",[1066,1135,1136],{},"Callback when upload succeeds",[1138,1139,1140],"style",{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":315,"searchDepth":341,"depth":341,"links":1142},[1143],{"id":299,"depth":341,"text":300,"children":1144},[1145,1146],{"id":307,"depth":361,"text":308},{"id":1030,"depth":361,"text":1031},"md",null,{},{"title":157,"description":295},"apps\u002Fportal\u002Fapp\u002Fcomposables\u002Ffiles\u002FREADME","Wucwm9bIWyCTkd3HNMG0l0vhLCqE0mLE0TYaF12OZ6k",1779007963659]