@alfakit/vue 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/dist/components/actions/ActionButton.js.map +1 -1
- package/dist/components/actions/ActionButton.vue.d.ts.map +1 -1
- package/dist/components/actions/ActionButton.vue_vue_type_script_setup_true_lang.js +160 -159
- package/dist/components/actions/ActionButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/actions/ActionModal.js.map +1 -1
- package/dist/components/actions/ActionModal.vue.d.ts.map +1 -1
- package/dist/components/actions/ActionModal.vue_vue_type_script_setup_true_lang.js +214 -214
- package/dist/components/actions/ActionModal.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/ColorPickerField.js.map +1 -1
- package/dist/components/fields/ColorPickerField.vue.d.ts.map +1 -1
- package/dist/components/fields/ColorPickerField.vue_vue_type_script_setup_true_lang.js +1 -0
- package/dist/components/fields/ColorPickerField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/ComboboxSelect.js.map +1 -1
- package/dist/components/fields/ComboboxSelect.vue.d.ts.map +1 -1
- package/dist/components/fields/ComboboxSelect.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/fields/ComboboxSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/FileUploadField.js.map +1 -1
- package/dist/components/fields/FileUploadField.vue.d.ts.map +1 -1
- package/dist/components/fields/FileUploadField.vue_vue_type_script_setup_true_lang.js +183 -183
- package/dist/components/fields/FileUploadField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/OneTimeCodeInputField.js.map +1 -1
- package/dist/components/fields/OneTimeCodeInputField.vue_vue_type_script_setup_true_lang.js +1 -2
- package/dist/components/fields/OneTimeCodeInputField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/SelectField.js.map +1 -1
- package/dist/components/fields/SelectField.vue.d.ts.map +1 -1
- package/dist/components/fields/SelectField.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/fields/SelectField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/TableColumnHeaders.js.map +1 -1
- package/dist/components/fields/TableColumnHeaders.vue.d.ts.map +1 -1
- package/dist/components/fields/TableColumnHeaders.vue_vue_type_script_setup_true_lang.js +6 -3
- package/dist/components/fields/TableColumnHeaders.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/file-manager/FileManagerView.js.map +1 -1
- package/dist/components/file-manager/FileManagerView.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/file-manager/FileManagerView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/form/FormBlock.js.map +1 -1
- package/dist/components/form/FormBlock.vue.d.ts.map +1 -1
- package/dist/components/form/FormBlock.vue_vue_type_script_setup_true_lang.js +81 -77
- package/dist/components/form/FormBlock.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/form/form-context.js +25 -25
- package/dist/components/form/form-context.js.map +1 -1
- package/dist/components/layout/FusedGroupComponent.js.map +1 -1
- package/dist/components/layout/FusedGroupComponent.vue.d.ts.map +1 -1
- package/dist/components/layout/FusedGroupComponent.vue_vue_type_script_setup_true_lang.js +1 -0
- package/dist/components/layout/FusedGroupComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/layout/TabsComponent.js.map +1 -1
- package/dist/components/layout/TabsComponent.vue.d.ts.map +1 -1
- package/dist/components/layout/TabsComponent.vue_vue_type_script_setup_true_lang.js +76 -55
- package/dist/components/layout/TabsComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/notifications/NotificationsMenu.js.map +1 -1
- package/dist/components/notifications/NotificationsMenu.vue.d.ts.map +1 -1
- package/dist/components/notifications/NotificationsMenu.vue_vue_type_script_setup_true_lang.js +44 -42
- package/dist/components/notifications/NotificationsMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/GlobalSearch.js.map +1 -1
- package/dist/components/panel/GlobalSearch.vue.d.ts.map +1 -1
- package/dist/components/panel/GlobalSearch.vue_vue_type_script_setup_true_lang.js +1 -0
- package/dist/components/panel/GlobalSearch.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/ShortcutKeys.js.map +1 -1
- package/dist/components/panel/ShortcutKeys.vue.d.ts.map +1 -1
- package/dist/components/panel/ShortcutKeys.vue_vue_type_script_setup_true_lang.js +4 -1
- package/dist/components/panel/ShortcutKeys.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/TenantMenu.js.map +1 -1
- package/dist/components/panel/TenantMenu.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/panel/TenantMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/table/GroupHeaderRow.js.map +1 -1
- package/dist/components/table/GroupHeaderRow.vue.d.ts.map +1 -1
- package/dist/components/table/GroupHeaderRow.vue_vue_type_script_setup_true_lang.js +55 -34
- package/dist/components/table/GroupHeaderRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/table/SelectCell.js.map +1 -1
- package/dist/components/table/SelectCell.vue.d.ts.map +1 -1
- package/dist/components/table/SelectCell.vue_vue_type_script_setup_true_lang.js +24 -19
- package/dist/components/table/SelectCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/table/TextInputCell.js.map +1 -1
- package/dist/components/table/TextInputCell.vue.d.ts.map +1 -1
- package/dist/components/table/TextInputCell.vue_vue_type_script_setup_true_lang.js +38 -33
- package/dist/components/table/TextInputCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components.css +347 -0
- package/dist/eject-manifest.json +2 -2
- package/dist/standalone/AlfakitToaster.js.map +1 -1
- package/dist/standalone/AlfakitToaster.vue.d.ts.map +1 -1
- package/dist/standalone/AlfakitToaster.vue_vue_type_script_setup_true_lang.js +23 -15
- package/dist/standalone/AlfakitToaster.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/standalone.css +47 -0
- package/dist/starter-kit/widgets/SearchTrigger.js.map +1 -1
- package/dist/starter-kit/widgets/SearchTrigger.vue.d.ts.map +1 -1
- package/dist/starter-kit/widgets/SearchTrigger.vue_vue_type_script_setup_true_lang.js +1 -0
- package/dist/starter-kit/widgets/SearchTrigger.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/starter-kit/widgets/TenantChooser.js.map +1 -1
- package/dist/starter-kit/widgets/TenantChooser.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/starter-kit/widgets/TenantChooser.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/themes.css +2 -334
- package/package.json +3 -3
- package/src/components/actions/ActionButton.vue +14 -6
- package/src/components/actions/ActionModal.vue +3 -1
- package/src/components/fields/ColorPickerField.vue +1 -0
- package/src/components/fields/ComboboxSelect.vue +1 -1
- package/src/components/fields/FileUploadField.vue +14 -11
- package/src/components/fields/OneTimeCodeInputField.vue +1 -1
- package/src/components/fields/SelectField.vue +4 -2
- package/src/components/fields/TableColumnHeaders.vue +6 -1
- package/src/components/file-manager/FileManagerView.vue +1 -1
- package/src/components/form/FormBlock.vue +24 -0
- package/src/components/form/form-context.ts +2 -2
- package/src/components/layout/FusedGroupComponent.vue +1 -0
- package/src/components/layout/TabsComponent.vue +61 -5
- package/src/components/notifications/NotificationsMenu.vue +11 -0
- package/src/components/panel/GlobalSearch.vue +1 -0
- package/src/components/panel/ShortcutKeys.vue +1 -0
- package/src/components/panel/TenantMenu.vue +2 -2
- package/src/components/table/GroupHeaderRow.vue +27 -0
- package/src/components/table/SelectCell.vue +5 -2
- package/src/components/table/TextInputCell.vue +11 -5
- package/src/standalone/AlfakitToaster.vue +12 -2
- package/src/starter-kit/widgets/SearchTrigger.vue +1 -0
- package/src/starter-kit/widgets/TenantChooser.vue +1 -1
package/dist/components/file-manager/FileManagerView.vue_vue_type_script_setup_true_lang.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileManagerView.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","Card","_unref","_withCtx","_createElementVNode","_toDisplayString","_createVNode","Button","_createElementBlock","_normalizeClass","_Fragment","_renderList","_createCommentVNode","Input","Checkbox","_createTextVNode","FileManagerTree","_mergeProps","_toHandlers","Spinner","FileManagerIcon","FileManagerDetails","Sheet","SheetContent","SheetHeader","SheetTitle","_normalizeStyle","Dialog","DialogContent","_withModifiers","DialogHeader","DialogTitle","DialogFooter","DialogDescription","_withDirectives","_vModelSelect","ImageEditorDialog","Button_default","Spinner_default","Checkbox_default","Input_default","Dialog_default","DialogContent_default","DialogDescription_default","DialogHeader_default","DialogTitle_default","Sheet_default","SheetContent_default","SheetHeader_default","SheetTitle_default","DialogFooter_default","Card_default","ImageEditorDialog_default","FileManagerIcon_default","FileManagerDetails_default","FileManagerTree_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","_hoisted_46","_hoisted_47","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_53","_hoisted_54","_hoisted_55","_hoisted_56","_hoisted_57","_hoisted_58","_hoisted_59","_hoisted_60","_hoisted_61","_hoisted_62","_hoisted_63","_hoisted_64","_hoisted_65","_hoisted_66","_hoisted_67","_hoisted_68","_hoisted_69","_hoisted_70","_hoisted_71","_hoisted_72","_hoisted_73","_hoisted_74","_hoisted_75","_hoisted_76","_hoisted_77","_hoisted_78","_hoisted_79","_hoisted_80","_hoisted_81","_hoisted_82","_hoisted_83","_hoisted_84","_hoisted_85","_hoisted_86","_hoisted_87","_hoisted_88","_hoisted_89","_hoisted_90","_hoisted_91","_hoisted_92","_hoisted_93","_hoisted_94","_hoisted_95","_hoisted_96","_hoisted_97","_hoisted_98","_hoisted_99","_hoisted_100","_hoisted_101","_hoisted_102","_hoisted_103","_hoisted_104","_hoisted_105","_hoisted_106","_hoisted_107","_hoisted_108","_hoisted_109","_hoisted_110","_hoisted_111","_hoisted_112","SELECT","FileManagerView_vue_vue_type_script_setup_true_lang_default","props","__props","SORT_FIELDS","IMAGE_EDITOR","runner","useActionRunner","page","usePageActionContext","panel","usePanel","t","useT","choice","useChoice","direction","useDirection","formatter","useFormatter","mobile","useIsMobile","labelId","useId","hintId","nameId","errorId","tt","key","replacements","fallback","environment","notifications","showToast","notification","clientErrorNotification","message","controller","FileManagerController","toRaw","state","useStore","watch","schema","onMounted","onBeforeUnmount","picker","computed","entries","selected","chosen","single","canWrite","focusPath","folderLabel","can","ability","listRef","ref","items","uploadInput","foldersOpen","pointer","broken","setItem","element","path","focusItem","nextTick","columns","onItemKeyDown","result","event","onItemClick","entry","onItemDoubleClick","copying","dropHandlers","target","onDragStart","openTreeFolder","onUpload","input","sizeOf","fileManagerSize","locationOf","thumbnailOf","markBroken","uploadsDone","upload","uploadsFinished","dialog","name","expiry","copied","share","current","close","onDialogOpen","open","submitName","submitTransfer","chooseDestination","submitDelete","expiryLabel","label","fileManagerExpiry","minutes","copy","url","preview","previewData","previous","next","editing","editImage","data","source","fetchEditableImage","edited","onPreviewKeyDown","back","forward","openBlock","createBlock","unref","withCtx","createElementVNode","toDisplayString","createVNode","_cache","FolderTreeIcon","createElementBlock","normalizeClass","$event","Fragment","renderList","disk","createCommentVNode","ChevronRightIcon","crumb","index","SearchIcon","createTextVNode","field","ArrowUpIcon","ArrowDownIcon","LayoutGridIcon","ListIcon","RefreshCwIcon","cn","FolderPlusIcon","UploadIcon","fileManagerAcceptAttribute","Trash2Icon","RotateCcwIcon","FolderOpenIcon","DownloadIcon","PencilIcon","FolderInputIcon","CopyIcon","Share2Icon","InfoIcon","XIcon","mergeProps","toHandlers","CheckIcon","normalizeStyle","withModifiers","withDirectives","vModelSelect","LinkIcon","link","ChevronLeftIcon","SquarePenIcon"],"sources":["../../../src/components/file-manager/FileManagerView.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type {\n FileManagerEntrySchema,\n FileManagerEnvironment,\n FileManagerSchema,\n FileManagerSortField,\n} from '@alfakit/core'\nimport {\n FileManagerController,\n clientErrorNotification,\n fetchEditableImage,\n fileManagerAcceptAttribute,\n fileManagerExpiry,\n fileManagerSize,\n} from '@alfakit/core'\nimport {\n ArrowDownIcon,\n ArrowUpIcon,\n CheckIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n CopyIcon,\n DownloadIcon,\n FolderInputIcon,\n FolderOpenIcon,\n FolderPlusIcon,\n FolderTreeIcon,\n InfoIcon,\n LayoutGridIcon,\n LinkIcon,\n ListIcon,\n PencilIcon,\n RefreshCwIcon,\n RotateCcwIcon,\n SearchIcon,\n Share2Icon,\n SquarePenIcon,\n Trash2Icon,\n UploadIcon,\n XIcon,\n} from '@lucide/vue'\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, toRaw, useId, watch } from 'vue'\nimport {\n useActionRunner,\n useChoice,\n useDirection,\n useFormatter,\n usePanel,\n useT,\n} from '../../context'\nimport { useIsMobile } from '../../composables/use-mobile'\nimport { useStore } from '../../composables/use-store'\nimport { cn } from '../../lib/utils'\nimport { usePageActionContext } from '../actions/action-context'\nimport ImageEditorDialog, { type ImageEditRequest } from '../fields/ImageEditorDialog.vue'\nimport { showToast } from '../notifications/flash-toasts'\nimport Button from '../ui/Button.vue'\nimport Card from '../ui/Card.vue'\nimport Checkbox from '../ui/Checkbox.vue'\nimport Dialog from '../ui/Dialog.vue'\nimport DialogContent from '../ui/DialogContent.vue'\nimport DialogDescription from '../ui/DialogDescription.vue'\nimport DialogFooter from '../ui/DialogFooter.vue'\nimport DialogHeader from '../ui/DialogHeader.vue'\nimport DialogTitle from '../ui/DialogTitle.vue'\nimport Input from '../ui/Input.vue'\nimport Sheet from '../ui/Sheet.vue'\nimport SheetContent from '../ui/SheetContent.vue'\nimport SheetHeader from '../ui/SheetHeader.vue'\nimport SheetTitle from '../ui/SheetTitle.vue'\nimport Spinner from '../ui/Spinner.vue'\nimport FileManagerDetails from './FileManagerDetails.vue'\nimport FileManagerIcon from './FileManagerIcon.vue'\nimport FileManagerTree from './FileManagerTree.vue'\n\n/**\n * The file manager of alfasix/alfakit-file-manager: a folder tree, breadcrumbs, grid and\n * list views, sorting, search, multi-selection with mouse and keyboard, drag and drop\n * (uploads and moves), uploads with progress, previews, details, sharing and the trash.\n * Everything is listed, checked and changed by the server.\n */\nconst props = defineProps<{\n schema: FileManagerSchema\n /** Picker: called with the chosen files. */\n onChoose?: (entries: FileManagerEntrySchema[]) => void\n onCancel?: () => void\n}>()\n\nconst SELECT =\n 'border-input focus-visible:border-ring focus-visible:ring-ring/50 h-9 min-w-0 rounded-md border bg-transparent px-2 text-sm shadow-xs outline-none focus-visible:ring-[3px]'\nconst SORT_FIELDS: FileManagerSortField[] = ['name', 'size', 'modified', 'type']\nconst IMAGE_EDITOR = { aspectRatios: [null], circle: false }\n\nconst runner = useActionRunner()\nconst page = usePageActionContext()\nconst panel = usePanel()\nconst t = useT()\nconst choice = useChoice()\nconst direction = useDirection()\nconst formatter = useFormatter()\nconst mobile = useIsMobile()\nconst labelId = useId()\nconst hintId = useId()\nconst nameId = useId()\nconst errorId = useId()\nconst tt = (key: string, replacements: Record<string, string | number> = {}, fallback?: string) =>\n t(`file-manager.${key}`, replacements, fallback)\n\nconst environment = (): FileManagerEnvironment => ({\n runner,\n token: page.token,\n uploadEndpoint: panel.value.endpoints.upload,\n uploadChunkEndpoint: panel.value.endpoints.uploadChunks,\n uploadChunkSize: panel.value.uploadChunkSize,\n t,\n choice,\n formatter: formatter.value,\n notify: (notifications) => notifications.forEach((notification) => showToast(notification)),\n error: (message) => showToast(clientErrorNotification('file-manager', message)),\n})\n\nconst controller = new FileManagerController(\n toRaw(props.schema),\n environment(),\n formatter.value.locale,\n)\nconst state = useStore(controller.store)\n\nwatch(\n () => props.schema,\n (schema) => controller.setSchema(toRaw(schema)),\n)\nwatch([formatter, direction], () => controller.setEnvironment(environment()))\n\nonMounted(() => {\n if (props.schema.mode === 'picker') void controller.ensureLoaded()\n})\nonBeforeUnmount(() => controller.dispose())\n\nconst picker = computed(() => props.schema.mode === 'picker')\nconst entries = computed(() => {\n void state.value\n\n return controller.visibleEntries()\n})\nconst selected = computed(() => {\n void state.value\n\n return controller.selectedEntries()\n})\nconst chosen = computed(() => {\n void state.value\n\n return controller.chosen()\n})\nconst single = computed(() => (selected.value.length === 1 ? selected.value[0] : undefined))\nconst canWrite = computed(() => !picker.value && !state.value.trash)\nconst focusPath = computed(() => state.value.focus ?? entries.value[0]?.path ?? null)\nconst folderLabel = computed(() =>\n state.value.trash\n ? tt('trash', {}, 'Trash')\n : (state.value.breadcrumbs[state.value.breadcrumbs.length - 1]?.name ??\n tt('root', {}, 'Files')),\n)\nconst can = (ability: Parameters<FileManagerController['can']>[0]) => controller.can(ability)\n\nconst listRef = ref<HTMLElement | null>(null)\nconst items = new Map<string, HTMLElement>()\nconst uploadInput = ref<HTMLInputElement | null>(null)\nconst foldersOpen = ref(false)\nconst pointer = ref('mouse')\nconst broken = ref(new Set<string>())\n\nconst setItem = (path: string) => (element: unknown) => {\n if (element instanceof HTMLElement) items.set(path, element)\n else items.delete(path)\n}\n\nconst focusItem = (path: string | undefined) => {\n if (path) void nextTick(() => items.get(path)?.focus())\n}\n\nconst columns = () => {\n const element = listRef.value\n\n if (!element || state.value.view !== 'grid' || typeof getComputedStyle === 'undefined') return 1\n\n return Math.max(\n 1,\n getComputedStyle(element).gridTemplateColumns.split(' ').filter(Boolean).length,\n )\n}\n\nconst onItemKeyDown = (event: KeyboardEvent) => {\n const result = controller.handleKey(event, columns(), direction.value)\n\n if (result.handled) {\n event.preventDefault()\n focusItem(result.focus)\n }\n}\n\nconst onItemClick = (entry: FileManagerEntrySchema, event: MouseEvent) =>\n controller.click(entry.path, {\n shift: event.shiftKey,\n toggle: event.metaKey || event.ctrlKey,\n touch: pointer.value === 'touch',\n })\n\nconst onItemDoubleClick = (entry: FileManagerEntrySchema) => {\n if (picker.value && entry.type === 'file') {\n if (entry.selectable !== false && entry.value) props.onChoose?.([entry])\n\n return\n }\n\n controller.openEntry(entry)\n}\n\nconst copying = (event: DragEvent) => event.ctrlKey || event.altKey || event.metaKey\n\nconst dropHandlers = (target: string) => ({\n dragover: (event: DragEvent) => {\n if (event.dataTransfer && controller.dragOver(target, event.dataTransfer, copying(event))) {\n event.preventDefault()\n event.stopPropagation()\n }\n },\n dragleave: (event: DragEvent) => {\n const current = event.currentTarget as HTMLElement | null\n\n if (!current?.contains(event.relatedTarget as Node | null)) controller.dragLeave(target)\n },\n drop: (event: DragEvent) => {\n event.preventDefault()\n event.stopPropagation()\n\n if (event.dataTransfer) void controller.drop(target, event.dataTransfer, copying(event))\n },\n})\n\nconst onDragStart = (entry: FileManagerEntrySchema, event: DragEvent) => {\n if (event.dataTransfer) controller.dragStart(entry.path, event.dataTransfer)\n}\n\nconst openTreeFolder = (path: string) => {\n foldersOpen.value = false\n void controller.open(path)\n}\n\nconst onUpload = (event: Event) => {\n const input = event.target as HTMLInputElement\n\n if (input.files) void controller.upload(Array.from(input.files))\n input.value = ''\n}\n\nconst sizeOf = (entry: FileManagerEntrySchema) =>\n entry.type === 'file' ? fileManagerSize(entry.size, formatter.value) : ''\nconst locationOf = (entry: FileManagerEntrySchema) =>\n state.value.results !== null && entry.path.includes('/')\n ? entry.path.slice(0, entry.path.lastIndexOf('/'))\n : null\nconst thumbnailOf = (entry: FileManagerEntrySchema) =>\n entry.thumbnail && !broken.value.has(entry.path) ? entry.thumbnail : null\nconst markBroken = (path: string) => {\n broken.value = new Set([...broken.value, path])\n}\n\n// ---------------------------------------------------------------- Uploads\n\nconst uploadsDone = computed(\n () => state.value.uploads.filter((upload) => upload.status === 'done').length,\n)\nconst uploadsFinished = computed(() =>\n state.value.uploads.every((upload) => upload.status === 'done' || upload.status === 'error'),\n)\n\n// ---------------------------------------------------------------- Dialogs\n\nconst dialog = computed(() => state.value.dialog)\nconst name = ref('')\nconst expiry = ref('')\nconst copied = ref(false)\nconst share = computed(() => props.schema.share)\n\nwatch(\n () =>\n [\n dialog.value?.type,\n dialog.value && 'entry' in dialog.value ? dialog.value.entry.path : null,\n ] as const,\n () => {\n const current = dialog.value\n\n if (current?.type === 'rename') name.value = current.entry.name\n if (current?.type === 'createFolder') name.value = ''\n if (current?.type === 'share') {\n expiry.value = String(share.value?.expiries[0] ?? '')\n copied.value = false\n }\n },\n)\n\nconst close = () => controller.closeDialog()\nconst onDialogOpen = (open: boolean) => {\n if (!open) close()\n}\n\nconst submitName = () => {\n const current = dialog.value\n\n if (current?.type === 'rename') void controller.rename(current.entry.path, name.value)\n else void controller.createFolder(name.value)\n}\n\nconst submitTransfer = () => {\n const current = dialog.value\n\n if (current?.type === 'move' || current?.type === 'copy')\n void controller.transfer(current.type, current.paths, current.destination)\n}\n\nconst chooseDestination = (path: string) => {\n const current = dialog.value\n\n if (current?.type === 'move' || current?.type === 'copy')\n controller.openDialog({ ...current, destination: path })\n}\n\nconst submitDelete = () => {\n const current = dialog.value\n\n if (current?.type === 'delete') void controller.remove(current.paths)\n else void controller.emptyTrash()\n}\n\nconst expiryLabel = (minutes: number) => {\n const label = fileManagerExpiry(minutes)\n\n return choice(`file-manager.${label.key}`, label.count, {}, ':count')\n}\n\nconst copy = async (url: string) => {\n try {\n await navigator.clipboard.writeText(url)\n copied.value = true\n } catch {\n copied.value = false\n }\n}\n\n// ---------------------------------------------------------------- Preview\n\nconst preview = computed(() => state.value.preview)\nconst previewData = computed(() => preview.value?.data ?? null)\nconst previous = computed(() => {\n void state.value.preview\n\n return controller.previewSibling(-1)\n})\nconst next = computed(() => {\n void state.value.preview\n\n return controller.previewSibling(1)\n})\nconst editing = ref<ImageEditRequest | null>(null)\n\nconst editImage = async () => {\n const data = previewData.value\n const current = preview.value\n\n if (!data?.url || !current) return\n\n const source = await fetchEditableImage(data.url, current.entry.name)\n\n if (!source) return\n\n editing.value = {\n file: source,\n resolve: (edited) => {\n editing.value = null\n if (edited && edited !== source) void controller.saveEditedImage(edited)\n },\n }\n}\n\nconst onPreviewKeyDown = (event: KeyboardEvent) => {\n const back = direction.value === 'rtl' ? 'ArrowRight' : 'ArrowLeft'\n const forward = direction.value === 'rtl' ? 'ArrowLeft' : 'ArrowRight'\n\n if (\n event.target instanceof HTMLElement &&\n ['VIDEO', 'AUDIO', 'INPUT'].includes(event.target.tagName)\n )\n return\n\n if (event.key === back && previous.value) void controller.openPreview(previous.value)\n if (event.key === forward && next.value) void controller.openPreview(next.value)\n}\n</script>\n\n<template>\n <Card\n class=\"relative gap-0 overflow-hidden py-0\"\n data-slot=\"file-manager\"\n :data-view=\"state.view\"\n :data-mode=\"schema.mode\"\n :aria-labelledby=\"labelId\"\n >\n <span :id=\"labelId\" class=\"sr-only\">{{ tt('label', {}, 'File manager') }}</span>\n <div class=\"sr-only\" role=\"status\" aria-live=\"polite\">{{ state.announcement }}</div>\n\n <div class=\"flex flex-wrap items-center gap-2 border-b p-3\" data-slot=\"file-manager-toolbar\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n class=\"md:hidden\"\n :aria-label=\"tt('toggle_folders', {}, 'Show folders')\"\n @click=\"foldersOpen = true\"\n >\n <FolderTreeIcon aria-hidden=\"true\" />\n </Button>\n <label v-if=\"schema.disks.length > 1\" class=\"flex items-center\">\n <span class=\"sr-only\">{{ tt('disk', {}, 'Storage') }}</span>\n <select\n :class=\"SELECT\"\n :value=\"state.disk\"\n @change=\"controller.setDisk(($event.target as HTMLSelectElement).value)\"\n >\n <option v-for=\"disk in schema.disks\" :key=\"disk.name\" :value=\"disk.name\">\n {{ disk.label }}\n </option>\n </select>\n </label>\n <nav\n :aria-label=\"tt('breadcrumb', {}, 'Folder path')\"\n class=\"min-w-0 flex-1\"\n data-slot=\"file-manager-breadcrumb\"\n >\n <ol class=\"flex min-w-0 flex-wrap items-center gap-1 text-sm\">\n <li class=\"flex items-center\">\n <button\n type=\"button\"\n class=\"hover:bg-accent rounded px-1.5 py-1 font-medium\"\n :aria-current=\"!state.trash && state.path === '' ? 'page' : undefined\"\n @click=\"state.trash ? controller.showTrash(false) : controller.open('')\"\n >\n {{ tt('root', {}, 'Files') }}\n </button>\n </li>\n <li v-if=\"state.trash\" class=\"flex min-w-0 items-center gap-1\">\n <ChevronRightIcon\n class=\"text-muted-foreground size-3.5 shrink-0 rtl:rotate-180\"\n aria-hidden=\"true\"\n />\n <span class=\"truncate px-1.5 py-1 font-medium\" aria-current=\"page\">{{\n tt('trash', {}, 'Trash')\n }}</span>\n </li>\n <template v-else>\n <li\n v-for=\"(crumb, index) in state.breadcrumbs\"\n :key=\"crumb.path\"\n class=\"flex min-w-0 items-center gap-1\"\n >\n <ChevronRightIcon\n class=\"text-muted-foreground size-3.5 shrink-0 rtl:rotate-180\"\n aria-hidden=\"true\"\n />\n <span\n v-if=\"index === state.breadcrumbs.length - 1\"\n class=\"truncate px-1.5 py-1 font-medium\"\n aria-current=\"page\"\n >\n {{ crumb.name }}\n </span>\n <button\n v-else\n type=\"button\"\n class=\"hover:bg-accent truncate rounded px-1.5 py-1\"\n @click=\"controller.open(crumb.path)\"\n >\n {{ crumb.name }}\n </button>\n </li>\n </template>\n </ol>\n </nav>\n <div class=\"flex w-full flex-wrap items-center gap-2 sm:w-auto\">\n <div class=\"relative min-w-40 flex-1 sm:flex-none\">\n <SearchIcon\n class=\"text-muted-foreground pointer-events-none absolute start-2.5 top-1/2 size-4 -translate-y-1/2\"\n aria-hidden=\"true\"\n />\n <Input\n type=\"search\"\n :model-value=\"state.query\"\n :placeholder=\"tt('search_placeholder', {}, 'Search…')\"\n :aria-label=\"tt('search', {}, 'Search in this folder')\"\n class=\"h-9 ps-8 sm:w-52\"\n :disabled=\"state.trash\"\n @update:model-value=\"controller.setQuery(String($event))\"\n />\n </div>\n <label\n v-if=\"schema.search.recursive && !state.trash\"\n class=\"flex items-center gap-2 text-sm\"\n >\n <Checkbox\n :model-value=\"state.recursive\"\n @update:model-value=\"controller.setRecursive($event === true)\"\n />\n {{ tt('search_everywhere', {}, 'Include subfolders') }}\n </label>\n <label class=\"flex items-center gap-1\">\n <span class=\"sr-only\">{{ tt('sort', {}, 'Sort by') }}</span>\n <select\n :class=\"SELECT\"\n :value=\"state.sort.field\"\n @change=\"\n controller.setSort(\n ($event.target as HTMLSelectElement).value as FileManagerSortField,\n state.sort.direction,\n )\n \"\n >\n <option v-for=\"field in SORT_FIELDS\" :key=\"field\" :value=\"field\">\n {{ tt(`sort_${field}`, {}, field) }}\n </option>\n </select>\n </label>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n :aria-label=\"\n state.sort.direction === 'asc'\n ? tt('ascending', {}, 'Ascending')\n : tt('descending', {}, 'Descending')\n \"\n @click=\"\n controller.setSort(state.sort.field, state.sort.direction === 'asc' ? 'desc' : 'asc')\n \"\n >\n <ArrowUpIcon v-if=\"state.sort.direction === 'asc'\" aria-hidden=\"true\" />\n <ArrowDownIcon v-else aria-hidden=\"true\" />\n </Button>\n <div class=\"flex rounded-md border\" role=\"group\" :aria-label=\"tt('view', {}, 'View')\">\n <Button\n type=\"button\"\n :variant=\"state.view === 'grid' ? 'secondary' : 'ghost'\"\n size=\"icon-sm\"\n :aria-pressed=\"state.view === 'grid'\"\n :aria-label=\"tt('view_grid', {}, 'Grid')\"\n @click=\"controller.setView('grid')\"\n >\n <LayoutGridIcon aria-hidden=\"true\" />\n </Button>\n <Button\n type=\"button\"\n :variant=\"state.view === 'list' ? 'secondary' : 'ghost'\"\n size=\"icon-sm\"\n :aria-pressed=\"state.view === 'list'\"\n :aria-label=\"tt('view_list', {}, 'List')\"\n @click=\"controller.setView('list')\"\n >\n <ListIcon aria-hidden=\"true\" />\n </Button>\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n :aria-label=\"tt('refresh', {}, 'Refresh')\"\n @click=\"controller.refresh()\"\n >\n <RefreshCwIcon aria-hidden=\"true\" :class=\"cn(state.loading && 'animate-spin')\" />\n </Button>\n <Button\n v-if=\"!state.trash && can('createFolder')\"\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n @click=\"controller.openDialog({ type: 'createFolder' })\"\n >\n <FolderPlusIcon aria-hidden=\"true\" />\n <span class=\"max-sm:sr-only\">{{ tt('new_folder', {}, 'New folder') }}</span>\n </Button>\n <template v-if=\"!state.trash && can('upload') && schema.upload\">\n <Button type=\"button\" size=\"sm\" @click=\"uploadInput?.click()\">\n <UploadIcon aria-hidden=\"true\" />\n <span class=\"max-sm:sr-only\">{{ tt('upload', {}, 'Upload') }}</span>\n </Button>\n <input\n ref=\"uploadInput\"\n type=\"file\"\n multiple\n hidden\n :accept=\"fileManagerAcceptAttribute(schema.upload.accept)\"\n data-slot=\"file-manager-upload-input\"\n @change=\"onUpload\"\n />\n </template>\n <Button\n v-if=\"schema.trash && !picker\"\n type=\"button\"\n :variant=\"state.trash ? 'secondary' : 'ghost'\"\n size=\"sm\"\n :aria-pressed=\"state.trash\"\n @click=\"controller.showTrash(!state.trash)\"\n >\n <Trash2Icon aria-hidden=\"true\" />\n <span class=\"max-sm:sr-only\">{{\n state.trash ? tt('back_to_files', {}, 'Back to files') : tt('trash', {}, 'Trash')\n }}</span>\n </Button>\n </div>\n </div>\n\n <div\n v-if=\"selected.length > 0 && !picker\"\n class=\"bg-muted/50 flex flex-wrap items-center gap-1 border-b px-3 py-2 text-sm\"\n data-slot=\"file-manager-selection\"\n >\n <span class=\"me-2 font-medium\">{{\n tt('selected', { count: selected.length }, ':count selected')\n }}</span>\n <template v-if=\"state.trash\">\n <Button\n v-if=\"can('restore')\"\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n @click=\"controller.restore()\"\n >\n <RotateCcwIcon aria-hidden=\"true\" />\n <span class=\"max-md:sr-only\">{{ tt('restore', {}, 'Restore') }}</span>\n </Button>\n <Button\n v-if=\"can('delete')\"\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n class=\"text-destructive hover:text-destructive\"\n @click=\"controller.confirmDelete()\"\n >\n <Trash2Icon aria-hidden=\"true\" />\n <span class=\"max-md:sr-only\">{{\n tt('delete_permanently', {}, 'Delete permanently')\n }}</span>\n </Button>\n </template>\n <template v-else>\n <Button\n v-if=\"single\"\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n @click=\"controller.openEntry(single)\"\n >\n <FolderOpenIcon v-if=\"single.type === 'folder'\" aria-hidden=\"true\" />\n <SearchIcon v-else aria-hidden=\"true\" />\n <span class=\"max-md:sr-only\">{{\n single.type === 'folder' ? tt('open', {}, 'Open') : tt('preview', {}, 'Preview')\n }}</span>\n </Button>\n <Button\n v-if=\"can('download') && (single?.type === 'file' || can('zip'))\"\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n @click=\"controller.download()\"\n >\n <DownloadIcon aria-hidden=\"true\" />\n <span class=\"max-md:sr-only\">{{\n single?.type === 'file'\n ? tt('download', {}, 'Download')\n : tt('download_zip', {}, 'Download as zip')\n }}</span>\n </Button>\n <Button\n v-if=\"single && can('rename')\"\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n @click=\"controller.openDialog({ type: 'rename', entry: single })\"\n >\n <PencilIcon aria-hidden=\"true\" />\n <span class=\"max-md:sr-only\">{{ tt('rename', {}, 'Rename') }}</span>\n </Button>\n <Button\n v-if=\"can('move')\"\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n @click=\"\n controller.openDialog({ type: 'move', paths: state.selection, destination: state.path })\n \"\n >\n <FolderInputIcon aria-hidden=\"true\" />\n <span class=\"max-md:sr-only\">{{ tt('move', {}, 'Move') }}</span>\n </Button>\n <Button\n v-if=\"can('copy')\"\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n @click=\"\n controller.openDialog({ type: 'copy', paths: state.selection, destination: state.path })\n \"\n >\n <CopyIcon aria-hidden=\"true\" />\n <span class=\"max-md:sr-only\">{{ tt('copy', {}, 'Copy') }}</span>\n </Button>\n <Button\n v-if=\"single?.type === 'file' && can('share') && schema.share\"\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n @click=\"controller.openShare(single)\"\n >\n <Share2Icon aria-hidden=\"true\" />\n <span class=\"max-md:sr-only\">{{ tt('share', {}, 'Share') }}</span>\n </Button>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" @click=\"controller.showDetails(single)\">\n <InfoIcon aria-hidden=\"true\" />\n <span class=\"max-md:sr-only\">{{ tt('details', {}, 'Details') }}</span>\n </Button>\n <Button\n v-if=\"can('delete')\"\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n class=\"text-destructive hover:text-destructive\"\n @click=\"controller.confirmDelete()\"\n >\n <Trash2Icon aria-hidden=\"true\" />\n <span class=\"max-md:sr-only\">{{ tt('delete', {}, 'Delete') }}</span>\n </Button>\n </template>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n class=\"ms-auto\"\n :aria-label=\"tt('clear_selection', {}, 'Clear selection')\"\n @click=\"controller.clearSelection()\"\n >\n <XIcon aria-hidden=\"true\" />\n </Button>\n </div>\n\n <div :class=\"cn('flex', picker ? 'h-[60vh]' : 'min-h-[28rem]')\">\n <aside\n class=\"hidden w-60 shrink-0 overflow-y-auto border-e p-2 md:block\"\n data-slot=\"file-manager-sidebar\"\n >\n <FileManagerTree\n :controller=\"controller\"\n :active=\"state.trash ? null : state.path\"\n :drop-handlers=\"canWrite ? dropHandlers : undefined\"\n @open=\"openTreeFolder\"\n />\n </aside>\n\n <div\n class=\"relative min-w-0 flex-1 overflow-y-auto\"\n data-slot=\"file-manager-content\"\n :data-drop-target=\"state.dropTarget === '' ? '' : undefined\"\n v-on=\"canWrite ? dropHandlers('') : {}\"\n >\n <p\n v-if=\"state.trash && state.retentionDays\"\n class=\"text-muted-foreground border-b px-4 py-2 text-xs\"\n >\n {{\n tt(\n 'trash_hint',\n { days: state.retentionDays },\n 'Items in the trash are deleted for good after :days days.',\n )\n }}\n </p>\n <p\n v-if=\"state.truncated || state.resultsTruncated\"\n class=\"text-muted-foreground border-b px-4 py-2 text-xs\"\n role=\"note\"\n >\n {{\n state.resultsTruncated\n ? tt('search_truncated', {}, 'Only the first results are shown. Refine your search.')\n : tt('truncated', {}, 'This folder has more items than can be shown here.')\n }}\n </p>\n <p :id=\"hintId\" class=\"sr-only\">\n {{\n tt('keyboard', {}, 'Arrow keys move between items, Shift selects a range, Enter opens.')\n }}\n </p>\n\n <div\n v-if=\"(state.loading || state.searching) && entries.length === 0\"\n class=\"flex justify-center py-16\"\n >\n <Spinner />\n <span class=\"sr-only\">{{ tt('loading', {}, 'Loading files') }}</span>\n </div>\n <div\n v-else-if=\"entries.length === 0\"\n class=\"text-muted-foreground flex flex-col items-center gap-2 px-6 py-16 text-center text-sm\"\n data-slot=\"file-manager-empty\"\n >\n <FolderOpenIcon class=\"size-10 opacity-40\" aria-hidden=\"true\" />\n <p class=\"text-foreground font-medium\">\n {{\n state.query\n ? tt('no_results', {}, 'Nothing matches your search')\n : state.trash\n ? tt('empty_trash_state', {}, 'The trash is empty')\n : tt('empty', {}, 'This folder is empty')\n }}\n </p>\n <p v-if=\"!state.query && canWrite && can('upload')\">\n {{ tt('empty_hint', {}, 'Drop files here or choose Upload.') }}\n </p>\n </div>\n <div\n v-else\n ref=\"listRef\"\n role=\"listbox\"\n :aria-multiselectable=\"!picker || schema.multiple === true\"\n :aria-labelledby=\"labelId\"\n :aria-describedby=\"hintId\"\n :aria-busy=\"state.loading || undefined\"\n data-slot=\"file-manager-items\"\n :class=\"\n cn(\n state.view === 'grid'\n ? 'grid grid-cols-2 gap-3 p-3 sm:grid-cols-3 lg:grid-cols-4 xl:grid-cols-6'\n : 'flex flex-col p-1',\n state.loading && 'opacity-60',\n )\n \"\n >\n <div\n v-if=\"state.view === 'list'\"\n class=\"text-muted-foreground hidden grid-cols-[1fr_7rem_10rem] gap-3 px-3 py-1.5 text-xs font-medium sm:grid\"\n aria-hidden=\"true\"\n >\n <span>{{ tt('name', {}, 'Name') }}</span>\n <span class=\"text-end\">{{ tt('size', {}, 'Size') }}</span>\n <span>{{ tt('modified', {}, 'Modified') }}</span>\n </div>\n <div\n v-for=\"entry in entries\"\n :key=\"entry.path\"\n :ref=\"setItem(entry.path)\"\n role=\"option\"\n :aria-label=\"entry.name\"\n :aria-selected=\"state.selection.includes(entry.path)\"\n :aria-disabled=\"\n (picker && entry.type === 'file' && entry.selectable === false) || undefined\n \"\n :tabindex=\"entry.path === focusPath ? 0 : -1\"\n :draggable=\"canWrite && (can('move') || can('copy'))\"\n data-slot=\"file-manager-item\"\n :data-type=\"entry.type\"\n :data-kind=\"entry.kind\"\n :data-selected=\"state.selection.includes(entry.path) ? '' : undefined\"\n :data-drop-target=\"state.dropTarget === entry.path ? '' : undefined\"\n :title=\"entry.name\"\n :class=\"\n cn(\n 'group focus-visible:ring-ring/50 relative cursor-default rounded-lg outline-none select-none focus-visible:ring-[3px]',\n state.view === 'grid'\n ? 'hover:bg-accent/50 flex flex-col gap-2 border p-2'\n : 'hover:bg-accent/50 grid grid-cols-[auto_1fr] items-center gap-3 px-3 py-2 sm:grid-cols-[auto_1fr_7rem_10rem]',\n state.selection.includes(entry.path) &&\n 'bg-primary/10 border-primary/40 hover:bg-primary/15',\n state.dropTarget === entry.path && 'ring-primary ring-2',\n picker && entry.type === 'file' && entry.selectable === false && 'opacity-50',\n )\n \"\n v-on=\"entry.type === 'folder' && canWrite ? dropHandlers(entry.path) : {}\"\n @pointerdown=\"pointer = $event.pointerType\"\n @click=\"onItemClick(entry, $event)\"\n @dblclick=\"onItemDoubleClick(entry)\"\n @keydown=\"onItemKeyDown\"\n @focus=\"controller.focus(entry.path)\"\n @dragstart=\"onDragStart(entry, $event)\"\n @dragend=\"controller.dragEnd()\"\n >\n <template v-if=\"state.view === 'grid'\">\n <div\n class=\"bg-muted/60 flex aspect-[4/3] items-center justify-center overflow-hidden rounded-md\"\n >\n <img\n v-if=\"thumbnailOf(entry)\"\n :src=\"thumbnailOf(entry) ?? undefined\"\n alt=\"\"\n loading=\"lazy\"\n :draggable=\"false\"\n class=\"size-full object-cover\"\n @error=\"markBroken(entry.path)\"\n />\n <FileManagerIcon v-else :entry=\"entry\" class=\"size-10\" />\n </div>\n <div class=\"min-w-0 px-0.5\">\n <p class=\"truncate text-sm font-medium\">{{ entry.name }}</p>\n <p class=\"text-muted-foreground truncate text-xs\">\n {{\n locationOf(entry) ??\n (entry.type === 'folder' ? tt('kinds.folder', {}, 'Folder') : sizeOf(entry))\n }}\n </p>\n </div>\n </template>\n <template v-else>\n <img\n v-if=\"thumbnailOf(entry)\"\n :src=\"thumbnailOf(entry) ?? undefined\"\n alt=\"\"\n loading=\"lazy\"\n :draggable=\"false\"\n class=\"size-8 rounded object-cover\"\n @error=\"markBroken(entry.path)\"\n />\n <FileManagerIcon v-else :entry=\"entry\" class=\"size-5\" />\n <div class=\"min-w-0\">\n <p class=\"truncate text-sm font-medium\">{{ entry.name }}</p>\n <p v-if=\"locationOf(entry)\" class=\"text-muted-foreground truncate text-xs\">\n {{ locationOf(entry) }}\n </p>\n </div>\n <span class=\"text-muted-foreground hidden text-end text-sm tabular-nums sm:block\">{{\n sizeOf(entry)\n }}</span>\n <span class=\"text-muted-foreground hidden truncate text-sm sm:block\">\n {{ entry.modified ? formatter.dateTime(entry.modified) : '' }}\n </span>\n </template>\n <CheckIcon\n v-if=\"state.selection.includes(entry.path)\"\n class=\"bg-primary text-primary-foreground absolute end-1.5 top-1.5 size-4 rounded-full p-0.5\"\n aria-hidden=\"true\"\n />\n </div>\n </div>\n\n <div\n v-if=\"state.dropTarget === ''\"\n class=\"border-primary bg-primary/5 text-primary pointer-events-none absolute inset-2 flex items-center justify-center rounded-lg border-2 border-dashed text-sm font-medium\"\n data-slot=\"file-manager-drop\"\n >\n {{ tt('drop_here', { folder: folderLabel }, 'Drop files to upload them to :folder') }}\n </div>\n </div>\n\n <aside\n v-if=\"state.detailsOpen\"\n class=\"hidden w-72 shrink-0 overflow-y-auto border-s md:block\"\n data-slot=\"file-manager-details\"\n >\n <FileManagerDetails :controller=\"controller\" />\n </aside>\n </div>\n\n <div\n v-if=\"state.trash && entries.length > 0 && can('delete')\"\n class=\"flex justify-end border-t p-3\"\n >\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n @click=\"controller.openDialog({ type: 'emptyTrash' })\"\n >\n <Trash2Icon aria-hidden=\"true\" />\n {{ tt('empty_trash', {}, 'Empty trash') }}\n </Button>\n </div>\n\n <div\n v-if=\"picker\"\n class=\"flex flex-wrap items-center justify-end gap-2 border-t p-3\"\n data-slot=\"file-manager-picker-footer\"\n >\n <span class=\"text-muted-foreground me-auto text-sm\">\n {{ selected.length > 0 ? tt('selected', { count: chosen.length }, ':count selected') : '' }}\n </span>\n <Button type=\"button\" variant=\"outline\" @click=\"onCancel?.()\">{{\n tt('cancel', {}, 'Cancel')\n }}</Button>\n <Button type=\"button\" :disabled=\"chosen.length === 0\" @click=\"onChoose?.(chosen)\">\n <CheckIcon aria-hidden=\"true\" />\n {{ tt('picker_choose', {}, 'Choose') }}\n </Button>\n </div>\n\n <Sheet :open=\"foldersOpen\" @update:open=\"foldersOpen = $event\">\n <SheetContent :side=\"direction === 'rtl' ? 'right' : 'left'\" class=\"p-4\">\n <SheetHeader class=\"p-0\">\n <SheetTitle>{{ tt('folders', {}, 'Folders') }}</SheetTitle>\n </SheetHeader>\n <FileManagerTree\n :controller=\"controller\"\n :active=\"state.trash ? null : state.path\"\n :drop-handlers=\"canWrite ? dropHandlers : undefined\"\n @open=\"openTreeFolder\"\n />\n </SheetContent>\n </Sheet>\n\n <Sheet\n :open=\"state.detailsOpen && mobile\"\n @update:open=\"(open) => !open && controller.closeDetails()\"\n >\n <SheetContent :side=\"direction === 'rtl' ? 'left' : 'right'\" class=\"p-0\">\n <SheetHeader>\n <SheetTitle>{{ tt('details', {}, 'Details') }}</SheetTitle>\n </SheetHeader>\n <FileManagerDetails :controller=\"controller\" hide-heading />\n </SheetContent>\n </Sheet>\n\n <section\n v-if=\"state.uploads.length > 0\"\n class=\"bg-popover fixed end-4 bottom-4 z-40 flex max-h-80 w-[min(22rem,calc(100vw-2rem))] flex-col overflow-hidden rounded-lg border shadow-lg\"\n :aria-label=\"tt('uploads', {}, 'Uploads')\"\n data-slot=\"file-manager-uploads\"\n >\n <header class=\"flex items-center gap-2 border-b px-3 py-2 text-sm font-medium\">\n <UploadIcon class=\"size-4\" aria-hidden=\"true\" />\n <span class=\"flex-1\" role=\"status\">\n {{\n tt(\n 'uploads_summary',\n { done: uploadsDone, total: state.uploads.length },\n ':done of :total uploaded',\n )\n }}\n </span>\n <Button\n v-if=\"uploadsFinished\"\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n :aria-label=\"tt('dismiss', {}, 'Dismiss')\"\n @click=\"controller.clearUploads()\"\n >\n <XIcon aria-hidden=\"true\" />\n </Button>\n </header>\n <ul class=\"flex flex-col gap-2 overflow-y-auto p-3\">\n <li\n v-for=\"upload in state.uploads\"\n :key=\"upload.id\"\n class=\"flex flex-col gap-1 text-sm\"\n :data-status=\"upload.status\"\n >\n <div class=\"flex items-center gap-2\">\n <span class=\"min-w-0 flex-1 truncate\">{{ upload.name }}</span>\n <CheckIcon\n v-if=\"upload.status === 'done'\"\n class=\"size-4 text-emerald-600\"\n :aria-label=\"tt('upload_done', {}, 'Uploaded')\"\n />\n <Button\n v-else-if=\"upload.status === 'error'\"\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n :aria-label=\"tt('dismiss', {}, 'Dismiss')\"\n @click=\"controller.dismissUpload(upload.id)\"\n >\n <XIcon aria-hidden=\"true\" />\n </Button>\n <span v-else class=\"text-muted-foreground text-xs tabular-nums\">{{\n formatter.percent(upload.progress)\n }}</span>\n </div>\n <p v-if=\"upload.status === 'error'\" class=\"text-destructive text-xs\" role=\"alert\">\n {{ upload.error ?? tt('upload_failed', {}, 'Failed') }}\n </p>\n <div\n v-else-if=\"upload.status !== 'done'\"\n role=\"progressbar\"\n :aria-valuemin=\"0\"\n :aria-valuemax=\"100\"\n :aria-valuenow=\"Math.round(upload.progress * 100)\"\n :aria-label=\"\n tt(\n 'upload_progress',\n { name: upload.name, percent: formatter.percent(upload.progress) },\n ':name, :percent uploaded',\n )\n \"\n class=\"bg-muted h-1.5 overflow-hidden rounded-full\"\n >\n <div\n class=\"bg-primary h-full rounded-full transition-[width]\"\n :style=\"{ width: `${upload.progress * 100}%` }\"\n />\n </div>\n </li>\n </ul>\n </section>\n\n <Dialog\n :open=\"dialog?.type === 'createFolder' || dialog?.type === 'rename'\"\n @update:open=\"onDialogOpen\"\n >\n <DialogContent data-slot=\"file-manager-dialog\">\n <form class=\"flex flex-col gap-4\" @submit.prevent=\"submitName\">\n <DialogHeader>\n <DialogTitle>\n {{\n dialog?.type === 'rename'\n ? tt('rename_heading', { name: dialog.entry.name }, 'Rename “:name”')\n : tt('new_folder', {}, 'New folder')\n }}\n </DialogTitle>\n </DialogHeader>\n <div class=\"flex flex-col gap-2\">\n <label :for=\"nameId\" class=\"text-sm font-medium\">\n {{\n dialog?.type === 'rename'\n ? tt('name', {}, 'Name')\n : tt('folder_name', {}, 'Folder name')\n }}\n </label>\n <Input\n :id=\"nameId\"\n v-model=\"name\"\n autofocus\n :aria-invalid=\"state.error ? true : undefined\"\n :aria-describedby=\"state.error ? errorId : undefined\"\n />\n <p v-if=\"state.error\" :id=\"errorId\" class=\"text-destructive text-sm\" role=\"alert\">\n {{ state.error }}\n </p>\n </div>\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" @click=\"close\">{{\n tt('cancel', {}, 'Cancel')\n }}</Button>\n <Button type=\"submit\" :disabled=\"state.busy || name.trim() === ''\">\n <Spinner v-if=\"state.busy\" />\n {{ dialog?.type === 'rename' ? tt('save', {}, 'Save') : tt('create', {}, 'Create') }}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n\n <Dialog :open=\"dialog?.type === 'move' || dialog?.type === 'copy'\" @update:open=\"onDialogOpen\">\n <DialogContent data-slot=\"file-manager-dialog\">\n <DialogHeader>\n <DialogTitle>\n {{\n dialog?.type === 'move' || dialog?.type === 'copy'\n ? choice(\n `file-manager.${dialog.type}_heading`,\n dialog.paths.length,\n {},\n dialog.type === 'move' ? 'Move :count items' : 'Copy :count items',\n )\n : ''\n }}\n </DialogTitle>\n <DialogDescription>{{ tt('destination', {}, 'Destination folder') }}</DialogDescription>\n </DialogHeader>\n <div class=\"max-h-72 overflow-y-auto rounded-md border p-2\">\n <FileManagerTree\n v-if=\"dialog?.type === 'move' || dialog?.type === 'copy'\"\n :controller=\"controller\"\n :active=\"dialog.destination\"\n @open=\"chooseDestination\"\n />\n </div>\n <p v-if=\"state.error\" class=\"text-destructive text-sm\" role=\"alert\">{{ state.error }}</p>\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" @click=\"close\">{{\n tt('cancel', {}, 'Cancel')\n }}</Button>\n <Button type=\"button\" :disabled=\"state.busy\" @click=\"submitTransfer\">\n <Spinner v-if=\"state.busy\" />\n {{\n dialog?.type === 'copy'\n ? tt('copy_here', {}, 'Copy here')\n : tt('move_here', {}, 'Move here')\n }}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n <Dialog\n :open=\"dialog?.type === 'delete' || dialog?.type === 'emptyTrash'\"\n @update:open=\"onDialogOpen\"\n >\n <DialogContent data-slot=\"file-manager-dialog\">\n <DialogHeader>\n <DialogTitle>\n {{\n dialog?.type === 'delete'\n ? choice(\n 'file-manager.delete_heading',\n dialog.paths.length,\n {},\n 'Delete :count items?',\n )\n : tt('empty_trash_heading', {}, 'Empty the trash?')\n }}\n </DialogTitle>\n <DialogDescription>\n {{\n dialog?.type === 'delete' && !dialog.permanent\n ? tt(\n 'delete_description_trash',\n {},\n 'They go to the trash, where you can restore them.',\n )\n : dialog?.type === 'emptyTrash'\n ? tt(\n 'empty_trash_description',\n {},\n 'Everything in the trash is deleted for good.',\n )\n : tt(\n 'delete_description',\n {},\n 'They are deleted for good. This cannot be undone.',\n )\n }}\n </DialogDescription>\n </DialogHeader>\n <p v-if=\"state.error\" class=\"text-destructive text-sm\" role=\"alert\">{{ state.error }}</p>\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" @click=\"close\">{{\n tt('cancel', {}, 'Cancel')\n }}</Button>\n <Button type=\"button\" variant=\"destructive\" :disabled=\"state.busy\" @click=\"submitDelete\">\n <Spinner v-if=\"state.busy\" />\n {{\n dialog?.type === 'emptyTrash'\n ? tt('empty_trash', {}, 'Empty trash')\n : dialog?.type === 'delete' && dialog.permanent\n ? tt('delete_permanently', {}, 'Delete permanently')\n : tt('delete', {}, 'Delete')\n }}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n <Dialog :open=\"dialog?.type === 'share'\" @update:open=\"onDialogOpen\">\n <DialogContent data-slot=\"file-manager-dialog\">\n <template v-if=\"dialog?.type === 'share'\">\n <DialogHeader>\n <DialogTitle>{{\n tt('share_heading', { name: dialog.entry.name }, 'Share “:name”')\n }}</DialogTitle>\n <DialogDescription>{{\n tt('share_hint', {}, 'Anyone with the link can open this file, without signing in.')\n }}</DialogDescription>\n </DialogHeader>\n <div class=\"flex flex-wrap items-end gap-2\">\n <label class=\"flex min-w-40 flex-1 flex-col gap-1 text-sm\">\n <span class=\"font-medium\">{{ tt('share_expiry', {}, 'Link expires after') }}</span>\n <select v-model=\"expiry\" :class=\"SELECT\">\n <option\n v-for=\"minutes in share?.expiries ?? []\"\n :key=\"minutes\"\n :value=\"String(minutes)\"\n >\n {{ expiryLabel(minutes) }}\n </option>\n <option v-if=\"share?.publicLinks\" value=\"never\">\n {{ tt('expiry_never', {}, 'Never') }}\n </option>\n </select>\n </label>\n <Button\n type=\"button\"\n :disabled=\"state.busy\"\n @click=\"controller.createLink(expiry === 'never' ? null : Number(expiry))\"\n >\n <Spinner v-if=\"state.busy\" />\n <LinkIcon v-else aria-hidden=\"true\" />\n {{ tt('create_link', {}, 'Create link') }}\n </Button>\n </div>\n <p v-if=\"state.error\" class=\"text-destructive text-sm\" role=\"alert\">{{ state.error }}</p>\n <div v-if=\"dialog.url\" class=\"flex flex-col gap-1\">\n <span class=\"text-sm font-medium\">{{ tt('link', {}, 'Shareable link') }}</span>\n <div class=\"flex gap-2\">\n <Input\n readonly\n :model-value=\"dialog.url\"\n dir=\"ltr\"\n :aria-label=\"tt('link', {}, 'Shareable link')\"\n @focus=\"($event.target as HTMLInputElement).select()\"\n />\n <Button type=\"button\" variant=\"outline\" @click=\"copy(dialog.url ?? '')\">\n <CheckIcon v-if=\"copied\" aria-hidden=\"true\" />\n <CopyIcon v-else aria-hidden=\"true\" />\n {{\n copied ? tt('link_copied', {}, 'Link copied') : tt('copy_link', {}, 'Copy link')\n }}\n </Button>\n </div>\n <span class=\"text-muted-foreground text-xs\">\n {{\n dialog.expiresAt\n ? tt(\n 'link_expires',\n { date: formatter.dateTime(dialog.expiresAt) },\n 'Expires :date',\n )\n : tt('link_never_expires', {}, 'Never expires')\n }}\n </span>\n </div>\n <div v-if=\"share?.publicLinks\" class=\"flex flex-col gap-2\" data-slot=\"file-manager-links\">\n <h4 class=\"text-sm font-medium\">{{ tt('links', {}, 'Links') }}</h4>\n <Spinner v-if=\"dialog.links === null\" />\n <p v-else-if=\"dialog.links.length === 0\" class=\"text-muted-foreground text-sm\">\n {{ tt('no_links', {}, 'No links yet') }}\n </p>\n <ul v-else class=\"flex max-h-48 flex-col divide-y overflow-y-auto rounded-md border\">\n <li\n v-for=\"link in dialog.links\"\n :key=\"link.id\"\n class=\"flex items-center gap-2 px-3 py-2 text-sm\"\n >\n <div class=\"min-w-0 flex-1\">\n <p\n :class=\"cn('truncate', link.expired && 'text-muted-foreground line-through')\"\n dir=\"ltr\"\n >\n {{ link.url }}\n </p>\n <p class=\"text-muted-foreground text-xs\">\n {{\n link.expired\n ? tt('link_expired', {}, 'Expired')\n : link.expiresAt\n ? tt(\n 'link_expires',\n { date: formatter.dateTime(link.expiresAt) },\n 'Expires :date',\n )\n : tt('link_never_expires', {}, 'Never expires')\n }}\n ·\n {{\n choice('file-manager.link_downloads', link.downloads, {}, ':count downloads')\n }}\n </p>\n </div>\n <Button\n v-if=\"link.url && !link.expired\"\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n :aria-label=\"tt('copy_link', {}, 'Copy link')\"\n @click=\"copy(link.url ?? '')\"\n >\n <CopyIcon aria-hidden=\"true\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n class=\"text-destructive\"\n @click=\"controller.revokeLink(link.id)\"\n >\n {{ tt('revoke', {}, 'Revoke') }}\n </Button>\n </li>\n </ul>\n </div>\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" @click=\"close\">{{\n tt('close', {}, 'Close')\n }}</Button>\n </DialogFooter>\n </template>\n </DialogContent>\n </Dialog>\n\n <Dialog :open=\"preview !== null\" @update:open=\"(open) => !open && controller.closePreview()\">\n <DialogContent\n class=\"flex max-h-[90vh] flex-col sm:max-w-4xl\"\n data-slot=\"file-manager-preview\"\n @keydown=\"onPreviewKeyDown\"\n >\n <DialogHeader>\n <DialogTitle class=\"truncate pe-8\">{{ preview?.entry.name }}</DialogTitle>\n </DialogHeader>\n <div\n class=\"bg-muted/40 flex min-h-64 flex-1 items-center justify-center overflow-auto rounded-md\"\n >\n <Spinner v-if=\"!previewData\" />\n <div\n v-else-if=\"!previewData.previewable\"\n class=\"text-muted-foreground flex flex-col items-center gap-2 p-8 text-center text-sm\"\n >\n <FileManagerIcon v-if=\"preview\" :entry=\"preview.entry\" class=\"size-12\" />\n <p>{{ tt('preview_unavailable', {}, 'There is no preview for this type of file.') }}</p>\n </div>\n <img\n v-else-if=\"previewData.kind === 'image'\"\n :src=\"previewData.url\"\n :alt=\"preview?.entry.name ?? ''\"\n class=\"max-h-[70vh] max-w-full object-contain\"\n />\n <iframe\n v-else-if=\"previewData.kind === 'pdf'\"\n :src=\"previewData.url\"\n :title=\"preview?.entry.name ?? ''\"\n class=\"h-[70vh] w-full rounded-md bg-white\"\n />\n <video\n v-else-if=\"previewData.kind === 'video'\"\n :src=\"previewData.url\"\n controls\n class=\"max-h-[70vh] max-w-full\"\n >\n <track kind=\"captions\" />\n </video>\n <audio\n v-else-if=\"previewData.kind === 'audio'\"\n :src=\"previewData.url\"\n controls\n class=\"w-full max-w-md\"\n />\n <pre\n v-else\n class=\"h-full max-h-[70vh] w-full overflow-auto p-4 font-mono text-xs whitespace-pre-wrap\"\n dir=\"auto\"\n tabindex=\"0\"\n >{{ previewData.text }}</pre>\n </div>\n <p v-if=\"previewData?.truncated\" class=\"text-muted-foreground text-xs\">\n {{ tt('preview_truncated', {}, 'Only the beginning of this file is shown.') }}\n </p>\n <DialogFooter class=\"flex-row flex-wrap items-center sm:justify-between\">\n <div class=\"flex gap-1\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n :disabled=\"!previous\"\n :aria-label=\"tt('previous', {}, 'Previous file')\"\n @click=\"previous && controller.openPreview(previous)\"\n >\n <ChevronLeftIcon class=\"rtl:rotate-180\" aria-hidden=\"true\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n :disabled=\"!next\"\n :aria-label=\"tt('next', {}, 'Next file')\"\n @click=\"next && controller.openPreview(next)\"\n >\n <ChevronRightIcon class=\"rtl:rotate-180\" aria-hidden=\"true\" />\n </Button>\n </div>\n <div class=\"flex gap-2\">\n <Button\n v-if=\"previewData?.editable && previewData.url\"\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n @click=\"editImage\"\n >\n <SquarePenIcon aria-hidden=\"true\" />\n {{ tt('edit_image', {}, 'Edit image') }}\n </Button>\n <Button v-if=\"previewData?.downloadUrl\" type=\"button\" size=\"sm\" as-child>\n <a :href=\"previewData.downloadUrl\">\n <DownloadIcon aria-hidden=\"true\" />\n {{ tt('download', {}, 'Download') }}\n </a>\n </Button>\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n <ImageEditorDialog :request=\"editing\" :options=\"IMAGE_EDITOR\" />\n </Card>\n</template>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FileManagerView.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","Card","_unref","_withCtx","_createElementVNode","_toDisplayString","_createVNode","Button","_createElementBlock","_normalizeClass","_Fragment","_renderList","_createCommentVNode","Input","Checkbox","_createTextVNode","FileManagerTree","_mergeProps","_toHandlers","Spinner","FileManagerIcon","FileManagerDetails","Sheet","SheetContent","SheetHeader","SheetTitle","_normalizeStyle","Dialog","DialogContent","_withModifiers","DialogHeader","DialogTitle","DialogFooter","DialogDescription","_withDirectives","_vModelSelect","ImageEditorDialog","Button_default","Spinner_default","Checkbox_default","Input_default","Dialog_default","DialogContent_default","DialogDescription_default","DialogHeader_default","DialogTitle_default","Sheet_default","SheetContent_default","SheetHeader_default","SheetTitle_default","DialogFooter_default","Card_default","ImageEditorDialog_default","FileManagerIcon_default","FileManagerDetails_default","FileManagerTree_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","_hoisted_46","_hoisted_47","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_53","_hoisted_54","_hoisted_55","_hoisted_56","_hoisted_57","_hoisted_58","_hoisted_59","_hoisted_60","_hoisted_61","_hoisted_62","_hoisted_63","_hoisted_64","_hoisted_65","_hoisted_66","_hoisted_67","_hoisted_68","_hoisted_69","_hoisted_70","_hoisted_71","_hoisted_72","_hoisted_73","_hoisted_74","_hoisted_75","_hoisted_76","_hoisted_77","_hoisted_78","_hoisted_79","_hoisted_80","_hoisted_81","_hoisted_82","_hoisted_83","_hoisted_84","_hoisted_85","_hoisted_86","_hoisted_87","_hoisted_88","_hoisted_89","_hoisted_90","_hoisted_91","_hoisted_92","_hoisted_93","_hoisted_94","_hoisted_95","_hoisted_96","_hoisted_97","_hoisted_98","_hoisted_99","_hoisted_100","_hoisted_101","_hoisted_102","_hoisted_103","_hoisted_104","_hoisted_105","_hoisted_106","_hoisted_107","_hoisted_108","_hoisted_109","_hoisted_110","_hoisted_111","_hoisted_112","SELECT","FileManagerView_vue_vue_type_script_setup_true_lang_default","props","__props","SORT_FIELDS","IMAGE_EDITOR","runner","useActionRunner","page","usePageActionContext","panel","usePanel","t","useT","choice","useChoice","direction","useDirection","formatter","useFormatter","mobile","useIsMobile","labelId","useId","hintId","nameId","errorId","tt","key","replacements","fallback","environment","notifications","showToast","notification","clientErrorNotification","message","controller","FileManagerController","toRaw","state","useStore","watch","schema","onMounted","onBeforeUnmount","picker","computed","entries","selected","chosen","single","canWrite","focusPath","folderLabel","can","ability","listRef","ref","items","uploadInput","foldersOpen","pointer","broken","setItem","element","path","focusItem","nextTick","columns","onItemKeyDown","result","event","onItemClick","entry","onItemDoubleClick","copying","dropHandlers","target","onDragStart","openTreeFolder","onUpload","input","sizeOf","fileManagerSize","locationOf","thumbnailOf","markBroken","uploadsDone","upload","uploadsFinished","dialog","name","expiry","copied","share","current","close","onDialogOpen","open","submitName","submitTransfer","chooseDestination","submitDelete","expiryLabel","label","fileManagerExpiry","minutes","copy","url","preview","previewData","previous","next","editing","editImage","data","source","fetchEditableImage","edited","onPreviewKeyDown","back","forward","openBlock","createBlock","unref","withCtx","createElementVNode","toDisplayString","createVNode","_cache","FolderTreeIcon","createElementBlock","normalizeClass","$event","Fragment","renderList","disk","createCommentVNode","ChevronRightIcon","crumb","index","SearchIcon","createTextVNode","field","ArrowUpIcon","ArrowDownIcon","LayoutGridIcon","ListIcon","RefreshCwIcon","cn","FolderPlusIcon","UploadIcon","fileManagerAcceptAttribute","Trash2Icon","RotateCcwIcon","FolderOpenIcon","DownloadIcon","PencilIcon","FolderInputIcon","CopyIcon","Share2Icon","InfoIcon","XIcon","mergeProps","toHandlers","CheckIcon","normalizeStyle","withModifiers","withDirectives","vModelSelect","LinkIcon","link","ChevronLeftIcon","SquarePenIcon"],"sources":["../../../src/components/file-manager/FileManagerView.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type {\n FileManagerEntrySchema,\n FileManagerEnvironment,\n FileManagerSchema,\n FileManagerSortField,\n} from '@alfakit/core'\nimport {\n FileManagerController,\n clientErrorNotification,\n fetchEditableImage,\n fileManagerAcceptAttribute,\n fileManagerExpiry,\n fileManagerSize,\n} from '@alfakit/core'\nimport {\n ArrowDownIcon,\n ArrowUpIcon,\n CheckIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n CopyIcon,\n DownloadIcon,\n FolderInputIcon,\n FolderOpenIcon,\n FolderPlusIcon,\n FolderTreeIcon,\n InfoIcon,\n LayoutGridIcon,\n LinkIcon,\n ListIcon,\n PencilIcon,\n RefreshCwIcon,\n RotateCcwIcon,\n SearchIcon,\n Share2Icon,\n SquarePenIcon,\n Trash2Icon,\n UploadIcon,\n XIcon,\n} from '@lucide/vue'\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, toRaw, useId, watch } from 'vue'\nimport {\n useActionRunner,\n useChoice,\n useDirection,\n useFormatter,\n usePanel,\n useT,\n} from '../../context'\nimport { useIsMobile } from '../../composables/use-mobile'\nimport { useStore } from '../../composables/use-store'\nimport { cn } from '../../lib/utils'\nimport { usePageActionContext } from '../actions/action-context'\nimport ImageEditorDialog, { type ImageEditRequest } from '../fields/ImageEditorDialog.vue'\nimport { showToast } from '../notifications/flash-toasts'\nimport Button from '../ui/Button.vue'\nimport Card from '../ui/Card.vue'\nimport Checkbox from '../ui/Checkbox.vue'\nimport Dialog from '../ui/Dialog.vue'\nimport DialogContent from '../ui/DialogContent.vue'\nimport DialogDescription from '../ui/DialogDescription.vue'\nimport DialogFooter from '../ui/DialogFooter.vue'\nimport DialogHeader from '../ui/DialogHeader.vue'\nimport DialogTitle from '../ui/DialogTitle.vue'\nimport Input from '../ui/Input.vue'\nimport Sheet from '../ui/Sheet.vue'\nimport SheetContent from '../ui/SheetContent.vue'\nimport SheetHeader from '../ui/SheetHeader.vue'\nimport SheetTitle from '../ui/SheetTitle.vue'\nimport Spinner from '../ui/Spinner.vue'\nimport FileManagerDetails from './FileManagerDetails.vue'\nimport FileManagerIcon from './FileManagerIcon.vue'\nimport FileManagerTree from './FileManagerTree.vue'\n\n/**\n * The file manager of alfasix/alfakit-file-manager: a folder tree, breadcrumbs, grid and\n * list views, sorting, search, multi-selection with mouse and keyboard, drag and drop\n * (uploads and moves), uploads with progress, previews, details, sharing and the trash.\n * Everything is listed, checked and changed by the server.\n */\nconst props = defineProps<{\n schema: FileManagerSchema\n /** Picker: called with the chosen files. */\n onChoose?: (entries: FileManagerEntrySchema[]) => void\n onCancel?: () => void\n}>()\n\nconst SELECT =\n 'border-input focus-visible:border-ring focus-visible:ring-ring/50 h-9 min-w-0 rounded-md border bg-transparent px-2 text-sm shadow-xs outline-none focus-visible:ring-[3px]'\nconst SORT_FIELDS: FileManagerSortField[] = ['name', 'size', 'modified', 'type']\nconst IMAGE_EDITOR = { aspectRatios: [null], circle: false }\n\nconst runner = useActionRunner()\nconst page = usePageActionContext()\nconst panel = usePanel()\nconst t = useT()\nconst choice = useChoice()\nconst direction = useDirection()\nconst formatter = useFormatter()\nconst mobile = useIsMobile()\nconst labelId = useId()\nconst hintId = useId()\nconst nameId = useId()\nconst errorId = useId()\nconst tt = (key: string, replacements: Record<string, string | number> = {}, fallback?: string) =>\n t(`file-manager.${key}`, replacements, fallback)\n\nconst environment = (): FileManagerEnvironment => ({\n runner,\n token: page.token,\n uploadEndpoint: panel.value.endpoints.upload,\n uploadChunkEndpoint: panel.value.endpoints.uploadChunks,\n uploadChunkSize: panel.value.uploadChunkSize,\n t,\n choice,\n formatter: formatter.value,\n notify: (notifications) => notifications.forEach((notification) => showToast(notification)),\n error: (message) => showToast(clientErrorNotification('file-manager', message)),\n})\n\nconst controller = new FileManagerController(\n toRaw(props.schema),\n environment(),\n formatter.value.locale,\n)\nconst state = useStore(controller.store)\n\nwatch(\n () => props.schema,\n (schema) => controller.setSchema(toRaw(schema)),\n)\nwatch([formatter, direction], () => controller.setEnvironment(environment()))\n\nonMounted(() => {\n if (props.schema.mode === 'picker') void controller.ensureLoaded()\n})\nonBeforeUnmount(() => controller.dispose())\n\nconst picker = computed(() => props.schema.mode === 'picker')\nconst entries = computed(() => {\n void state.value\n\n return controller.visibleEntries()\n})\nconst selected = computed(() => {\n void state.value\n\n return controller.selectedEntries()\n})\nconst chosen = computed(() => {\n void state.value\n\n return controller.chosen()\n})\nconst single = computed(() => (selected.value.length === 1 ? selected.value[0] : undefined))\nconst canWrite = computed(() => !picker.value && !state.value.trash)\nconst focusPath = computed(() => state.value.focus ?? entries.value[0]?.path ?? null)\nconst folderLabel = computed(() =>\n state.value.trash\n ? tt('trash', {}, 'Trash')\n : (state.value.breadcrumbs[state.value.breadcrumbs.length - 1]?.name ??\n tt('root', {}, 'Files')),\n)\nconst can = (ability: Parameters<FileManagerController['can']>[0]) => controller.can(ability)\n\nconst listRef = ref<HTMLElement | null>(null)\nconst items = new Map<string, HTMLElement>()\nconst uploadInput = ref<HTMLInputElement | null>(null)\nconst foldersOpen = ref(false)\nconst pointer = ref('mouse')\nconst broken = ref(new Set<string>())\n\nconst setItem = (path: string) => (element: unknown) => {\n if (element instanceof HTMLElement) items.set(path, element)\n else items.delete(path)\n}\n\nconst focusItem = (path: string | undefined) => {\n if (path) void nextTick(() => items.get(path)?.focus())\n}\n\nconst columns = () => {\n const element = listRef.value\n\n if (!element || state.value.view !== 'grid' || typeof getComputedStyle === 'undefined') return 1\n\n return Math.max(\n 1,\n getComputedStyle(element).gridTemplateColumns.split(' ').filter(Boolean).length,\n )\n}\n\nconst onItemKeyDown = (event: KeyboardEvent) => {\n const result = controller.handleKey(event, columns(), direction.value)\n\n if (result.handled) {\n event.preventDefault()\n focusItem(result.focus)\n }\n}\n\nconst onItemClick = (entry: FileManagerEntrySchema, event: MouseEvent) =>\n controller.click(entry.path, {\n shift: event.shiftKey,\n toggle: event.metaKey || event.ctrlKey,\n touch: pointer.value === 'touch',\n })\n\nconst onItemDoubleClick = (entry: FileManagerEntrySchema) => {\n if (picker.value && entry.type === 'file') {\n if (entry.selectable !== false && entry.value) props.onChoose?.([entry])\n\n return\n }\n\n controller.openEntry(entry)\n}\n\nconst copying = (event: DragEvent) => event.ctrlKey || event.altKey || event.metaKey\n\nconst dropHandlers = (target: string) => ({\n dragover: (event: DragEvent) => {\n if (event.dataTransfer && controller.dragOver(target, event.dataTransfer, copying(event))) {\n event.preventDefault()\n event.stopPropagation()\n }\n },\n dragleave: (event: DragEvent) => {\n const current = event.currentTarget as HTMLElement | null\n\n if (!current?.contains(event.relatedTarget as Node | null)) controller.dragLeave(target)\n },\n drop: (event: DragEvent) => {\n event.preventDefault()\n event.stopPropagation()\n\n if (event.dataTransfer) void controller.drop(target, event.dataTransfer, copying(event))\n },\n})\n\nconst onDragStart = (entry: FileManagerEntrySchema, event: DragEvent) => {\n if (event.dataTransfer) controller.dragStart(entry.path, event.dataTransfer)\n}\n\nconst openTreeFolder = (path: string) => {\n foldersOpen.value = false\n void controller.open(path)\n}\n\nconst onUpload = (event: Event) => {\n const input = event.target as HTMLInputElement\n\n if (input.files) void controller.upload(Array.from(input.files))\n input.value = ''\n}\n\nconst sizeOf = (entry: FileManagerEntrySchema) =>\n entry.type === 'file' ? fileManagerSize(entry.size, formatter.value) : ''\nconst locationOf = (entry: FileManagerEntrySchema) =>\n state.value.results !== null && entry.path.includes('/')\n ? entry.path.slice(0, entry.path.lastIndexOf('/'))\n : null\nconst thumbnailOf = (entry: FileManagerEntrySchema) =>\n entry.thumbnail && !broken.value.has(entry.path) ? entry.thumbnail : null\nconst markBroken = (path: string) => {\n broken.value = new Set([...broken.value, path])\n}\n\n// ---------------------------------------------------------------- Uploads\n\nconst uploadsDone = computed(\n () => state.value.uploads.filter((upload) => upload.status === 'done').length,\n)\nconst uploadsFinished = computed(() =>\n state.value.uploads.every((upload) => upload.status === 'done' || upload.status === 'error'),\n)\n\n// ---------------------------------------------------------------- Dialogs\n\nconst dialog = computed(() => state.value.dialog)\nconst name = ref('')\nconst expiry = ref('')\nconst copied = ref(false)\nconst share = computed(() => props.schema.share)\n\nwatch(\n () =>\n [\n dialog.value?.type,\n dialog.value && 'entry' in dialog.value ? dialog.value.entry.path : null,\n ] as const,\n () => {\n const current = dialog.value\n\n if (current?.type === 'rename') name.value = current.entry.name\n if (current?.type === 'createFolder') name.value = ''\n if (current?.type === 'share') {\n expiry.value = String(share.value?.expiries[0] ?? '')\n copied.value = false\n }\n },\n)\n\nconst close = () => controller.closeDialog()\nconst onDialogOpen = (open: boolean) => {\n if (!open) close()\n}\n\nconst submitName = () => {\n const current = dialog.value\n\n if (current?.type === 'rename') void controller.rename(current.entry.path, name.value)\n else void controller.createFolder(name.value)\n}\n\nconst submitTransfer = () => {\n const current = dialog.value\n\n if (current?.type === 'move' || current?.type === 'copy')\n void controller.transfer(current.type, current.paths, current.destination)\n}\n\nconst chooseDestination = (path: string) => {\n const current = dialog.value\n\n if (current?.type === 'move' || current?.type === 'copy')\n controller.openDialog({ ...current, destination: path })\n}\n\nconst submitDelete = () => {\n const current = dialog.value\n\n if (current?.type === 'delete') void controller.remove(current.paths)\n else void controller.emptyTrash()\n}\n\nconst expiryLabel = (minutes: number) => {\n const label = fileManagerExpiry(minutes)\n\n return choice(`file-manager.${label.key}`, label.count, {}, ':count')\n}\n\nconst copy = async (url: string) => {\n try {\n await navigator.clipboard.writeText(url)\n copied.value = true\n } catch {\n copied.value = false\n }\n}\n\n// ---------------------------------------------------------------- Preview\n\nconst preview = computed(() => state.value.preview)\nconst previewData = computed(() => preview.value?.data ?? null)\nconst previous = computed(() => {\n void state.value.preview\n\n return controller.previewSibling(-1)\n})\nconst next = computed(() => {\n void state.value.preview\n\n return controller.previewSibling(1)\n})\nconst editing = ref<ImageEditRequest | null>(null)\n\nconst editImage = async () => {\n const data = previewData.value\n const current = preview.value\n\n if (!data?.url || !current) return\n\n const source = await fetchEditableImage(data.url, current.entry.name)\n\n if (!source) return\n\n editing.value = {\n file: source,\n resolve: (edited) => {\n editing.value = null\n if (edited && edited !== source) void controller.saveEditedImage(edited)\n },\n }\n}\n\nconst onPreviewKeyDown = (event: KeyboardEvent) => {\n const back = direction.value === 'rtl' ? 'ArrowRight' : 'ArrowLeft'\n const forward = direction.value === 'rtl' ? 'ArrowLeft' : 'ArrowRight'\n\n if (\n event.target instanceof HTMLElement &&\n ['VIDEO', 'AUDIO', 'INPUT'].includes(event.target.tagName)\n )\n return\n\n if (event.key === back && previous.value) void controller.openPreview(previous.value)\n if (event.key === forward && next.value) void controller.openPreview(next.value)\n}\n</script>\n\n<template>\n <Card\n class=\"relative gap-0 overflow-hidden py-0\"\n data-slot=\"file-manager\"\n :data-view=\"state.view\"\n :data-mode=\"schema.mode\"\n :aria-labelledby=\"labelId\"\n >\n <span :id=\"labelId\" class=\"sr-only\">{{ tt('label', {}, 'File manager') }}</span>\n <div class=\"sr-only\" role=\"status\" aria-live=\"polite\">{{ state.announcement }}</div>\n\n <div class=\"flex flex-wrap items-center gap-2 border-b p-3\" data-slot=\"file-manager-toolbar\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n class=\"md:hidden\"\n :aria-label=\"tt('toggle_folders', {}, 'Show folders')\"\n @click=\"foldersOpen = true\"\n >\n <FolderTreeIcon aria-hidden=\"true\" />\n </Button>\n <label v-if=\"schema.disks.length > 1\" class=\"flex items-center\">\n <span class=\"sr-only\">{{ tt('disk', {}, 'Storage') }}</span>\n <select\n :class=\"SELECT\"\n :value=\"state.disk\"\n @change=\"controller.setDisk(($event.target as HTMLSelectElement).value)\"\n >\n <option v-for=\"disk in schema.disks\" :key=\"disk.name\" :value=\"disk.name\">\n {{ disk.label }}\n </option>\n </select>\n </label>\n <nav\n :aria-label=\"tt('breadcrumb', {}, 'Folder path')\"\n class=\"min-w-0 flex-[1_1_12rem]\"\n data-slot=\"file-manager-breadcrumb\"\n >\n <ol class=\"flex min-w-0 flex-wrap items-center gap-1 text-sm\">\n <li class=\"flex items-center\">\n <button\n type=\"button\"\n class=\"hover:bg-accent rounded px-1.5 py-1 font-medium\"\n :aria-current=\"!state.trash && state.path === '' ? 'page' : undefined\"\n @click=\"state.trash ? controller.showTrash(false) : controller.open('')\"\n >\n {{ tt('root', {}, 'Files') }}\n </button>\n </li>\n <li v-if=\"state.trash\" class=\"flex min-w-0 items-center gap-1\">\n <ChevronRightIcon\n class=\"text-muted-foreground size-3.5 shrink-0 rtl:rotate-180\"\n aria-hidden=\"true\"\n />\n <span class=\"truncate px-1.5 py-1 font-medium\" aria-current=\"page\">{{\n tt('trash', {}, 'Trash')\n }}</span>\n </li>\n <template v-else>\n <li\n v-for=\"(crumb, index) in state.breadcrumbs\"\n :key=\"crumb.path\"\n class=\"flex min-w-0 items-center gap-1\"\n >\n <ChevronRightIcon\n class=\"text-muted-foreground size-3.5 shrink-0 rtl:rotate-180\"\n aria-hidden=\"true\"\n />\n <span\n v-if=\"index === state.breadcrumbs.length - 1\"\n class=\"truncate px-1.5 py-1 font-medium\"\n aria-current=\"page\"\n >\n {{ crumb.name }}\n </span>\n <button\n v-else\n type=\"button\"\n class=\"hover:bg-accent truncate rounded px-1.5 py-1\"\n @click=\"controller.open(crumb.path)\"\n >\n {{ crumb.name }}\n </button>\n </li>\n </template>\n </ol>\n </nav>\n <div class=\"flex w-full flex-wrap items-center gap-2 sm:w-auto\">\n <div class=\"relative min-w-40 flex-1 sm:flex-none\">\n <SearchIcon\n class=\"text-muted-foreground pointer-events-none absolute start-2.5 top-1/2 size-4 -translate-y-1/2\"\n aria-hidden=\"true\"\n />\n <Input\n type=\"search\"\n :model-value=\"state.query\"\n :placeholder=\"tt('search_placeholder', {}, 'Search…')\"\n :aria-label=\"tt('search', {}, 'Search in this folder')\"\n class=\"h-9 ps-8 sm:w-52\"\n :disabled=\"state.trash\"\n @update:model-value=\"controller.setQuery(String($event))\"\n />\n </div>\n <label\n v-if=\"schema.search.recursive && !state.trash\"\n class=\"flex items-center gap-2 text-sm\"\n >\n <Checkbox\n :model-value=\"state.recursive\"\n @update:model-value=\"controller.setRecursive($event === true)\"\n />\n {{ tt('search_everywhere', {}, 'Include subfolders') }}\n </label>\n <label class=\"flex items-center gap-1\">\n <span class=\"sr-only\">{{ tt('sort', {}, 'Sort by') }}</span>\n <select\n :class=\"SELECT\"\n :value=\"state.sort.field\"\n @change=\"\n controller.setSort(\n ($event.target as HTMLSelectElement).value as FileManagerSortField,\n state.sort.direction,\n )\n \"\n >\n <option v-for=\"field in SORT_FIELDS\" :key=\"field\" :value=\"field\">\n {{ tt(`sort_${field}`, {}, field) }}\n </option>\n </select>\n </label>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n :aria-label=\"\n state.sort.direction === 'asc'\n ? tt('ascending', {}, 'Ascending')\n : tt('descending', {}, 'Descending')\n \"\n @click=\"\n controller.setSort(state.sort.field, state.sort.direction === 'asc' ? 'desc' : 'asc')\n \"\n >\n <ArrowUpIcon v-if=\"state.sort.direction === 'asc'\" aria-hidden=\"true\" />\n <ArrowDownIcon v-else aria-hidden=\"true\" />\n </Button>\n <div class=\"flex rounded-md border\" role=\"group\" :aria-label=\"tt('view', {}, 'View')\">\n <Button\n type=\"button\"\n :variant=\"state.view === 'grid' ? 'secondary' : 'ghost'\"\n size=\"icon-sm\"\n :aria-pressed=\"state.view === 'grid'\"\n :aria-label=\"tt('view_grid', {}, 'Grid')\"\n @click=\"controller.setView('grid')\"\n >\n <LayoutGridIcon aria-hidden=\"true\" />\n </Button>\n <Button\n type=\"button\"\n :variant=\"state.view === 'list' ? 'secondary' : 'ghost'\"\n size=\"icon-sm\"\n :aria-pressed=\"state.view === 'list'\"\n :aria-label=\"tt('view_list', {}, 'List')\"\n @click=\"controller.setView('list')\"\n >\n <ListIcon aria-hidden=\"true\" />\n </Button>\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n :aria-label=\"tt('refresh', {}, 'Refresh')\"\n @click=\"controller.refresh()\"\n >\n <RefreshCwIcon aria-hidden=\"true\" :class=\"cn(state.loading && 'animate-spin')\" />\n </Button>\n <Button\n v-if=\"!state.trash && can('createFolder')\"\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n @click=\"controller.openDialog({ type: 'createFolder' })\"\n >\n <FolderPlusIcon aria-hidden=\"true\" />\n <span class=\"max-sm:sr-only\">{{ tt('new_folder', {}, 'New folder') }}</span>\n </Button>\n <template v-if=\"!state.trash && can('upload') && schema.upload\">\n <Button type=\"button\" size=\"sm\" @click=\"uploadInput?.click()\">\n <UploadIcon aria-hidden=\"true\" />\n <span class=\"max-sm:sr-only\">{{ tt('upload', {}, 'Upload') }}</span>\n </Button>\n <input\n ref=\"uploadInput\"\n type=\"file\"\n multiple\n hidden\n :accept=\"fileManagerAcceptAttribute(schema.upload.accept)\"\n data-slot=\"file-manager-upload-input\"\n @change=\"onUpload\"\n />\n </template>\n <Button\n v-if=\"schema.trash && !picker\"\n type=\"button\"\n :variant=\"state.trash ? 'secondary' : 'ghost'\"\n size=\"sm\"\n :aria-pressed=\"state.trash\"\n @click=\"controller.showTrash(!state.trash)\"\n >\n <Trash2Icon aria-hidden=\"true\" />\n <span class=\"max-sm:sr-only\">{{\n state.trash ? tt('back_to_files', {}, 'Back to files') : tt('trash', {}, 'Trash')\n }}</span>\n </Button>\n </div>\n </div>\n\n <div\n v-if=\"selected.length > 0 && !picker\"\n class=\"bg-muted/50 flex flex-wrap items-center gap-1 border-b px-3 py-2 text-sm\"\n data-slot=\"file-manager-selection\"\n >\n <span class=\"me-2 font-medium\">{{\n tt('selected', { count: selected.length }, ':count selected')\n }}</span>\n <template v-if=\"state.trash\">\n <Button\n v-if=\"can('restore')\"\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n @click=\"controller.restore()\"\n >\n <RotateCcwIcon aria-hidden=\"true\" />\n <span class=\"max-md:sr-only\">{{ tt('restore', {}, 'Restore') }}</span>\n </Button>\n <Button\n v-if=\"can('delete')\"\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n class=\"text-destructive hover:text-destructive\"\n @click=\"controller.confirmDelete()\"\n >\n <Trash2Icon aria-hidden=\"true\" />\n <span class=\"max-md:sr-only\">{{\n tt('delete_permanently', {}, 'Delete permanently')\n }}</span>\n </Button>\n </template>\n <template v-else>\n <Button\n v-if=\"single\"\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n @click=\"controller.openEntry(single)\"\n >\n <FolderOpenIcon v-if=\"single.type === 'folder'\" aria-hidden=\"true\" />\n <SearchIcon v-else aria-hidden=\"true\" />\n <span class=\"max-md:sr-only\">{{\n single.type === 'folder' ? tt('open', {}, 'Open') : tt('preview', {}, 'Preview')\n }}</span>\n </Button>\n <Button\n v-if=\"can('download') && (single?.type === 'file' || can('zip'))\"\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n @click=\"controller.download()\"\n >\n <DownloadIcon aria-hidden=\"true\" />\n <span class=\"max-md:sr-only\">{{\n single?.type === 'file'\n ? tt('download', {}, 'Download')\n : tt('download_zip', {}, 'Download as zip')\n }}</span>\n </Button>\n <Button\n v-if=\"single && can('rename')\"\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n @click=\"controller.openDialog({ type: 'rename', entry: single })\"\n >\n <PencilIcon aria-hidden=\"true\" />\n <span class=\"max-md:sr-only\">{{ tt('rename', {}, 'Rename') }}</span>\n </Button>\n <Button\n v-if=\"can('move')\"\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n @click=\"\n controller.openDialog({ type: 'move', paths: state.selection, destination: state.path })\n \"\n >\n <FolderInputIcon aria-hidden=\"true\" />\n <span class=\"max-md:sr-only\">{{ tt('move', {}, 'Move') }}</span>\n </Button>\n <Button\n v-if=\"can('copy')\"\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n @click=\"\n controller.openDialog({ type: 'copy', paths: state.selection, destination: state.path })\n \"\n >\n <CopyIcon aria-hidden=\"true\" />\n <span class=\"max-md:sr-only\">{{ tt('copy', {}, 'Copy') }}</span>\n </Button>\n <Button\n v-if=\"single?.type === 'file' && can('share') && schema.share\"\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n @click=\"controller.openShare(single)\"\n >\n <Share2Icon aria-hidden=\"true\" />\n <span class=\"max-md:sr-only\">{{ tt('share', {}, 'Share') }}</span>\n </Button>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" @click=\"controller.showDetails(single)\">\n <InfoIcon aria-hidden=\"true\" />\n <span class=\"max-md:sr-only\">{{ tt('details', {}, 'Details') }}</span>\n </Button>\n <Button\n v-if=\"can('delete')\"\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n class=\"text-destructive hover:text-destructive\"\n @click=\"controller.confirmDelete()\"\n >\n <Trash2Icon aria-hidden=\"true\" />\n <span class=\"max-md:sr-only\">{{ tt('delete', {}, 'Delete') }}</span>\n </Button>\n </template>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n class=\"ms-auto\"\n :aria-label=\"tt('clear_selection', {}, 'Clear selection')\"\n @click=\"controller.clearSelection()\"\n >\n <XIcon aria-hidden=\"true\" />\n </Button>\n </div>\n\n <div :class=\"cn('flex', picker ? 'h-[60vh]' : 'min-h-[28rem]')\">\n <aside\n class=\"hidden w-60 shrink-0 overflow-y-auto border-e p-2 md:block\"\n data-slot=\"file-manager-sidebar\"\n >\n <FileManagerTree\n :controller=\"controller\"\n :active=\"state.trash ? null : state.path\"\n :drop-handlers=\"canWrite ? dropHandlers : undefined\"\n @open=\"openTreeFolder\"\n />\n </aside>\n\n <div\n class=\"relative min-w-0 flex-1 overflow-y-auto\"\n data-slot=\"file-manager-content\"\n :data-drop-target=\"state.dropTarget === '' ? '' : undefined\"\n v-on=\"canWrite ? dropHandlers('') : {}\"\n >\n <p\n v-if=\"state.trash && state.retentionDays\"\n class=\"text-muted-foreground border-b px-4 py-2 text-xs\"\n >\n {{\n tt(\n 'trash_hint',\n { days: state.retentionDays },\n 'Items in the trash are deleted for good after :days days.',\n )\n }}\n </p>\n <p\n v-if=\"state.truncated || state.resultsTruncated\"\n class=\"text-muted-foreground border-b px-4 py-2 text-xs\"\n role=\"note\"\n >\n {{\n state.resultsTruncated\n ? tt('search_truncated', {}, 'Only the first results are shown. Refine your search.')\n : tt('truncated', {}, 'This folder has more items than can be shown here.')\n }}\n </p>\n <p :id=\"hintId\" class=\"sr-only\">\n {{\n tt('keyboard', {}, 'Arrow keys move between items, Shift selects a range, Enter opens.')\n }}\n </p>\n\n <div\n v-if=\"(state.loading || state.searching) && entries.length === 0\"\n class=\"flex justify-center py-16\"\n >\n <Spinner />\n <span class=\"sr-only\">{{ tt('loading', {}, 'Loading files') }}</span>\n </div>\n <div\n v-else-if=\"entries.length === 0\"\n class=\"text-muted-foreground flex flex-col items-center gap-2 px-6 py-16 text-center text-sm\"\n data-slot=\"file-manager-empty\"\n >\n <FolderOpenIcon class=\"size-10 opacity-40\" aria-hidden=\"true\" />\n <p class=\"text-foreground font-medium\">\n {{\n state.query\n ? tt('no_results', {}, 'Nothing matches your search')\n : state.trash\n ? tt('empty_trash_state', {}, 'The trash is empty')\n : tt('empty', {}, 'This folder is empty')\n }}\n </p>\n <p v-if=\"!state.query && canWrite && can('upload')\">\n {{ tt('empty_hint', {}, 'Drop files here or choose Upload.') }}\n </p>\n </div>\n <div\n v-else\n ref=\"listRef\"\n role=\"listbox\"\n :aria-multiselectable=\"!picker || schema.multiple === true\"\n :aria-labelledby=\"labelId\"\n :aria-describedby=\"hintId\"\n :aria-busy=\"state.loading || undefined\"\n data-slot=\"file-manager-items\"\n :class=\"\n cn(\n state.view === 'grid'\n ? 'grid grid-cols-2 gap-3 p-3 sm:grid-cols-3 lg:grid-cols-4 xl:grid-cols-6'\n : 'flex flex-col p-1',\n state.loading && 'opacity-60',\n )\n \"\n >\n <div\n v-if=\"state.view === 'list'\"\n class=\"text-muted-foreground hidden grid-cols-[1fr_7rem_10rem] gap-3 px-3 py-1.5 text-xs font-medium sm:grid\"\n aria-hidden=\"true\"\n >\n <span>{{ tt('name', {}, 'Name') }}</span>\n <span class=\"text-end\">{{ tt('size', {}, 'Size') }}</span>\n <span>{{ tt('modified', {}, 'Modified') }}</span>\n </div>\n <div\n v-for=\"entry in entries\"\n :key=\"entry.path\"\n :ref=\"setItem(entry.path)\"\n role=\"option\"\n :aria-label=\"entry.name\"\n :aria-selected=\"state.selection.includes(entry.path)\"\n :aria-disabled=\"\n (picker && entry.type === 'file' && entry.selectable === false) || undefined\n \"\n :tabindex=\"entry.path === focusPath ? 0 : -1\"\n :draggable=\"canWrite && (can('move') || can('copy'))\"\n data-slot=\"file-manager-item\"\n :data-type=\"entry.type\"\n :data-kind=\"entry.kind\"\n :data-selected=\"state.selection.includes(entry.path) ? '' : undefined\"\n :data-drop-target=\"state.dropTarget === entry.path ? '' : undefined\"\n :title=\"entry.name\"\n :class=\"\n cn(\n 'group focus-visible:ring-ring/50 relative cursor-default rounded-lg outline-none select-none focus-visible:ring-[3px]',\n state.view === 'grid'\n ? 'hover:bg-accent/50 flex flex-col gap-2 border p-2'\n : 'hover:bg-accent/50 grid grid-cols-[auto_1fr] items-center gap-3 px-3 py-2 sm:grid-cols-[auto_1fr_7rem_10rem]',\n state.selection.includes(entry.path) &&\n 'bg-primary/10 border-primary/40 hover:bg-primary/15',\n state.dropTarget === entry.path && 'ring-primary ring-2',\n picker && entry.type === 'file' && entry.selectable === false && 'opacity-50',\n )\n \"\n v-on=\"entry.type === 'folder' && canWrite ? dropHandlers(entry.path) : {}\"\n @pointerdown=\"pointer = $event.pointerType\"\n @click=\"onItemClick(entry, $event)\"\n @dblclick=\"onItemDoubleClick(entry)\"\n @keydown=\"onItemKeyDown\"\n @focus=\"controller.focus(entry.path)\"\n @dragstart=\"onDragStart(entry, $event)\"\n @dragend=\"controller.dragEnd()\"\n >\n <template v-if=\"state.view === 'grid'\">\n <div\n class=\"bg-muted/60 flex aspect-[4/3] items-center justify-center overflow-hidden rounded-md\"\n >\n <img\n v-if=\"thumbnailOf(entry)\"\n :src=\"thumbnailOf(entry) ?? undefined\"\n alt=\"\"\n loading=\"lazy\"\n :draggable=\"false\"\n class=\"size-full object-cover\"\n @error=\"markBroken(entry.path)\"\n />\n <FileManagerIcon v-else :entry=\"entry\" class=\"size-10\" />\n </div>\n <div class=\"min-w-0 px-0.5\">\n <p class=\"truncate text-sm font-medium\">{{ entry.name }}</p>\n <p class=\"text-muted-foreground truncate text-xs\">\n {{\n locationOf(entry) ??\n (entry.type === 'folder' ? tt('kinds.folder', {}, 'Folder') : sizeOf(entry))\n }}\n </p>\n </div>\n </template>\n <template v-else>\n <img\n v-if=\"thumbnailOf(entry)\"\n :src=\"thumbnailOf(entry) ?? undefined\"\n alt=\"\"\n loading=\"lazy\"\n :draggable=\"false\"\n class=\"size-8 rounded object-cover\"\n @error=\"markBroken(entry.path)\"\n />\n <FileManagerIcon v-else :entry=\"entry\" class=\"size-5\" />\n <div class=\"min-w-0\">\n <p class=\"truncate text-sm font-medium\">{{ entry.name }}</p>\n <p v-if=\"locationOf(entry)\" class=\"text-muted-foreground truncate text-xs\">\n {{ locationOf(entry) }}\n </p>\n </div>\n <span class=\"text-muted-foreground hidden text-end text-sm tabular-nums sm:block\">{{\n sizeOf(entry)\n }}</span>\n <span class=\"text-muted-foreground hidden truncate text-sm sm:block\">\n {{ entry.modified ? formatter.dateTime(entry.modified) : '' }}\n </span>\n </template>\n <CheckIcon\n v-if=\"state.selection.includes(entry.path)\"\n class=\"bg-primary text-primary-foreground absolute end-1.5 top-1.5 size-4 rounded-full p-0.5\"\n aria-hidden=\"true\"\n />\n </div>\n </div>\n\n <div\n v-if=\"state.dropTarget === ''\"\n class=\"border-primary bg-primary/5 text-primary pointer-events-none absolute inset-2 flex items-center justify-center rounded-lg border-2 border-dashed text-sm font-medium\"\n data-slot=\"file-manager-drop\"\n >\n {{ tt('drop_here', { folder: folderLabel }, 'Drop files to upload them to :folder') }}\n </div>\n </div>\n\n <aside\n v-if=\"state.detailsOpen\"\n class=\"hidden w-72 shrink-0 overflow-y-auto border-s md:block\"\n data-slot=\"file-manager-details\"\n >\n <FileManagerDetails :controller=\"controller\" />\n </aside>\n </div>\n\n <div\n v-if=\"state.trash && entries.length > 0 && can('delete')\"\n class=\"flex justify-end border-t p-3\"\n >\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n @click=\"controller.openDialog({ type: 'emptyTrash' })\"\n >\n <Trash2Icon aria-hidden=\"true\" />\n {{ tt('empty_trash', {}, 'Empty trash') }}\n </Button>\n </div>\n\n <div\n v-if=\"picker\"\n class=\"flex flex-wrap items-center justify-end gap-2 border-t p-3\"\n data-slot=\"file-manager-picker-footer\"\n >\n <span class=\"text-muted-foreground me-auto text-sm\">\n {{ selected.length > 0 ? tt('selected', { count: chosen.length }, ':count selected') : '' }}\n </span>\n <Button type=\"button\" variant=\"outline\" @click=\"onCancel?.()\">{{\n tt('cancel', {}, 'Cancel')\n }}</Button>\n <Button type=\"button\" :disabled=\"chosen.length === 0\" @click=\"onChoose?.(chosen)\">\n <CheckIcon aria-hidden=\"true\" />\n {{ tt('picker_choose', {}, 'Choose') }}\n </Button>\n </div>\n\n <Sheet :open=\"foldersOpen\" @update:open=\"foldersOpen = $event\">\n <SheetContent :side=\"direction === 'rtl' ? 'right' : 'left'\" class=\"p-4\">\n <SheetHeader class=\"p-0\">\n <SheetTitle>{{ tt('folders', {}, 'Folders') }}</SheetTitle>\n </SheetHeader>\n <FileManagerTree\n :controller=\"controller\"\n :active=\"state.trash ? null : state.path\"\n :drop-handlers=\"canWrite ? dropHandlers : undefined\"\n @open=\"openTreeFolder\"\n />\n </SheetContent>\n </Sheet>\n\n <Sheet\n :open=\"state.detailsOpen && mobile\"\n @update:open=\"(open) => !open && controller.closeDetails()\"\n >\n <SheetContent :side=\"direction === 'rtl' ? 'left' : 'right'\" class=\"p-0\">\n <SheetHeader>\n <SheetTitle>{{ tt('details', {}, 'Details') }}</SheetTitle>\n </SheetHeader>\n <FileManagerDetails :controller=\"controller\" hide-heading />\n </SheetContent>\n </Sheet>\n\n <section\n v-if=\"state.uploads.length > 0\"\n class=\"bg-popover fixed end-4 bottom-4 z-40 flex max-h-80 w-[min(22rem,calc(100vw-2rem))] flex-col overflow-hidden rounded-lg border shadow-lg\"\n :aria-label=\"tt('uploads', {}, 'Uploads')\"\n data-slot=\"file-manager-uploads\"\n >\n <header class=\"flex items-center gap-2 border-b px-3 py-2 text-sm font-medium\">\n <UploadIcon class=\"size-4\" aria-hidden=\"true\" />\n <span class=\"flex-1\" role=\"status\">\n {{\n tt(\n 'uploads_summary',\n { done: uploadsDone, total: state.uploads.length },\n ':done of :total uploaded',\n )\n }}\n </span>\n <Button\n v-if=\"uploadsFinished\"\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n :aria-label=\"tt('dismiss', {}, 'Dismiss')\"\n @click=\"controller.clearUploads()\"\n >\n <XIcon aria-hidden=\"true\" />\n </Button>\n </header>\n <ul class=\"flex flex-col gap-2 overflow-y-auto p-3\">\n <li\n v-for=\"upload in state.uploads\"\n :key=\"upload.id\"\n class=\"flex flex-col gap-1 text-sm\"\n :data-status=\"upload.status\"\n >\n <div class=\"flex items-center gap-2\">\n <span class=\"min-w-0 flex-1 truncate\">{{ upload.name }}</span>\n <CheckIcon\n v-if=\"upload.status === 'done'\"\n class=\"size-4 text-emerald-600\"\n :aria-label=\"tt('upload_done', {}, 'Uploaded')\"\n />\n <Button\n v-else-if=\"upload.status === 'error'\"\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n :aria-label=\"tt('dismiss', {}, 'Dismiss')\"\n @click=\"controller.dismissUpload(upload.id)\"\n >\n <XIcon aria-hidden=\"true\" />\n </Button>\n <span v-else class=\"text-muted-foreground text-xs tabular-nums\">{{\n formatter.percent(upload.progress)\n }}</span>\n </div>\n <p v-if=\"upload.status === 'error'\" class=\"text-destructive text-xs\" role=\"alert\">\n {{ upload.error ?? tt('upload_failed', {}, 'Failed') }}\n </p>\n <div\n v-else-if=\"upload.status !== 'done'\"\n role=\"progressbar\"\n :aria-valuemin=\"0\"\n :aria-valuemax=\"100\"\n :aria-valuenow=\"Math.round(upload.progress * 100)\"\n :aria-label=\"\n tt(\n 'upload_progress',\n { name: upload.name, percent: formatter.percent(upload.progress) },\n ':name, :percent uploaded',\n )\n \"\n class=\"bg-muted h-1.5 overflow-hidden rounded-full\"\n >\n <div\n class=\"bg-primary h-full rounded-full transition-[width]\"\n :style=\"{ width: `${upload.progress * 100}%` }\"\n />\n </div>\n </li>\n </ul>\n </section>\n\n <Dialog\n :open=\"dialog?.type === 'createFolder' || dialog?.type === 'rename'\"\n @update:open=\"onDialogOpen\"\n >\n <DialogContent data-slot=\"file-manager-dialog\">\n <form class=\"flex flex-col gap-4\" @submit.prevent=\"submitName\">\n <DialogHeader>\n <DialogTitle>\n {{\n dialog?.type === 'rename'\n ? tt('rename_heading', { name: dialog.entry.name }, 'Rename “:name”')\n : tt('new_folder', {}, 'New folder')\n }}\n </DialogTitle>\n </DialogHeader>\n <div class=\"flex flex-col gap-2\">\n <label :for=\"nameId\" class=\"text-sm font-medium\">\n {{\n dialog?.type === 'rename'\n ? tt('name', {}, 'Name')\n : tt('folder_name', {}, 'Folder name')\n }}\n </label>\n <Input\n :id=\"nameId\"\n v-model=\"name\"\n autofocus\n :aria-invalid=\"state.error ? true : undefined\"\n :aria-describedby=\"state.error ? errorId : undefined\"\n />\n <p v-if=\"state.error\" :id=\"errorId\" class=\"text-destructive text-sm\" role=\"alert\">\n {{ state.error }}\n </p>\n </div>\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" @click=\"close\">{{\n tt('cancel', {}, 'Cancel')\n }}</Button>\n <Button type=\"submit\" :disabled=\"state.busy || name.trim() === ''\">\n <Spinner v-if=\"state.busy\" />\n {{ dialog?.type === 'rename' ? tt('save', {}, 'Save') : tt('create', {}, 'Create') }}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n\n <Dialog :open=\"dialog?.type === 'move' || dialog?.type === 'copy'\" @update:open=\"onDialogOpen\">\n <DialogContent data-slot=\"file-manager-dialog\">\n <DialogHeader>\n <DialogTitle>\n {{\n dialog?.type === 'move' || dialog?.type === 'copy'\n ? choice(\n `file-manager.${dialog.type}_heading`,\n dialog.paths.length,\n {},\n dialog.type === 'move' ? 'Move :count items' : 'Copy :count items',\n )\n : ''\n }}\n </DialogTitle>\n <DialogDescription>{{ tt('destination', {}, 'Destination folder') }}</DialogDescription>\n </DialogHeader>\n <div class=\"max-h-72 overflow-y-auto rounded-md border p-2\">\n <FileManagerTree\n v-if=\"dialog?.type === 'move' || dialog?.type === 'copy'\"\n :controller=\"controller\"\n :active=\"dialog.destination\"\n @open=\"chooseDestination\"\n />\n </div>\n <p v-if=\"state.error\" class=\"text-destructive text-sm\" role=\"alert\">{{ state.error }}</p>\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" @click=\"close\">{{\n tt('cancel', {}, 'Cancel')\n }}</Button>\n <Button type=\"button\" :disabled=\"state.busy\" @click=\"submitTransfer\">\n <Spinner v-if=\"state.busy\" />\n {{\n dialog?.type === 'copy'\n ? tt('copy_here', {}, 'Copy here')\n : tt('move_here', {}, 'Move here')\n }}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n <Dialog\n :open=\"dialog?.type === 'delete' || dialog?.type === 'emptyTrash'\"\n @update:open=\"onDialogOpen\"\n >\n <DialogContent data-slot=\"file-manager-dialog\">\n <DialogHeader>\n <DialogTitle>\n {{\n dialog?.type === 'delete'\n ? choice(\n 'file-manager.delete_heading',\n dialog.paths.length,\n {},\n 'Delete :count items?',\n )\n : tt('empty_trash_heading', {}, 'Empty the trash?')\n }}\n </DialogTitle>\n <DialogDescription>\n {{\n dialog?.type === 'delete' && !dialog.permanent\n ? tt(\n 'delete_description_trash',\n {},\n 'They go to the trash, where you can restore them.',\n )\n : dialog?.type === 'emptyTrash'\n ? tt(\n 'empty_trash_description',\n {},\n 'Everything in the trash is deleted for good.',\n )\n : tt(\n 'delete_description',\n {},\n 'They are deleted for good. This cannot be undone.',\n )\n }}\n </DialogDescription>\n </DialogHeader>\n <p v-if=\"state.error\" class=\"text-destructive text-sm\" role=\"alert\">{{ state.error }}</p>\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" @click=\"close\">{{\n tt('cancel', {}, 'Cancel')\n }}</Button>\n <Button type=\"button\" variant=\"destructive\" :disabled=\"state.busy\" @click=\"submitDelete\">\n <Spinner v-if=\"state.busy\" />\n {{\n dialog?.type === 'emptyTrash'\n ? tt('empty_trash', {}, 'Empty trash')\n : dialog?.type === 'delete' && dialog.permanent\n ? tt('delete_permanently', {}, 'Delete permanently')\n : tt('delete', {}, 'Delete')\n }}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n <Dialog :open=\"dialog?.type === 'share'\" @update:open=\"onDialogOpen\">\n <DialogContent data-slot=\"file-manager-dialog\">\n <template v-if=\"dialog?.type === 'share'\">\n <DialogHeader>\n <DialogTitle>{{\n tt('share_heading', { name: dialog.entry.name }, 'Share “:name”')\n }}</DialogTitle>\n <DialogDescription>{{\n tt('share_hint', {}, 'Anyone with the link can open this file, without signing in.')\n }}</DialogDescription>\n </DialogHeader>\n <div class=\"flex flex-wrap items-end gap-2\">\n <label class=\"flex min-w-40 flex-1 flex-col gap-1 text-sm\">\n <span class=\"font-medium\">{{ tt('share_expiry', {}, 'Link expires after') }}</span>\n <select v-model=\"expiry\" :class=\"SELECT\">\n <option\n v-for=\"minutes in share?.expiries ?? []\"\n :key=\"minutes\"\n :value=\"String(minutes)\"\n >\n {{ expiryLabel(minutes) }}\n </option>\n <option v-if=\"share?.publicLinks\" value=\"never\">\n {{ tt('expiry_never', {}, 'Never') }}\n </option>\n </select>\n </label>\n <Button\n type=\"button\"\n :disabled=\"state.busy\"\n @click=\"controller.createLink(expiry === 'never' ? null : Number(expiry))\"\n >\n <Spinner v-if=\"state.busy\" />\n <LinkIcon v-else aria-hidden=\"true\" />\n {{ tt('create_link', {}, 'Create link') }}\n </Button>\n </div>\n <p v-if=\"state.error\" class=\"text-destructive text-sm\" role=\"alert\">{{ state.error }}</p>\n <div v-if=\"dialog.url\" class=\"flex flex-col gap-1\">\n <span class=\"text-sm font-medium\">{{ tt('link', {}, 'Shareable link') }}</span>\n <div class=\"flex gap-2\">\n <Input\n readonly\n :model-value=\"dialog.url\"\n dir=\"ltr\"\n :aria-label=\"tt('link', {}, 'Shareable link')\"\n @focus=\"($event.target as HTMLInputElement).select()\"\n />\n <Button type=\"button\" variant=\"outline\" @click=\"copy(dialog.url ?? '')\">\n <CheckIcon v-if=\"copied\" aria-hidden=\"true\" />\n <CopyIcon v-else aria-hidden=\"true\" />\n {{\n copied ? tt('link_copied', {}, 'Link copied') : tt('copy_link', {}, 'Copy link')\n }}\n </Button>\n </div>\n <span class=\"text-muted-foreground text-xs\">\n {{\n dialog.expiresAt\n ? tt(\n 'link_expires',\n { date: formatter.dateTime(dialog.expiresAt) },\n 'Expires :date',\n )\n : tt('link_never_expires', {}, 'Never expires')\n }}\n </span>\n </div>\n <div v-if=\"share?.publicLinks\" class=\"flex flex-col gap-2\" data-slot=\"file-manager-links\">\n <h4 class=\"text-sm font-medium\">{{ tt('links', {}, 'Links') }}</h4>\n <Spinner v-if=\"dialog.links === null\" />\n <p v-else-if=\"dialog.links.length === 0\" class=\"text-muted-foreground text-sm\">\n {{ tt('no_links', {}, 'No links yet') }}\n </p>\n <ul v-else class=\"flex max-h-48 flex-col divide-y overflow-y-auto rounded-md border\">\n <li\n v-for=\"link in dialog.links\"\n :key=\"link.id\"\n class=\"flex items-center gap-2 px-3 py-2 text-sm\"\n >\n <div class=\"min-w-0 flex-1\">\n <p\n :class=\"cn('truncate', link.expired && 'text-muted-foreground line-through')\"\n dir=\"ltr\"\n >\n {{ link.url }}\n </p>\n <p class=\"text-muted-foreground text-xs\">\n {{\n link.expired\n ? tt('link_expired', {}, 'Expired')\n : link.expiresAt\n ? tt(\n 'link_expires',\n { date: formatter.dateTime(link.expiresAt) },\n 'Expires :date',\n )\n : tt('link_never_expires', {}, 'Never expires')\n }}\n ·\n {{\n choice('file-manager.link_downloads', link.downloads, {}, ':count downloads')\n }}\n </p>\n </div>\n <Button\n v-if=\"link.url && !link.expired\"\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n :aria-label=\"tt('copy_link', {}, 'Copy link')\"\n @click=\"copy(link.url ?? '')\"\n >\n <CopyIcon aria-hidden=\"true\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n class=\"text-destructive\"\n @click=\"controller.revokeLink(link.id)\"\n >\n {{ tt('revoke', {}, 'Revoke') }}\n </Button>\n </li>\n </ul>\n </div>\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" @click=\"close\">{{\n tt('close', {}, 'Close')\n }}</Button>\n </DialogFooter>\n </template>\n </DialogContent>\n </Dialog>\n\n <Dialog :open=\"preview !== null\" @update:open=\"(open) => !open && controller.closePreview()\">\n <DialogContent\n class=\"flex max-h-[90vh] flex-col sm:max-w-4xl\"\n data-slot=\"file-manager-preview\"\n @keydown=\"onPreviewKeyDown\"\n >\n <DialogHeader>\n <DialogTitle class=\"truncate pe-8\">{{ preview?.entry.name }}</DialogTitle>\n </DialogHeader>\n <div\n class=\"bg-muted/40 flex min-h-64 flex-1 items-center justify-center overflow-auto rounded-md\"\n >\n <Spinner v-if=\"!previewData\" />\n <div\n v-else-if=\"!previewData.previewable\"\n class=\"text-muted-foreground flex flex-col items-center gap-2 p-8 text-center text-sm\"\n >\n <FileManagerIcon v-if=\"preview\" :entry=\"preview.entry\" class=\"size-12\" />\n <p>{{ tt('preview_unavailable', {}, 'There is no preview for this type of file.') }}</p>\n </div>\n <img\n v-else-if=\"previewData.kind === 'image'\"\n :src=\"previewData.url\"\n :alt=\"preview?.entry.name ?? ''\"\n class=\"max-h-[70vh] max-w-full object-contain\"\n />\n <iframe\n v-else-if=\"previewData.kind === 'pdf'\"\n :src=\"previewData.url\"\n :title=\"preview?.entry.name ?? ''\"\n class=\"h-[70vh] w-full rounded-md bg-white\"\n />\n <video\n v-else-if=\"previewData.kind === 'video'\"\n :src=\"previewData.url\"\n controls\n class=\"max-h-[70vh] max-w-full\"\n >\n <track kind=\"captions\" />\n </video>\n <audio\n v-else-if=\"previewData.kind === 'audio'\"\n :src=\"previewData.url\"\n controls\n class=\"w-full max-w-md\"\n />\n <pre\n v-else\n class=\"h-full max-h-[70vh] w-full overflow-auto p-4 font-mono text-xs whitespace-pre-wrap\"\n dir=\"auto\"\n tabindex=\"0\"\n >{{ previewData.text }}</pre>\n </div>\n <p v-if=\"previewData?.truncated\" class=\"text-muted-foreground text-xs\">\n {{ tt('preview_truncated', {}, 'Only the beginning of this file is shown.') }}\n </p>\n <DialogFooter class=\"flex-row flex-wrap items-center sm:justify-between\">\n <div class=\"flex gap-1\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n :disabled=\"!previous\"\n :aria-label=\"tt('previous', {}, 'Previous file')\"\n @click=\"previous && controller.openPreview(previous)\"\n >\n <ChevronLeftIcon class=\"rtl:rotate-180\" aria-hidden=\"true\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n :disabled=\"!next\"\n :aria-label=\"tt('next', {}, 'Next file')\"\n @click=\"next && controller.openPreview(next)\"\n >\n <ChevronRightIcon class=\"rtl:rotate-180\" aria-hidden=\"true\" />\n </Button>\n </div>\n <div class=\"flex gap-2\">\n <Button\n v-if=\"previewData?.editable && previewData.url\"\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n @click=\"editImage\"\n >\n <SquarePenIcon aria-hidden=\"true\" />\n {{ tt('edit_image', {}, 'Edit image') }}\n </Button>\n <Button v-if=\"previewData?.downloadUrl\" type=\"button\" size=\"sm\" as-child>\n <a :href=\"previewData.downloadUrl\">\n <DownloadIcon aria-hidden=\"true\" />\n {{ tt('download', {}, 'Download') }}\n </a>\n </Button>\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n <ImageEditorDialog :request=\"editing\" :options=\"IMAGE_EDITOR\" />\n </Card>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8EAwFMyK,KACJ;;;;;;;;EARF,IAAME,IAAQC,GASRC,KAAsC;GAAC;GAAQ;GAAQ;GAAY;EAAM,GACzEC,KAAe;GAAE,cAAc,CAAC,IAAI;GAAG,QAAQ;EAAM,GAErDC,KAASC,EAAgB,GACzBC,KAAOC,GAAqB,GAC5BC,KAAQC,GAAS,GACjBC,KAAIC,GAAK,GACTC,IAASC,EAAU,GACnBC,IAAYC,EAAa,GACzBC,IAAYC,GAAa,GACzBC,KAASC,GAAY,GACrBC,KAAUC,EAAM,GAChBC,KAASD,EAAM,GACfE,KAASF,EAAM,GACfG,KAAUH,EAAM,GAChBI,KAAM,GAAa,IAAgD,CAAC,GAAG,MAC3Ef,GAAE,gBAAgBgB,KAAOC,GAAcC,CAAQ,GAE3CC,YAA6C;GACjD;GACA,OAAOvB,GAAK;GACZ,gBAAgBE,GAAM,MAAM,UAAU;GACtC,qBAAqBA,GAAM,MAAM,UAAU;GAC3C,iBAAiBA,GAAM,MAAM;GAC7B;GACA;GACA,WAAWQ,EAAU;GACrB,SAAS,MAAkBc,EAAc,SAAS,MAAiBC,GAAUC,CAAY,CAAC;GAC1F,QAAQ,MAAYD,GAAUE,GAAwB,gBAAgBC,CAAO,CAAC;EAChF,IAEMC,IAAa,IAAIC,GACrBC,GAAMrC,EAAM,MAAM,GAClB6B,GAAY,GACZb,EAAU,MAAM,MAClB,GACMsB,IAAQC,GAASJ,EAAW,KAAK;EAWvC,AATAK,SACQxC,EAAM,SACX,MAAWmC,EAAW,UAAUE,GAAMI,CAAM,CAAC,CAChD,GACAD,GAAM,CAACxB,GAAWF,CAAS,SAASqB,EAAW,eAAeN,GAAY,CAAC,CAAC,GAE5Ea,SAAgB;GACd,AAAI1C,EAAM,OAAO,SAAS,YAAUmC,EAAgB,aAAa;EACnE,CAAC,GACDQ,SAAsBR,EAAW,QAAQ,CAAC;EAE1C,IAAMS,IAASC,QAAe7C,EAAM,OAAO,SAAS,QAAQ,GACtD8C,IAAUD,SACdP,EAAW,OAEJH,EAAW,eAAe,EAClC,GACKY,IAAWF,SACfP,EAAW,OAEJH,EAAW,gBAAgB,EACnC,GACKa,KAASH,SACbP,EAAW,OAEJH,EAAW,OAAO,EAC1B,GACKc,IAASJ,QAAgBE,EAAS,MAAM,WAAW,IAAIA,EAAS,MAAM,KAAK,KAAA,CAAU,GACrFG,IAAWL,QAAe,CAACD,EAAO,SAAS,CAACN,EAAM,MAAM,KAAK,GAC7Da,KAAYN,QAAeP,EAAM,MAAM,SAASQ,EAAQ,MAAM,EAAE,EAAE,QAAQ,IAAI,GAC9EM,KAAcP,QAClBP,EAAM,MAAM,QACRb,EAAG,SAAS,CAAC,GAAG,OAAO,IACtBa,EAAM,MAAM,YAAYA,EAAM,MAAM,YAAY,SAAS,EAAE,EAAE,QAC9Db,EAAG,QAAQ,CAAC,GAAG,OAAO,CAC5B,GACM4B,KAAO,MAAyDlB,EAAW,IAAImB,CAAO,GAEtFC,KAAUC,EAAwB,IAAI,GACtCC,qBAAQ,IAAI,IAAyB,GACrCC,KAAcF,EAA6B,IAAI,GAC/CG,IAAcH,EAAI,EAAK,GACvBI,KAAUJ,EAAI,OAAO,GACrBK,KAASL,kBAAI,IAAI,IAAY,CAAC,GAE9BM,MAAW,OAAkB,MAAqB;GACtD,AAAIC,aAAmB,cAAaN,GAAM,IAAIO,GAAMD,CAAO,IACtDN,GAAM,OAAOO,CAAI;EACxB,GAEMC,MAAa,MAA6B;GAC9C,AAAID,KAAME,SAAoBT,GAAM,IAAIO,CAAI,CAAC,EAAE,MAAM,CAAC;EACxD,GAEMG,WAAgB;GACpB,IAAMJ,IAAUR,GAAQ;GAIxB,OAFI,CAACQ,KAAWzB,EAAM,MAAM,SAAS,UAAU,OAAO,mBAAqB,MAAoB,IAExF,KAAK,IACV,GACA,iBAAiByB,CAAO,CAAC,CAAC,oBAAoB,MAAM,GAAG,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,MAC3E;EACF,GAEMK,MAAiB,MAAyB;GAC9C,IAAMC,IAASlC,EAAW,UAAUmC,GAAOH,GAAQ,GAAGrD,EAAU,KAAK;GAErE,AAAIuD,EAAO,YACTC,EAAM,eAAe,GACrBL,GAAUI,EAAO,KAAK;EAE1B,GAEME,MAAe,GAA+B,MAClDpC,EAAW,MAAMqC,EAAM,MAAM;GAC3B,OAAOF,EAAM;GACb,QAAQA,EAAM,WAAWA,EAAM;GAC/B,OAAOV,GAAQ,UAAU;EAC3B,CAAC,GAEGa,MAAqB,MAAkC;GAC3D,IAAI7B,EAAO,SAAS4B,EAAM,SAAS,QAAQ;IACzC,AAAIA,EAAM,eAAe,MAASA,EAAM,SAAOxE,EAAM,WAAW,CAACwE,CAAK,CAAC;IAEvE;GACF;GAEA,EAAW,UAAUA,CAAK;EAC5B,GAEME,MAAW,MAAqBJ,EAAM,WAAWA,EAAM,UAAUA,EAAM,SAEvEK,KAAgB,OAAoB;GACxC,WAAW,MAAqB;IAC9B,AAAIL,EAAM,gBAAgBnC,EAAW,SAASyC,GAAQN,EAAM,cAAcI,GAAQJ,CAAK,CAAC,MACtFA,EAAM,eAAe,GACrBA,EAAM,gBAAgB;GAE1B;GACA,YAAY,MAAqB;IAG/B,AAFgBA,EAAM,eAER,SAASA,EAAM,aAA4B,KAAGnC,EAAW,UAAUyC,CAAM;GACzF;GACA,OAAO,MAAqB;IAI1B,AAHAN,EAAM,eAAe,GACrBA,EAAM,gBAAgB,GAElBA,EAAM,gBAAcnC,EAAgB,KAAKyC,GAAQN,EAAM,cAAcI,GAAQJ,CAAK,CAAC;GACzF;EACF,IAEMO,MAAe,GAA+B,MAAqB;GACvE,AAAIP,EAAM,gBAAcnC,EAAW,UAAUqC,EAAM,MAAMF,EAAM,YAAY;EAC7E,GAEMQ,MAAkB,MAAiB;GAEvC,AADA,EAAY,QAAQ,IACpB3C,EAAgB,KAAK6B,CAAI;EAC3B,GAEMe,MAAY,MAAiB;GACjC,IAAMC,IAAQV,EAAM;GAGpB,AADIU,EAAM,SAAO7C,EAAgB,OAAO,MAAM,KAAK6C,EAAM,KAAK,CAAC,GAC/D,EAAM,QAAQ;EAChB,GAEMC,MAAU,MACdT,EAAM,SAAS,SAASU,GAAgBV,EAAM,MAAMxD,EAAU,KAAK,IAAI,IACnEmE,MAAc,MAClB7C,EAAM,MAAM,YAAY,QAAQkC,EAAM,KAAK,SAAS,GAAG,IACnDA,EAAM,KAAK,MAAM,GAAGA,EAAM,KAAK,YAAY,GAAG,CAAC,IAC/C,MACAY,MAAe,MACnBZ,EAAM,aAAa,CAACX,GAAO,MAAM,IAAIW,EAAM,IAAI,IAAIA,EAAM,YAAY,MACjEa,MAAc,MAAiB;GACnC,GAAO,wBAAQ,IAAI,IAAI,CAAC,GAAGxB,GAAO,OAAOG,CAAI,CAAC;EAChD,GAIMsB,KAAczC,QACZP,EAAM,MAAM,QAAQ,QAAQ,MAAWiD,EAAO,WAAW,MAAM,CAAC,CAAC,MACzE,GACMC,KAAkB3C,QACtBP,EAAM,MAAM,QAAQ,OAAO,MAAWiD,EAAO,WAAW,UAAUA,EAAO,WAAW,OAAO,CAC7F,GAIME,IAAS5C,QAAeP,EAAM,MAAM,MAAM,GAC1CoD,IAAOlC,EAAI,EAAE,GACbmC,IAASnC,EAAI,EAAE,GACfoC,IAASpC,EAAI,EAAK,GAClBqC,KAAQhD,QAAe7C,EAAM,OAAO,KAAK;EAE/C,SAEI,CACEyF,EAAO,OAAO,MACdA,EAAO,SAAS,WAAWA,EAAO,QAAQA,EAAO,MAAM,MAAM,OAAO,IACtE,SACI;GACJ,IAAMK,IAAUL,EAAO;GAIvB,AAFIK,GAAS,SAAS,aAAU,EAAK,QAAQA,EAAQ,MAAM,OACvDA,GAAS,SAAS,mBAAgB,EAAK,QAAQ,KAC/CA,GAAS,SAAS,YACpB,EAAO,QAAQ,OAAOD,GAAM,OAAO,SAAS,MAAM,EAAE,GACpD,EAAO,QAAQ;EAEnB,CACF;EAEA,IAAME,UAAc5D,EAAW,YAAY,GACrC6D,MAAgB,MAAkB;GACtC,AAAKC,KAAMF,EAAM;EACnB,GAEMG,WAAmB;GACvB,IAAMJ,IAAUL,EAAO;GAEvB,AAAIK,GAAS,SAAS,WAAU3D,EAAgB,OAAO2D,EAAQ,MAAM,MAAMJ,EAAK,KAAK,IAChFvD,EAAgB,aAAauD,EAAK,KAAK;EAC9C,GAEMS,WAAuB;GAC3B,IAAML,IAAUL,EAAO;GAEvB,CAAIK,GAAS,SAAS,UAAUA,GAAS,SAAS,WAChD3D,EAAgB,SAAS2D,EAAQ,MAAMA,EAAQ,OAAOA,EAAQ,WAAW;EAC7E,GAEMM,MAAqB,MAAiB;GAC1C,IAAMN,IAAUL,EAAO;GAEvB,CAAIK,GAAS,SAAS,UAAUA,GAAS,SAAS,WAChD3D,EAAW,WAAW;IAAE,GAAG2D;IAAS,aAAa9B;GAAK,CAAC;EAC3D,GAEMqC,WAAqB;GACzB,IAAMP,IAAUL,EAAO;GAEvB,AAAIK,GAAS,SAAS,WAAU3D,EAAgB,OAAO2D,EAAQ,KAAK,IAC/D3D,EAAgB,WAAW;EAClC,GAEMmE,MAAe,MAAoB;GACvC,IAAMC,IAAQC,GAAkBC,CAAO;GAEvC,OAAO7F,EAAO,gBAAgB2F,EAAM,OAAOA,EAAM,OAAO,CAAC,GAAG,QAAQ;EACtE,GAEMG,KAAO,OAAO,MAAgB;GAClC,IAAI;IAEF,AADA,MAAM,UAAU,UAAU,UAAUC,CAAG,GACvC,EAAO,QAAQ;GACjB,QAAQ;IACN,EAAO,QAAQ;GACjB;EACF,GAIMC,IAAU/D,QAAeP,EAAM,MAAM,OAAO,GAC5CuE,IAAchE,QAAe+D,EAAQ,OAAO,QAAQ,IAAI,GACxDE,IAAWjE,SACfP,EAAW,MAAM,SAEVH,EAAW,eAAe,EAAE,EACpC,GACK4E,IAAOlE,SACXP,EAAW,MAAM,SAEVH,EAAW,eAAe,CAAC,EACnC,GACK6E,KAAUxD,EAA6B,IAAI,GAE3CyD,KAAY,YAAY;GAC5B,IAAMC,IAAOL,EAAY,OACnBf,IAAUc,EAAQ;GAExB,IAAI,CAACM,GAAM,OAAO,CAACpB,GAAS;GAE5B,IAAMqB,IAAS,MAAMC,GAAmBF,EAAK,KAAKpB,EAAQ,MAAM,IAAI;GAEpE,AAAKqB,MAEL,GAAQ,QAAQ;IACd,MAAMA;IACN,UAAU,MAAW;KAEnB,AADA,GAAQ,QAAQ,MACZE,KAAUA,MAAWF,KAAQhF,EAAgB,gBAAgBkF,CAAM;IACzE;GACF;EACF,GAEMC,MAAoB,MAAyB;GACjD,IAAMC,IAAOzG,EAAU,UAAU,QAAQ,eAAe,aAClD0G,IAAU1G,EAAU,UAAU,QAAQ,cAAc;GAE1D,AACEwD,EAAM,kBAAkB,eACxB;IAAC;IAAS;IAAS;GAAO,CAAC,CAAC,SAASA,EAAM,OAAO,OAAO,MAIvDA,EAAM,QAAQiD,KAAQT,EAAS,SAAO3E,EAAgB,YAAY2E,EAAS,KAAK,GAChFxC,EAAM,QAAQkD,KAAWT,EAAK,SAAO5E,EAAgB,YAAY4E,EAAK,KAAK;EACjF;oBAIE1R,EAAA,GAAAC,EAokCOC,IAAA;GAnkCL,OAAM;GACN,aAAU;GACT,aAAWC,EAAA8M,CAAA,CAAK,CAAC;GACjB,aAAWrC,EAAA,OAAO;GAClB,mBAAiBzK,EAAA4L,EAAA;;GAElB,SAAA3L,QAAgF;IAAhFC,EAAgF,QAAA;KAAzE,IAAIF,EAAA4L,EAAA;KAAS,OAAM;IAAa,GAAAzL,EAAA8L,EAAE,SAAA,CAAA,GAAA,cAAA,CAAA,GAAA,GAAA3I,EAAA;IACzCpD,EAAoF,OAApFqD,IAAoFpD,EAA3BH,EAAA8M,CAAA,CAAK,CAAC,YAAY,GAAA,CAAA;IAE3E5M,EA8MM,OA9MNsD,IA8MM;KA7MJpD,EASSC,GAAA;MARP,MAAK;MACL,SAAQ;MACR,MAAK;MACL,OAAM;MACL,cAAY4L,EAAE,kBAAA,CAAA,GAAA,cAAA;MACd,SAAK,AAAAuG,EAAA,QAAA,MAAE,EAAA,QAAW;;MAEnB,SAAAvS,QAAqC,CAArCG,EAAqCJ,EAAAyS,EAAA,GAAA,EAArB,eAAY,OAAM,CAAA,CAAA,CAAA;;;KAEvBhI,EAAA,OAAO,MAAM,SAAM,KAAhC5K,EAAA,GAAAS,EAWQ,SAXRmD,IAWQ,CAVNvD,EAA4D,QAA5DwD,IAA4DvD,EAAnC8L,EAAE,QAAA,CAAA,GAAA,SAAA,CAAA,GAAA,CAAA,GAC3B/L,EAQS,UAAA;MAPN,OAAKK,EAAE+J,EAAM;MACb,OAAOtK,EAAA8M,CAAA,CAAK,CAAC;MACb,UAAM,AAAA0F,EAAA,QAAA,MAAExS,EAAA2M,CAAA,CAAU,CAAC,QAASiG,EAAO,OAA6B,KAAK;KAEtE/S,GAAAA,EAAAA,EAAA,EAAA,GAAAS,EAESE,GAAA,MAAAC,EAFcgK,EAAA,OAAO,QAAf,OAAf5K,EAAA,GAAAS,EAES,UAAA;MAF6B,KAAKyS,EAAK;MAAO,OAAOA,EAAK;KAC9D,GAAA5S,EAAA4S,EAAK,KAAK,GAAA,GAAAnP,EAAA;KAInB1D,EAqDM,OAAA;MApDH,cAAY+L,EAAE,cAAA,CAAA,GAAA,aAAA;MACf,OAAM;MACN,aAAU;KAEV/L,GAAAA,CAAAA,EA+CK,MA/CL4D,IA+CK,CA9CH5D,EASK,MATL6D,IASK,CARH7D,EAOS,UAAA;MANP,MAAK;MACL,OAAM;MACL,gBAAY,CAAGF,EAAA8M,CAAA,CAAK,CAAC,SAAS9M,EAAA8M,CAAA,CAAK,CAAC,SAAI,KAAA,SAAmB,KAAA;MAC3D,SAAK,AAAA0F,EAAA,QAAA,MAAExS,EAAA8M,CAAA,CAAK,CAAC,QAAQ9M,EAAA2M,CAAA,CAAU,CAAC,UAAS,EAAA,IAAU3M,EAAA2M,CAAA,CAAU,CAAC,KAAI,EAAA;KAEhE,GAAAxM,EAAA8L,EAAE,QAAA,CAAA,GAAA,OAAA,CAAA,GAAA,GAAAjI,EAAA,CAAA,CAAA,GAGChE,EAAA8M,CAAA,CAAK,CAAC,SAAhBjN,EAAA,GAAAS,EAQK,MARL2D,IAQK,CAPH7D,EAGEJ,EAAAiT,EAAA,GAAA;MAFA,OAAM;MACN,eAAY;KAEd/S,CAAAA,GAAAA,EAES,QAFTgE,IAES/D,EADP8L,EAAE,SAAA,CAAA,GAAA,OAAA,CAAA,GAAA,CAAA,CAAA,CAAA,MAIJpM,EAAA,EAAA,GAAAS,EAwBKE,GAAA,EAAA,KAAA,EAAA,GAAAC,EAvBsBT,EAAA8M,CAAA,CAAK,CAAC,cAAvB,GAAO,OADjBjN,EAAA,GAAAS,EAwBK,MAAA;MAtBF,KAAK4S,EAAM;MACZ,OAAM;KAEN9S,GAAAA,CAAAA,EAGEJ,EAAAiT,EAAA,GAAA;MAFA,OAAM;MACN,eAAY;KAGN,CAAA,GAAAE,MAAUnT,EAAA8M,CAAA,CAAK,CAAC,YAAY,SAAM,KAD1CjN,EAAA,GAAAS,EAMO,QANP6D,IAMOhE,EADF+S,EAAM,IAAI,GAAA,CAAA,MAEfrT,EAAA,GAAAS,EAOS,UAAA;;MALP,MAAK;MACL,OAAM;MACL,UAAK,MAAEN,EAAA2M,CAAA,CAAU,CAAC,KAAKuG,EAAM,IAAI;KAE/B,GAAA/S,EAAA+S,EAAM,IAAI,GAAA,GAAA9O,EAAA,EAAA,CAAA;KAMvBlE,EAgIM,OAhINmE,IAgIM;MA/HJnE,EAcM,OAdNoE,IAcM,CAbJlE,EAGEJ,EAAAoT,EAAA,GAAA;OAFA,OAAM;OACN,eAAY;MAEdhT,CAAAA,GAAAA,EAQEO,IAAA;OAPA,MAAK;OACJ,eAAaX,EAAA8M,CAAA,CAAK,CAAC;OACnB,aAAab,EAAE,sBAAA,CAAA,GAAA,SAAA;OACf,cAAYA,EAAE,UAAA,CAAA,GAAA,uBAAA;OACf,OAAM;OACL,UAAUjM,EAAA8M,CAAA,CAAK,CAAC;OAChB,uBAAkB,AAAA0F,EAAA,QAAA,MAAExS,EAAA2M,CAAA,CAAU,CAAC,SAAS,OAAOiG,CAAM,CAAA;;;;;;;MAIlDnI,EAAA,OAAO,OAAO,aAAS,CAAKzK,EAAA8M,CAAA,CAAK,CAAC,SAD1CjN,EAAA,GAAAS,EASQ,SATRiE,IASQ,CALNnE,EAGEQ,IAAA;OAFC,eAAaZ,EAAA8M,CAAA,CAAK,CAAC;OACnB,uBAAkB,AAAA0F,EAAA,QAAA,MAAExS,EAAA2M,CAAA,CAAU,CAAC,aAAaiG,MAAM,EAAA;MACnD/R,GAAAA,MAAAA,GAAAA,CAAAA,aAAAA,CAAAA,GAAAA,EAAA,MACFV,EAAG8L,EAAE,qBAAA,CAAA,GAAA,oBAAA,CAAA,GAAA,CAAA,CAAA,CAAA,KAAA+G,EAAA,IAAA,EAAA;MAEP9S,EAgBQ,SAhBRsE,IAgBQ,CAfNtE,EAA4D,QAA5DuE,IAA4DtE,EAAnC8L,EAAE,QAAA,CAAA,GAAA,SAAA,CAAA,GAAA,CAAA,GAC3B/L,EAaS,UAAA;OAZN,OAAKK,EAAE+J,EAAM;OACb,OAAOtK,EAAA8M,CAAA,CAAK,CAAC,KAAK;OAClB,UAAM,AAAA0F,EAAA,QAAA,MAAiBxS,EAAA2M,CAAA,CAAU,CAAC,QAA0BiG,EAAO,OAA6B,OAA+C5S,EAAA8M,CAAA,CAAK,CAAC,KAAK,SAAA;MAO3JjN,GAAAA,EAAAA,EAAA,GAAAS,EAESE,GAAA,MAAAC,EAFeiK,KAAT,MAAfxK,EAES,UAAA;OAF6B,KAAKoT;OAAQ,OAAOA;MACrD,GAAAnT,EAAA8L,EAAE,QAASqH,KAAK,CAAA,GAAQA,CAAK,CAAA,GAAA,GAAA3O,EAAA;MAItCvE,EAeSC,GAAA;OAdP,MAAK;OACL,SAAQ;OACR,MAAK;OACJ,cAAyBL,EAAA8M,CAAA,CAAK,CAAC,KAAK,cAAS,QAA2Bb,EAAE,aAAA,CAAA,GAAA,WAAA,IAA+CA,EAAE,cAAA,CAAA,GAAA,YAAA;OAK3H,SAAK,AAAAuG,EAAA,QAAA,MAAexS,EAAA2M,CAAA,CAAU,CAAC,QAAQ3M,EAAA8M,CAAA,CAAK,CAAC,KAAK,OAAO9M,EAAA8M,CAAA,CAAK,CAAC,KAAK,cAAS,QAAA,SAAA,KAAA;;OAI9E,SAAA7M,QAAwE,CAArDD,EAAA8M,CAAA,CAAK,CAAC,KAAK,cAAS,SAAvCjN,EAAA,GAAAC,EAAwEE,EAAAuT,EAAA,GAAA;;QAArB,eAAY;OAC/D1T,CAAAA,MAAAA,EAAA,GAAAC,EAA2CE,EAAAwT,EAAA,GAAA;;QAArB,eAAY;;;;MAEpCtT,EAqBM,OAAA;OArBD,OAAM;OAAyB,MAAK;OAAS,cAAY+L,EAAE,QAAA,CAAA,GAAA,MAAA;MAC9D7L,GAAAA,CAAAA,EASSC,GAAA;OARP,MAAK;OACJ,SAASL,EAAA8M,CAAA,CAAK,CAAC,SAAI,SAAA,cAAA;OACpB,MAAK;OACJ,gBAAc9M,EAAA8M,CAAA,CAAK,CAAC,SAAI;OACxB,cAAYb,EAAE,aAAA,CAAA,GAAA,MAAA;OACd,SAAK,AAAAuG,EAAA,QAAA,MAAExS,EAAA2M,CAAA,CAAU,CAAC,QAAO,MAAA;;OAE1B,SAAA1M,QAAqC,CAArCG,EAAqCJ,EAAAyT,EAAA,GAAA,EAArB,eAAY,OAAM,CAAA,CAAA,CAAA;;;;;;MAEpCrT,CAAAA,GAAAA,EASSC,GAAA;OARP,MAAK;OACJ,SAASL,EAAA8M,CAAA,CAAK,CAAC,SAAI,SAAA,cAAA;OACpB,MAAK;OACJ,gBAAc9M,EAAA8M,CAAA,CAAK,CAAC,SAAI;OACxB,cAAYb,EAAE,aAAA,CAAA,GAAA,MAAA;OACd,SAAK,AAAAuG,EAAA,QAAA,MAAExS,EAAA2M,CAAA,CAAU,CAAC,QAAO,MAAA;;OAE1B,SAAA1M,QAA+B,CAA/BG,EAA+BJ,EAAA0T,EAAA,GAAA,EAArB,eAAY,OAAM,CAAA,CAAA,CAAA;;;;;;;MAGhCtT,EAQSC,GAAA;OAPP,MAAK;OACL,SAAQ;OACR,MAAK;OACJ,cAAY4L,EAAE,WAAA,CAAA,GAAA,SAAA;OACd,SAAK,AAAAuG,EAAA,QAAA,MAAExS,EAAA2M,CAAA,CAAU,CAAC,QAAO;;OAE1B,SAAA1M,QAAiF,CAAjFG,EAAiFJ,EAAA2T,EAAA,GAAA;QAAlE,eAAY;QAAQ,OAAKpT,EAAEP,EAAA4T,CAAA,CAAE,CAAC5T,EAAA8M,CAAA,CAAK,CAAC,WAAO,cAAA,CAAA;;;;MAGnD,CAAA9M,EAAA8M,CAAA,CAAK,CAAC,SAASe,EAAG,cAAA,KAD3BhO,EAAA,GAAAC,EASSO,GAAA;;OAPP,MAAK;OACL,SAAQ;OACR,MAAK;OACJ,SAAK,AAAAmS,EAAA,SAAA,MAAExS,EAAA2M,CAAA,CAAU,CAAC,WAAU,EAAA,MAAA,eAAA,CAAA;;OAE7B,SAAA1M,QAAqC,CAArCG,EAAqCJ,EAAA6T,EAAA,GAAA,EAArB,eAAY,OAAM,CAAA,GAClC3T,EAA4E,QAA5E2E,IAA4E1E,EAA5C8L,EAAE,cAAA,CAAA,GAAA,YAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;;MAEnB,CAAAjM,EAAA8M,CAAA,CAAK,CAAC,SAASe,EAAG,QAAA,KAAcpD,EAAA,OAAO,UAAxD5K,EAAA,GAAAS,EAcWE,GAAA,EAAA,KAAA,EAAA,GAAA,CAbTJ,EAGSC,GAAA;OAHD,MAAK;OAAS,MAAK;OAAM,SAAK,AAAAmS,EAAA,SAAA,MAAEtE,GAAA,OAAa,MAAK;;OACxD,SAAAjO,QAAiC,CAAjCG,EAAiCJ,EAAA8T,EAAA,GAAA,EAArB,eAAY,OAAM,CAAA,GAC9B5T,EAAoE,QAApE4E,IAAoE3E,EAApC8L,EAAE,UAAA,CAAA,GAAA,QAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;MAEpC/L,CAAAA,GAAAA,EAQE,SAAA;OAPI,SAAA;OAAJ,KAAIgO;OACJ,MAAK;OACL,UAAA;OACA,QAAA;OACC,QAAQlO,EAAA+T,EAAA,CAA0B,CAACtJ,EAAA,OAAO,OAAO,MAAM;OACxD,aAAU;OACT,UAAQ8E;;MAIL9E,EAAA,OAAO,SAAK,CAAK2C,EAAA,SADzBvN,EAAA,GAAAC,EAYSO,GAAA;;OAVP,MAAK;OACJ,SAASL,EAAA8M,CAAA,CAAK,CAAC,QAAK,cAAA;OACrB,MAAK;OACJ,gBAAc9M,EAAA8M,CAAA,CAAK,CAAC;OACpB,SAAK,AAAA0F,EAAA,SAAA,MAAExS,EAAA2M,CAAA,CAAU,CAAC,UAAS,CAAE3M,EAAA8M,CAAA,CAAK,CAAC,KAAK;;OAEzC,SAAA7M,QAAiC,CAAjCG,EAAiCJ,EAAAgU,CAAA,GAAA,EAArB,eAAY,OAAM,CAAA,GAC9B9T,EAES,QAFT8E,IAES7E,EADPH,EAAA8M,CAAA,CAAK,CAAC,QAAQb,EAAE,iBAAA,CAAA,GAAA,eAAA,IAAyCA,EAAE,SAAA,CAAA,GAAA,OAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;;;;IAO3DsB,EAAA,MAAS,SAAM,KAAA,CAASH,EAAA,SADhCvN,EAAA,GAAAS,EAmIM,OAnIN2E,IAmIM;KA9HJ/E,EAES,QAFTgF,IAES/E,EADP8L,EAAE,YAAA,EAAA,OAAsBsB,EAAA,MAAS,OAAM,GAAA,iBAAA,CAAA,GAAA,CAAA;KAEzBvN,EAAA8M,CAAA,CAAK,CAAC,SAAtBjN,EAAA,GAAAS,EAwBWE,GAAA,EAAA,KAAA,EAAA,GAAA,CAtBDqN,EAAG,SAAA,KADXhO,EAAA,GAAAC,EASSO,GAAA;;MAPP,MAAK;MACL,SAAQ;MACR,MAAK;MACJ,SAAK,AAAAmS,EAAA,SAAA,MAAExS,EAAA2M,CAAA,CAAU,CAAC,QAAO;;MAE1B,SAAA1M,QAAoC,CAApCG,EAAoCJ,EAAAiU,EAAA,GAAA,EAArB,eAAY,OAAM,CAAA,GACjC/T,EAAsE,QAAtEiF,IAAsEhF,EAAtC8L,EAAE,WAAA,CAAA,GAAA,SAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;KAG5B,CAAA,KAAA+G,EAAA,IAAA,EAAA,GAAAnF,EAAG,QAAA,KADXhO,EAAA,GAAAC,EAYSO,GAAA;;MAVP,MAAK;MACL,SAAQ;MACR,MAAK;MACL,OAAM;MACL,SAAK,AAAAmS,EAAA,SAAA,MAAExS,EAAA2M,CAAA,CAAU,CAAC,cAAa;;MAEhC,SAAA1M,QAAiC,CAAjCG,EAAiCJ,EAAAgU,CAAA,GAAA,EAArB,eAAY,OAAM,CAAA,GAC9B9T,EAES,QAFTkF,IAESjF,EADP8L,EAAE,sBAAA,CAAA,GAAA,oBAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;KAIRpM,CAAAA,KAAAA,EAAAA,IAAAA,EAAAA,CAAAA,GAAAA,EAAAA,MAAAA,EAAA,GAAAS,EAuFWE,GAAA,EAAA,KAAA,EAAA,GAAA;MArFDiN,EAAA,SADR5N,EAAA,GAAAC,EAYSO,GAAA;;OAVP,MAAK;OACL,SAAQ;OACR,MAAK;OACJ,SAAK,AAAAmS,EAAA,SAAA,MAAExS,EAAA2M,CAAA,CAAU,CAAC,UAAUc,EAAA,KAAM;;OAEnC,SAAAxN,QAAqE,CAA/CwN,EAAA,MAAO,SAAI,YAAjC5N,EAAA,GAAAC,EAAqEE,EAAAkU,EAAA,GAAA;;QAArB,eAAY;OAC5DrU,CAAAA,MAAAA,EAAA,GAAAC,EAAwCE,EAAAoT,EAAA,GAAA;;QAArB,eAAY;OAC/BlT,CAAAA,IAAAA,EAES,QAFTmF,IAESlF,EADPsN,EAAA,MAAO,SAAI,WAAgBxB,EAAE,QAAA,CAAA,GAAA,MAAA,IAAuBA,EAAE,WAAA,CAAA,GAAA,SAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;;MAIlD4B,EAAG,UAAA,MAAiBJ,EAAA,OAAQ,SAAI,UAAeI,EAAG,KAAA,MAD1DhO,EAAA,GAAAC,EAaSO,GAAA;;OAXP,MAAK;OACL,SAAQ;OACR,MAAK;OACJ,SAAK,AAAAmS,EAAA,SAAA,MAAExS,EAAA2M,CAAA,CAAU,CAAC,SAAQ;;OAE3B,SAAA1M,QAAmC,CAAnCG,EAAmCJ,EAAAmU,EAAA,GAAA,EAArB,eAAY,OAAM,CAAA,GAChCjU,EAIS,QAJToF,IAISnF,EAHPsN,EAAA,OAAQ,SAAI,SAA4BxB,EAAE,YAAA,CAAA,GAAA,UAAA,IAA6CA,EAAE,gBAAA,CAAA,GAAA,iBAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;;MAMrFwB,EAAA,SAAUI,EAAG,QAAA,KADrBhO,EAAA,GAAAC,EASSO,GAAA;;OAPP,MAAK;OACL,SAAQ;OACR,MAAK;OACJ,SAAK,AAAAmS,EAAA,SAAA,MAAExS,EAAA2M,CAAA,CAAU,CAAC,WAAU;QAAA,MAAA;QAAA,OAA0Bc,EAAA;OAAM,CAAA;;OAE7D,SAAAxN,QAAiC,CAAjCG,EAAiCJ,EAAAoU,EAAA,GAAA,EAArB,eAAY,OAAM,CAAA,GAC9BlU,EAAoE,QAApEqF,IAAoEpF,EAApC8L,EAAE,UAAA,CAAA,GAAA,QAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;;MAG5B4B,EAAG,MAAA,KADXhO,EAAA,GAAAC,EAWSO,GAAA;;OATP,MAAK;OACL,SAAQ;OACR,MAAK;OACJ,SAAK,AAAAmS,EAAA,SAAA,MAAexS,EAAA2M,CAAA,CAAU,CAAC,WAAU;QAAA,MAAA;QAAA,OAAwB3M,EAAA8M,CAAA,CAAK,CAAC;QAAS,aAAe9M,EAAA8M,CAAA,CAAK,CAAC;OAAI,CAAA;;OAI1G,SAAA7M,QAAsC,CAAtCG,EAAsCJ,EAAAqU,EAAA,GAAA,EAArB,eAAY,OAAM,CAAA,GACnCnU,EAAgE,QAAhEsF,IAAgErF,EAAhC8L,EAAE,QAAA,CAAA,GAAA,MAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;;MAG5B4B,EAAG,MAAA,KADXhO,EAAA,GAAAC,EAWSO,GAAA;;OATP,MAAK;OACL,SAAQ;OACR,MAAK;OACJ,SAAK,AAAAmS,EAAA,SAAA,MAAexS,EAAA2M,CAAA,CAAU,CAAC,WAAU;QAAA,MAAA;QAAA,OAAwB3M,EAAA8M,CAAA,CAAK,CAAC;QAAS,aAAe9M,EAAA8M,CAAA,CAAK,CAAC;OAAI,CAAA;;OAI1G,SAAA7M,QAA+B,CAA/BG,EAA+BJ,EAAAsU,EAAA,GAAA,EAArB,eAAY,OAAM,CAAA,GAC5BpU,EAAgE,QAAhEuF,IAAgEtF,EAAhC8L,EAAE,QAAA,CAAA,GAAA,MAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;;MAG5BwB,EAAA,OAAQ,SAAI,UAAeI,EAAG,OAAA,KAAapD,EAAA,OAAO,SAD1D5K,EAAA,GAAAC,EASSO,GAAA;;OAPP,MAAK;OACL,SAAQ;OACR,MAAK;OACJ,SAAK,AAAAmS,EAAA,SAAA,MAAExS,EAAA2M,CAAA,CAAU,CAAC,UAAUc,EAAA,KAAM;;OAEnC,SAAAxN,QAAiC,CAAjCG,EAAiCJ,EAAAuU,EAAA,GAAA,EAArB,eAAY,OAAM,CAAA,GAC9BrU,EAAkE,QAAlEwF,IAAkEvF,EAAlC8L,EAAE,SAAA,CAAA,GAAA,OAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;;MAEpC7L,EAGSC,GAAA;OAHD,MAAK;OAAS,SAAQ;OAAQ,MAAK;OAAM,SAAK,AAAAmS,EAAA,SAAA,MAAExS,EAAA2M,CAAA,CAAU,CAAC,YAAYc,EAAA,KAAM;;OACnF,SAAAxN,QAA+B,CAA/BG,EAA+BJ,EAAAwU,EAAA,GAAA,EAArB,eAAY,OAAM,CAAA,GAC5BtU,EAAsE,QAAtEyF,IAAsExF,EAAtC8L,EAAE,WAAA,CAAA,GAAA,SAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;;MAG5B4B,EAAG,QAAA,KADXhO,EAAA,GAAAC,EAUSO,GAAA;;OARP,MAAK;OACL,SAAQ;OACR,MAAK;OACL,OAAM;OACL,SAAK,AAAAmS,EAAA,SAAA,MAAExS,EAAA2M,CAAA,CAAU,CAAC,cAAa;;OAEhC,SAAA1M,QAAiC,CAAjCG,EAAiCJ,EAAAgU,CAAA,GAAA,EAArB,eAAY,OAAM,CAAA,GAC9B9T,EAAoE,QAApE0F,IAAoEzF,EAApC8L,EAAE,UAAA,CAAA,GAAA,QAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;;;KAGtC7L,EASSC,GAAA;MARP,MAAK;MACL,SAAQ;MACR,MAAK;MACL,OAAM;MACL,cAAY4L,EAAE,mBAAA,CAAA,GAAA,iBAAA;MACd,SAAK,AAAAuG,EAAA,SAAA,MAAExS,EAAA2M,CAAA,CAAU,CAAC,eAAc;;MAEjC,SAAA1M,QAA4B,CAA5BG,EAA4BJ,EAAAyU,EAAA,GAAA,EAArB,eAAY,OAAM,CAAA,CAAA,CAAA;;;;IAI7BvU,EAqNM,OAAA,EArNA,OAAKK,EAAEP,EAAA4T,CAAA,CAAE,CAAA,QAASxG,EAAA,QAAM,aAAA,eAAA,CAAA,EAAA,GAAA;KAC5BlN,EAUQ,SAVR2F,IAUQ,CANNzF,EAKEU,IAAA;MAJC,YAAYd,EAAA2M,CAAA;MACZ,QAAQ3M,EAAA8M,CAAA,CAAK,CAAC,QAAK,OAAU9M,EAAA8M,CAAA,CAAK,CAAC;MACnC,iBAAeY,EAAA,QAAWyB,IAAe,KAAA;MACzC,QAAMG;;;;;;KAIXpP,EA+LM,OA/LNa,GA+LM;MA9LJ,OAAM;MACN,aAAU;MACT,oBAAkBf,EAAA8M,CAAA,CAAK,CAAC,eAAU,KAAA,KAAe,KAAA;KAClD,GAAA9L,GAAM0M,EAAiC,QAAtByB,EAAY,EAAA,IAAA,CAAA,GAAA,EAAA,CAAA,GAAA;MAGrBnP,EAAA8M,CAAA,CAAK,CAAC,SAAS9M,EAAA8M,CAAA,CAAK,CAAC,iBAD7BjN,EAAA,GAAAS,EAWI,KAXJyF,IAWI5F,EANA8L,EAAA,cAAsD,EAAA,MAAAjM,EAAA8M,CAAA,CAAK,CAAC,cAAa,GAAA,2DAAA,CAAA,GAAA,CAAA,KAAAkG,EAAA,IAAA,EAAA;MAQrEhT,EAAA8M,CAAA,CAAK,CAAC,aAAa9M,EAAA8M,CAAA,CAAK,CAAC,oBADjCjN,EAAA,GAAAS,EAUI,KAVJ0F,IAUI7F,EAJAH,EAAA8M,CAAA,CAAK,CAAC,mBAAiCb,EAAE,oBAAA,CAAA,GAAA,uDAAA,IAAkGA,EAAE,aAAA,CAAA,GAAA,oDAAA,CAAA,GAAA,CAAA,KAAA+G,EAAA,IAAA,EAAA;MAKjJ9S,EAII,KAAA;OAJA,IAAIF,EAAA8L,EAAA;OAAQ,OAAM;MAElB,GAAA3L,EAAA8L,EAAE,YAAA,CAAA,GAAA,oEAAA,CAAA,GAAA,GAAAhG,EAAA;OAKGjG,EAAA8M,CAAA,CAAK,CAAC,WAAW9M,EAAA8M,CAAA,CAAK,CAAC,cAAcQ,EAAA,MAAQ,WAAM,KAD5DzN,EAAA,GAAAS,EAMM,OANN4F,IAMM,CAFJ9F,EAAWa,CAAA,GACXf,EAAqE,QAArEiG,IAAqEhG,EAA5C8L,EAAE,WAAA,CAAA,GAAA,eAAA,CAAA,GAAA,CAAA,CAAA,CAAA,KAGhBqB,EAAA,MAAQ,WAAM,KAD3BzN,EAAA,GAAAS,EAkBM,OAlBN8F,IAkBM;OAbJhG,EAAgEJ,EAAAkU,EAAA,GAAA;QAAhD,OAAM;QAAqB,eAAY;;OACvDhU,EAQI,KARJmG,IAQIlG,EANAH,EAAA8M,CAAA,CAAK,CAAC,QAAwBb,EAAE,cAAA,CAAA,GAAA,6BAAA,IAAoEjM,EAAA8M,CAAA,CAAK,CAAC,QAA0Bb,EAAE,qBAAA,CAAA,GAAA,oBAAA,IAAoEA,EAAE,SAAA,CAAA,GAAA,sBAAA,CAAA,GAAA,CAAA;OAOtM,CAAAjM,EAAA8M,CAAA,CAAK,CAAC,SAASY,EAAA,SAAYG,EAAG,QAAA,KAAxChO,EAAA,GAAAS,EAEI,KAAAgG,IAAAnG,EADC8L,EAAE,cAAA,CAAA,GAAA,mCAAA,CAAA,GAAA,CAAA,KAAA+G,EAAA,IAAA,EAAA;MAGTnT,CAAAA,MAAAA,EAAA,GAAAS,EAyHM,OAAA;;OAvHA,SAAA;OAAJ,KAAIyN;OACJ,MAAK;OACJ,wBAAoB,CAAGX,EAAA,SAAU3C,EAAA,OAAO,aAAQ;OAChD,mBAAiBzK,EAAA4L,EAAA;OACjB,oBAAkB5L,EAAA8L,EAAA;OAClB,aAAW9L,EAAA8M,CAAA,CAAK,CAAC,WAAW,KAAA;OAC7B,aAAU;OACT,OAAKvM,EAAeP,EAAA4T,CAAA,CAAE,CAAgB5T,EAAA8M,CAAA,CAAK,CAAC,SAAI,SAAA,4EAAA,qBAA6J9M,EAAA8M,CAAA,CAAK,CAAC,WAAO,YAAA,CAAA;MAUnN9M,GAAAA,CAAAA,EAAA8M,CAAA,CAAK,CAAC,SAAI,UADlBjN,EAAA,GAAAS,EAQM,OARNkG,IAQM;OAHJtG,EAAyC,QAAA,MAAAC,EAAhC8L,EAAE,QAAA,CAAA,GAAA,MAAA,CAAA,GAAA,CAAA;OACX/L,EAA0D,QAA1DuG,IAA0DtG,EAAhC8L,EAAE,QAAA,CAAA,GAAA,MAAA,CAAA,GAAA,CAAA;OAC5B/L,EAAiD,QAAA,MAAAC,EAAxC8L,EAAE,YAAA,CAAA,GAAA,UAAA,CAAA,GAAA,CAAA;MAEbpM,CAAAA,KAAAA,EAAAA,IAAAA,EAAAA,IAAAA,EAAA,EAAA,GAAAS,EA6FME,GAAA,MAAAC,EA5FY6M,EAAA,QAAT,OADTzN,EAAA,GAAAS,EA6FM,OA7FNS,GA6FM;OA3FH,KAAKiO,EAAM;;OACX,KAAKV,GAAQU,EAAM,IAAI;OACxB,MAAK;OACJ,cAAYA,EAAM;OAClB,iBAAehP,EAAA8M,CAAA,CAAK,CAAC,UAAU,SAASkC,EAAM,IAAI;OAClD,iBAA+B5B,EAAA,SAAU4B,EAAM,SAAI,UAAeA,EAAM,eAAU,MAAe,KAAA;OAGjG,UAAUA,EAAM,SAASrB,GAAA,QAAS,IAAA;OAClC,WAAWD,EAAA,UAAaG,EAAG,MAAA,KAAYA,EAAG,MAAA;OAC3C,aAAU;OACT,aAAWmB,EAAM;OACjB,aAAWA,EAAM;OACjB,iBAAehP,EAAA8M,CAAA,CAAK,CAAC,UAAU,SAASkC,EAAM,IAAI,IAAA,KAAS,KAAA;OAC3D,oBAAkBhP,EAAA8M,CAAA,CAAK,CAAC,eAAekC,EAAM,OAAI,KAAQ,KAAA;OACzD,OAAOA,EAAM;OACb,OAAsBhP,EAAA4T,CAAA,CAAE,CAAA,yHAA2J5T,EAAA8M,CAAA,CAAK,CAAC,SAAI,SAAA,sDAAA,gHAAwO9M,EAAA8M,CAAA,CAAK,CAAC,UAAU,SAASkC,EAAM,IAAI,KAAA,uDAA8FhP,EAAA8M,CAAA,CAAK,CAAC,eAAekC,EAAM,QAAI,uBAA2C5B,EAAA,SAAU4B,EAAM,SAAI,UAAeA,EAAM,eAAU,MAAA,YAAA;MAYpqB,GAAAhO,GAAMgO,EAAM,SAAI,YAAiBtB,EAAA,QAAWyB,EAAaH,EAAM,IAAI,IAAA,CAAA,GAAA,EAAA,GAAA;OAClE,eAAW,AAAAwD,EAAA,SAAA,MAAE,GAAA,QAAUI,EAAO;OAC9B,UAAK,MAAE7D,GAAYC,GAAO4D,CAAM;OAChC,aAAQ,MAAE3D,GAAkBD,CAAK;OACjC,WAASJ;OACT,UAAK,MAAE5O,EAAA2M,CAAA,CAAU,CAAC,MAAMqC,EAAM,IAAI;OAClC,cAAS,MAAEK,GAAYL,GAAO4D,CAAM;OACpC,WAAO,AAAAJ,EAAA,SAAA,MAAExS,EAAA2M,CAAA,CAAU,CAAC,QAAO;MAEZ3M,CAAAA,GAAAA,CAAAA,EAAA8M,CAAA,CAAK,CAAC,SAAI,UAA1BjN,EAAA,GAAAS,EAwBWE,GAAA,EAAA,KAAA,EAAA,GAAA,CAvBTN,EAaM,OAbNyG,IAaM,CATIiJ,GAAYZ,CAAK,KADzBnP,EAAA,GAAAS,EAQE,OAAA;;OANC,KAAKsP,GAAYZ,CAAK,KAAK,KAAA;OAC5B,KAAI;OACJ,SAAQ;OACP,WAAW;OACZ,OAAM;OACL,UAAK,MAAEa,GAAWb,EAAM,IAAI;MAE/BnP,GAAAA,MAAAA,IAAAA,EAAAA,MAAAA,EAAA,GAAAC,EAAyDoB,IAAA;;OAAzB;OAAO,OAAM;MAE/ChB,GAAAA,MAAAA,GAAAA,CAAAA,OAAAA,CAAAA,EAAAA,CAAAA,GAAAA,EAQM,OARN2G,IAQM,CAPJ3G,EAA4D,KAA5D4G,IAA4D3G,EAAjB6O,EAAM,IAAI,GAAA,CAAA,GACrD9O,EAKI,KALJ6G,IAKI5G,EAHAwP,GAAWX,CAAK,MAA0BA,EAAM,SAAI,WAAgB/C,EAAE,gBAAA,CAAA,GAAA,QAAA,IAAiCwD,GAAOT,CAAK,EAAA,GAAA,CAAA,CAAA,CAAA,CAAA,GAAA,EAAA,MAM3HnP,EAAA,GAAAS,EAuBWE,GAAA,EAAA,KAAA,EAAA,GAAA;OArBDoP,GAAYZ,CAAK,KADzBnP,EAAA,GAAAS,EAQE,OAAA;;QANC,KAAKsP,GAAYZ,CAAK,KAAK,KAAA;QAC5B,KAAI;QACJ,SAAQ;QACP,WAAW;QACZ,OAAM;QACL,UAAK,MAAEa,GAAWb,EAAM,IAAI;OAE/BnP,GAAAA,MAAAA,IAAAA,EAAAA,MAAAA,EAAA,GAAAC,EAAwDoB,IAAA;;QAAxB;QAAO,OAAM;;OAC7ChB,EAKM,OALN+G,IAKM,CAJJ/G,EAA4D,KAA5DgH,IAA4D/G,EAAjB6O,EAAM,IAAI,GAAA,CAAA,GAC5CW,GAAWX,CAAK,KAAzBnP,EAAA,GAAAS,EAEI,KAFJ6G,IAEIhH,EADCwP,GAAWX,CAAK,CAAA,GAAA,CAAA,KAAAgE,EAAA,IAAA,EAAA,CAAA,CAAA;OAGvB9S,EAES,QAFTkH,IAESjH,EADPsP,GAAOT,CAAK,CAAA,GAAA,CAAA;OAEd9O,EAEO,QAFPmH,IAEOlH,EADF6O,EAAM,WAAWhP,EAAAwL,CAAA,CAAS,CAAC,SAASwD,EAAM,QAAQ,IAAA,EAAA,GAAA,CAAA;MAIjDhP,GAAAA,EAAAA,IAAAA,EAAA8M,CAAA,CAAK,CAAC,UAAU,SAASkC,EAAM,IAAI,KAD3CnP,EAAA,GAAAC,EAIEE,EAAA4U,CAAA,GAAA;;OAFA,OAAM;OACN,eAAY;;MAMV5U,EAAA8M,CAAA,CAAK,CAAC,eAAU,MADxBjN,EAAA,GAAAS,EAMM,OANNgH,IAMMnH,EADD8L,EAAE,aAAA,EAAA,QAAwB2B,GAAA,MAAW,GAAA,sCAAA,CAAA,GAAA,CAAA,KAAAoF,EAAA,IAAA,EAAA;;KAKpChT,EAAA8M,CAAA,CAAK,CAAC,eADdjN,EAAA,GAAAS,EAMQ,SANRiH,IAMQ,CADNnH,EAA+Ce,IAAA,EAA1B,YAAYnB,EAAA2M,CAAA,EAAU,GAAA,MAAA,GAAA,CAAA,YAAA,CAAA,CAAA,CAAA,KAAAqG,EAAA,IAAA,EAAA;;IAKvChT,EAAA8M,CAAA,CAAK,CAAC,SAASQ,EAAA,MAAQ,SAAM,KAAQO,EAAG,QAAA,KADhDhO,EAAA,GAAAS,EAaM,OAbNkH,IAaM,CATJpH,EAQSC,GAAA;KAPP,MAAK;KACL,SAAQ;KACR,MAAK;KACJ,SAAK,AAAAmS,EAAA,SAAA,MAAExS,EAAA2M,CAAA,CAAU,CAAC,WAAU,EAAA,MAAA,aAAA,CAAA;;KAE7B,SAAA1M,QAAiC,CAAjCG,EAAiCJ,EAAAgU,CAAA,GAAA,EAArB,eAAY,OAAM,CAAA,GAAGnT,EAAA,MACjCV,EAAG8L,EAAE,eAAA,CAAA,GAAA,aAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;;IAKDmB,EAAA,SADRvN,EAAA,GAAAS,EAeM,OAfNmH,IAeM;KAVJvH,EAEO,QAFPwH,IAEOvH,EADFoN,EAAA,MAAS,SAAM,IAAOtB,EAAE,YAAA,EAAA,OAAsBuB,GAAA,MAAO,OAAM,GAAA,iBAAA,IAAA,EAAA,GAAA,CAAA;KAEhEpN,EAEWC,GAAA;MAFH,MAAK;MAAS,SAAQ;MAAW,SAAK,AAAAmS,EAAA,SAAA,MAAE/H,EAAA,WAAQ;;MAAM,SAAAxK,QAE5D,CADAY,EAAAV,EAAA8L,EAAE,UAAA,CAAA,GAAA,QAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;;KAEJ7L,EAGSC,GAAA;MAHD,MAAK;MAAU,UAAUmN,GAAA,MAAO,WAAM;MAAS,SAAK,AAAAgF,EAAA,SAAA,MAAE/H,EAAA,WAAW+C,GAAA,KAAM;;MAC7E,SAAAvN,QAAgC,CAAhCG,EAAgCJ,EAAA4U,CAAA,GAAA,EAArB,eAAY,OAAM,CAAA,GAAG/T,EAAA,MAChCV,EAAG8L,EAAE,iBAAA,CAAA,GAAA,QAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;;;IAIT7L,EAYQgB,IAAA;KAZA,MAAM+M,EAAA;KAAc,iBAAW,AAAAqE,EAAA,SAAA,MAAE,EAAA,QAAcI;;KACrD,SAAA3S,QAUe,CAVfG,EAUeiB,IAAA;MAVA,MAAMrB,EAAAsL,CAAA,MAAS,QAAA,UAAA;MAA+B,OAAM;;MACjE,SAAArL,QAEc,CAFdG,EAEckB,IAAA,EAFD,OAAM,MAAK,GAAA;OACtB,SAAArB,QAA2D,CAA3DG,EAA2DmB,IAAA,MAAA;QAA/C,SAAAtB,QAAkC,CAA/BY,EAAAV,EAAA8L,EAAE,WAAA,CAAA,GAAA,SAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;;;MAEnB7L,CAAAA,GAAAA,EAKEU,IAAA;OAJC,YAAYd,EAAA2M,CAAA;OACZ,QAAQ3M,EAAA8M,CAAA,CAAK,CAAC,QAAK,OAAU9M,EAAA8M,CAAA,CAAK,CAAC;OACnC,iBAAeY,EAAA,QAAWyB,IAAe,KAAA;OACzC,QAAMG;;;;;;;;;;IAKblP,EAUQgB,IAAA;KATL,MAAMpB,EAAA8M,CAAA,CAAK,CAAC,eAAe9M,EAAA0L,EAAA;KAC3B,iBAAW,AAAA8G,EAAA,SAAG,MAAI,CAAM/B,KAAQzQ,EAAA2M,CAAA,CAAU,CAAC,aAAY;;KAExD,SAAA1M,QAKe,CALfG,EAKeiB,IAAA;MALA,MAAMrB,EAAAsL,CAAA,MAAS,QAAA,SAAA;MAA+B,OAAM;;MACjE,SAAArL,QAEc,CAFdG,EAEckB,IAAA,MAAA;OADZ,SAAArB,QAA2D,CAA3DG,EAA2DmB,IAAA,MAAA;QAA/C,SAAAtB,QAAkC,CAA/BY,EAAAV,EAAA8L,EAAE,WAAA,CAAA,GAAA,SAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;;;MAEnB7L,CAAAA,GAAAA,EAA4De,IAAA;OAAvC,YAAYnB,EAAA2M,CAAA;OAAY,gBAAA;;;;;;IAKzC3M,EAAA8M,CAAA,CAAK,CAAC,QAAQ,SAAM,KAD5BjN,EAAA,GAAAS,EAiFU,WAAA;;KA/ER,OAAM;KACL,cAAY2L,EAAE,WAAA,CAAA,GAAA,SAAA;KACf,aAAU;IAEV/L,GAAAA,CAAAA,EAqBS,UArBT0H,IAqBS;KApBPxH,EAAgDJ,EAAA8T,EAAA,GAAA;MAApC,OAAM;MAAS,eAAY;;KACvC5T,EAQO,QARP2H,IAQO1H,EANH8L,EAAA,mBAA2D;MAAA,MAAA6D,GAAA;MAAW,OAAS9P,EAAA8M,CAAA,CAAK,CAAC,QAAQ;KAAM,GAAA,0BAAA,CAAA,GAAA,CAAA;KAQ/FkD,GAAA,SADRnQ,EAAA,GAAAC,EASSO,GAAA;;MAPP,MAAK;MACL,SAAQ;MACR,MAAK;MACJ,cAAY4L,EAAE,WAAA,CAAA,GAAA,SAAA;MACd,SAAK,AAAAuG,EAAA,SAAA,MAAExS,EAAA2M,CAAA,CAAU,CAAC,aAAY;;MAE/B,SAAA1M,QAA4B,CAA5BG,EAA4BJ,EAAAyU,EAAA,GAAA,EAArB,eAAY,OAAM,CAAA,CAAA,CAAA;;;IAG7BvU,CAAAA,GAAAA,EAoDK,MApDL4H,IAoDK,EAnDHjI,EAAA,EAAA,GAAAS,EAkDKE,GAAA,MAAAC,EAjDcT,EAAA8M,CAAA,CAAK,CAAC,UAAhB,OADTjN,EAAA,GAAAS,EAkDK,MAAA;KAhDF,KAAKyP,EAAO;KACb,OAAM;KACL,eAAaA,EAAO;IAErB7P,GAAAA,CAAAA,EAoBM,OApBN8H,IAoBM,CAnBJ9H,EAA8D,QAA9D+H,IAA8D9H,EAArB4P,EAAO,IAAI,GAAA,CAAA,GAE5CA,EAAO,WAAM,UADrBlQ,EAAA,GAAAC,EAIEE,EAAA4U,CAAA,GAAA;;KAFA,OAAM;KACL,cAAY3I,EAAE,eAAA,CAAA,GAAA,UAAA;IAGJ,GAAA,MAAA,GAAA,CAAA,YAAA,CAAA,KAAA8D,EAAO,WAAM,WAD1BlQ,EAAA,GAAAC,EASSO,GAAA;;KAPP,MAAK;KACL,SAAQ;KACR,MAAK;KACJ,cAAY4L,EAAE,WAAA,CAAA,GAAA,SAAA;KACd,UAAK,MAAEjM,EAAA2M,CAAA,CAAU,CAAC,cAAcoD,EAAO,EAAE;;KAE1C,SAAA9P,QAA4B,CAA5BG,EAA4BJ,EAAAyU,EAAA,GAAA,EAArB,eAAY,OAAM,CAAA,CAAA,CAAA;;IAE3B5U,GAAAA,GAAAA,CAAAA,cAAAA,SAAAA,CAAAA,MAAAA,EAAA,GAAAS,EAES,QAFT4H,IAES/H,EADPH,EAAAwL,CAAA,CAAS,CAAC,QAAQuE,EAAO,QAAQ,CAAA,GAAA,CAAA,EAAA,CAAA,GAG5BA,EAAO,WAAM,WAAtBlQ,EAAA,GAAAS,EAEI,KAFJ6H,IAEIhI,EADC4P,EAAO,SAAS9D,EAAE,iBAAA,CAAA,GAAA,QAAA,CAAA,GAAA,CAAA,KAGV8D,EAAO,WAAM,sBAD1BlQ,EAAA,GAAAS,EAmBM,OAAA;;KAjBJ,MAAK;KACJ,iBAAe;KACf,iBAAe;KACf,iBAAe,KAAK,MAAMyP,EAAO,WAAQ,GAAA;KACzC,cAA2B9D,EAAA,mBAA+D;MAAA,MAAA8D,EAAO;MAAI,SAAW/P,EAAAwL,CAAA,CAAS,CAAC,QAAQuE,EAAO,QAAQ;KAAA,GAAA,0BAAA;KAOlJ,OAAM;IAEN7P,GAAAA,CAAAA,EAGE,OAAA;KAFA,OAAM;KACL,OAAKsB,GAAA,EAAA,OAAA,GAAcuO,EAAO,WAAQ,IAAA,GAAA,CAAA;;IAO7C3P,EA6CSqB,GAAA;KA5CN,MAAMwO,EAAA,OAAQ,SAAI,kBAAuBA,EAAA,OAAQ,SAAI;KACrD,iBAAaO;;KAEd,SAAAvQ,QAwCgB,CAxChBG,EAwCgBsB,GAAA,EAxCD,aAAU,sBAAqB,GAAA;MAC5C,SAAAzB,QAsCO,CAtCPC,EAsCO,QAAA;OAtCD,OAAM;OAAuB,UAAMyB,GAAU+O,IAAU,CAAA,SAAA,CAAA;;OAC3DtQ,EAQewB,GAAA,MAAA;QAPb,SAAA3B,QAMc,CANdG,EAMcyB,GAAA,MAAA;SALZ,SAAA5B,QAIE,CAHAY,EAAAV,EAAA8P,EAAA,OAAQ,SAAI,WAAkChE,EAAE,kBAAA,EAAA,MAA2BgE,EAAA,MAAO,MAAM,KAAI,GAAA,gBAAA,IAA0ChE,EAAE,cAAA,CAAA,GAAA,YAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;;;;OAM9I/L,EAkBM,OAlBNmI,IAkBM;QAjBJnI,EAMQ,SAAA;SANA,KAAKF,EAAA+L,EAAA;SAAQ,OAAM;QAEvB,GAAA5L,EAAA8P,EAAA,OAAQ,SAAI,WAAkChE,EAAE,QAAA,CAAA,GAAA,MAAA,IAAyCA,EAAE,eAAA,CAAA,GAAA,aAAA,CAAA,GAAA,GAAA3D,EAAA;QAK/FlI,EAMEO,IAAA;SALC,IAAIX,EAAA+L,EAAA;SACI,YAAAmE,EAAA;SAAA,uBAAA,AAAAsC,EAAA,SAAA,MAAA,EAAI,QAAAI;SACb,WAAA;SACC,gBAAc5S,EAAA8M,CAAA,CAAK,CAAC,QAAK,KAAU,KAAA;SACnC,oBAAkB9M,EAAA8M,CAAA,CAAK,CAAC,QAAQ9M,EAAAgM,EAAA,IAAU,KAAA;;;;;;;QAEpChM,EAAA8M,CAAA,CAAK,CAAC,SAAfjN,EAAA,GAAAS,EAEI,KAAA;;SAFmB,IAAIN,EAAAgM,EAAA;SAAS,OAAM;SAA2B,MAAK;QACrE,GAAA7L,EAAAH,EAAA8M,CAAA,CAAK,CAAC,KAAK,GAAA,GAAAvE,EAAA,KAAAyK,EAAA,IAAA,EAAA;;OAGlB5S,EAQe0B,GAAA,MAAA;QAPb,SAAA7B,QAEW,CAFXG,EAEWC,GAAA;SAFH,MAAK;SAAS,SAAQ;SAAW,SAAOkQ;;SAAO,SAAAtQ,QAErD,CADAY,EAAAV,EAAA8L,EAAE,UAAA,CAAA,GAAA,QAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;QAEJ7L,CAAAA,GAAAA,EAGSC,GAAA;SAHD,MAAK;SAAU,UAAUL,EAAA8M,CAAA,CAAK,CAAC,QAAQoD,EAAA,MAAK,KAAI,MAAA;;SACtD,SAAAjQ,QAA6B,CAAdD,EAAA8M,CAAA,CAAK,CAAC,QAArBjN,EAAA,GAAAC,EAA6BmB,GAAA,EAAA,KAAA,EAAA,CAAA,KAAA+R,EAAA,IAAA,EAAA,GAAAnS,EAAA,MAC7BV,EAAG8P,EAAA,OAAQ,SAAI,WAAgBhE,EAAE,QAAA,CAAA,GAAA,MAAA,IAAuBA,EAAE,UAAA,CAAA,GAAA,QAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;;;;;;;;;IAOpE7L,EAwCSqB,GAAA;KAxCA,MAAMwO,EAAA,OAAQ,SAAI,UAAeA,EAAA,OAAQ,SAAI;KAAc,iBAAaO;;KAC/E,SAAAvQ,QAsCgB,CAtChBG,EAsCgBsB,GAAA,EAtCD,aAAU,sBAAqB,GAAA;MAC5C,SAAAzB,QAce;OAdfG,EAcewB,GAAA,MAAA;QAbb,SAAA3B,QAWc,CAXdG,EAWcyB,GAAA,MAAA;SAVZ,SAAA5B,QASE,CARAY,EAAAV,EAAA8P,EAAA,OAAQ,SAAI,UAAeA,EAAA,OAAQ,SAAI,SAA8BjQ,EAAAoL,CAAA,CAAM,CAAsC,gBAAA6E,EAAA,MAAO,KAAI,WAAgCA,EAAA,MAAO,MAAM,QAAA,CAAA,GAAoDA,EAAA,MAAO,SAAI,SAAA,sBAAA,mBAAA,IAAA,EAAA,GAAA,CAAA,CAAA,CAAA;;QAU5O7P,CAAAA,GAAAA,EAAwF2B,IAAA,MAAA;SAArE,SAAA9B,QAAiD,CAA9CY,EAAAV,EAAA8L,EAAE,eAAA,CAAA,GAAA,oBAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;;;;OAE1B/L,EAOM,OAPNsI,IAOM,CALIyH,EAAA,OAAQ,SAAI,UAAeA,EAAA,OAAQ,SAAI,UAD/CpQ,EAAA,GAAAC,EAKEgB,IAAA;;QAHC,YAAYd,EAAA2M,CAAA;QACZ,QAAQsD,EAAA,MAAO;QACf,QAAMW;;OAGF5Q,EAAA8M,CAAA,CAAK,CAAC,SAAfjN,EAAA,GAAAS,EAAyF,KAAzFmI,IAAyFtI,EAAlBH,EAAA8M,CAAA,CAAK,CAAC,KAAK,GAAA,CAAA,KAAAkG,EAAA,IAAA,EAAA;OAClF5S,EAYe0B,GAAA,MAAA;QAXb,SAAA7B,QAEW,CAFXG,EAEWC,GAAA;SAFH,MAAK;SAAS,SAAQ;SAAW,SAAOkQ;;SAAO,SAAAtQ,QAErD,CADAY,EAAAV,EAAA8L,EAAE,UAAA,CAAA,GAAA,QAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;QAEJ7L,CAAAA,GAAAA,EAOSC,GAAA;SAPD,MAAK;SAAU,UAAUL,EAAA8M,CAAA,CAAK,CAAC;SAAO,SAAO6D;;SACnD,SAAA1Q,QAA6B,CAAdD,EAAA8M,CAAA,CAAK,CAAC,QAArBjN,EAAA,GAAAC,EAA6BmB,GAAA,EAAA,KAAA,EAAA,CAAA,KAAA+R,EAAA,IAAA,EAAA,GAAAnS,EAAA,MAC7BV,EACE8P,EAAA,OAAQ,SAAI,SAA8BhE,EAAE,aAAA,CAAA,GAAA,WAAA,IAAiDA,EAAE,aAAA,CAAA,GAAA,WAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;;;;;;;;;IASzG7L,EAyDSqB,GAAA;KAxDN,MAAMwO,EAAA,OAAQ,SAAI,YAAiBA,EAAA,OAAQ,SAAI;KAC/C,iBAAaO;;KAEd,SAAAvQ,QAoDgB,CApDhBG,EAoDgBsB,GAAA,EApDD,aAAU,sBAAqB,GAAA;MAC5C,SAAAzB,QAkCe;OAlCfG,EAkCewB,GAAA,MAAA;QAjCb,SAAA3B,QAWc,CAXdG,EAWcyB,GAAA,MAAA;SAVZ,SAAA5B,QASE,CARAY,EAAAV,EAAA8P,EAAA,OAAQ,SAAI,WAAgCjQ,EAAAoL,CAAA,CAAM,CAAA,+BAAyE6E,EAAA,MAAO,MAAM,QAAA,CAAA,GAAA,sBAAA,IAAkHhE,EAAE,uBAAA,CAAA,GAAA,kBAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;QAUhQ7L,CAAAA,GAAAA,EAoBoB2B,IAAA,MAAA;SAnBlB,SAAA9B,QAkBE,CAjBAY,EAAAV,EAAA8P,EAAA,OAAQ,SAAI,YAAA,CAAkBA,EAAA,MAAO,YAA4BhE,EAAA,4BAAA,CAAA,GAAA,mDAAA,IAA2LgE,EAAA,OAAQ,SAAI,eAAsChE,EAAA,2BAAA,CAAA,GAAA,8CAAA,IAA+LA,EAAA,sBAAA,CAAA,GAAA,mDAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;;;;OAoB1ejM,EAAA8M,CAAA,CAAK,CAAC,SAAfjN,EAAA,GAAAS,EAAyF,KAAzFoI,IAAyFvI,EAAlBH,EAAA8M,CAAA,CAAK,CAAC,KAAK,GAAA,CAAA,KAAAkG,EAAA,IAAA,EAAA;OAClF5S,EAce0B,GAAA,MAAA;QAbb,SAAA7B,QAEW,CAFXG,EAEWC,GAAA;SAFH,MAAK;SAAS,SAAQ;SAAW,SAAOkQ;;SAAO,SAAAtQ,QAErD,CADAY,EAAAV,EAAA8L,EAAE,UAAA,CAAA,GAAA,QAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;QAEJ7L,CAAAA,GAAAA,EASSC,GAAA;SATD,MAAK;SAAS,SAAQ;SAAe,UAAUL,EAAA8M,CAAA,CAAK,CAAC;SAAO,SAAO+D;;SACzE,SAAA5Q,QAA6B,CAAdD,EAAA8M,CAAA,CAAK,CAAC,QAArBjN,EAAA,GAAAC,EAA6BmB,GAAA,EAAA,KAAA,EAAA,CAAA,KAAA+R,EAAA,IAAA,EAAA,GAAAnS,EAAA,MAC7BV,EACE8P,EAAA,OAAQ,SAAI,eAAoChE,EAAE,eAAA,CAAA,GAAA,aAAA,IAAqDgE,EAAA,OAAQ,SAAI,YAAiBA,EAAA,MAAO,YAA8BhE,EAAE,sBAAA,CAAA,GAAA,oBAAA,IAAqEA,EAAE,UAAA,CAAA,GAAA,QAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;;;;;;;;;IAW5P7L,EAsISqB,GAAA;KAtIA,MAAMwO,EAAA,OAAQ,SAAI;KAAe,iBAAaO;;KACrD,SAAAvQ,QAoIgB,CApIhBG,EAoIgBsB,GAAA,EApID,aAAU,sBAAqB,GAAA;MAC5C,SAAAzB,QAkIW,CAlIKgQ,EAAA,OAAQ,SAAI,WAA5BpQ,EAAA,GAAAS,EAkIWE,GAAA,EAAA,KAAA,EAAA,GAAA;OAjITJ,EAOewB,GAAA,MAAA;QANb,SAAA3B,QAEgB,CAFhBG,EAEgByB,GAAA,MAAA;SAFH,SAAA5B,QAEX,CADAY,EAAAV,EAAA8L,EAAE,iBAAA,EAAA,MAA0BgE,EAAA,MAAO,MAAM,KAAI,GAAA,eAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;QAE/C7P,CAAAA,GAAAA,EAEsB2B,IAAA,MAAA;SAFH,SAAA9B,QAEjB,CADAY,EAAAV,EAAA8L,EAAE,cAAA,CAAA,GAAA,8DAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;;;;OAGN/L,EAyBM,OAzBNyI,IAyBM,CAxBJzI,EAcQ,SAdR0I,IAcQ,CAbN1I,EAAmF,QAAnF2I,IAAmF1I,EAAtD8L,EAAE,gBAAA,CAAA,GAAA,oBAAA,CAAA,GAAA,CAAA,GAC/BjK,GAAA9B,EAWS,UAAA;QAXQ,uBAAA,AAAAsS,EAAA,SAAA,MAAA,EAAM,QAAAI;QAAG,OAAKrS,EAAE+J,EAAM;OACrCzK,GAAAA,EAAAA,EAAA,EAAA,GAAAS,EAMSE,GAAA,MAAAC,EALW4P,GAAA,OAAO,YAAQ,CAAA,IAA1B,OADTxQ,EAAA,GAAAS,EAMS,UAAA;QAJN,KAAK2Q;QACL,OAAO,OAAOA,CAAO;OAEnB,GAAA9Q,EAAA2Q,GAAYG,CAAO,CAAA,GAAA,GAAAnI,EAAA,EAEV,GAAA,GAAA,IAAAuH,GAAA,OAAO,eAArBxQ,EAAA,GAAAS,EAES,UAFTyI,IAES5I,EADJ8L,EAAE,gBAAA,CAAA,GAAA,OAAA,CAAA,GAAA,CAAA,KAAA+G,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,GAAA,CATQ,CAAA/Q,IAAAkO,EAAA,KAAM,CAAA,CAAA,CAAA,CAAA,GAazB/P,EAQSC,GAAA;QAPP,MAAK;QACJ,UAAUL,EAAA8M,CAAA,CAAK,CAAC;QAChB,SAAK,AAAA0F,EAAA,SAAA,MAAExS,EAAA2M,CAAA,CAAU,CAAC,WAAWwD,EAAA,UAAM,UAAA,OAAsB,OAAOA,EAAA,KAAM,CAAA;;QAEvE,SAAAlQ,QAA6B,CAAdD,EAAA8M,CAAA,CAAK,CAAC,QAArBjN,EAAA,GAAAC,EAA6BmB,GAAA,EAAA,KAAA,EAAA,CAAA,MAC7BpB,EAAA,GAAAC,EAAsCE,EAAAiV,EAAA,GAAA;;SAArB,eAAY;QAASpU,CAAAA,IAAAA,EAAA,MACtCV,EAAG8L,EAAE,eAAA,CAAA,GAAA,aAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;;OAGAjM,EAAA8M,CAAA,CAAK,CAAC,SAAfjN,EAAA,GAAAS,EAAyF,KAAzF0I,IAAyF7I,EAAlBH,EAAA8M,CAAA,CAAK,CAAC,KAAK,GAAA,CAAA,KAAAkG,EAAA,IAAA,EAAA;OACvE/C,EAAA,MAAO,OAAlBpQ,EAAA,GAAAS,EA6BM,OA7BN2I,IA6BM;QA5BJ/I,EAA+E,QAA/EgJ,IAA+E/I,EAA1C8L,EAAE,QAAA,CAAA,GAAA,gBAAA,CAAA,GAAA,CAAA;QACvC/L,EAeM,OAfNiJ,IAeM,CAdJ/I,EAMEO,IAAA;SALA,UAAA;SACC,eAAasP,EAAA,MAAO;SACrB,KAAI;SACH,cAAYhE,EAAE,QAAA,CAAA,GAAA,gBAAA;SACd,SAAK,AAAAuG,EAAA,SAAA,MAAGI,EAAO,OAA4B,OAAM;QAEpDxS,GAAAA,MAAAA,GAAAA,CAAAA,eAAAA,YAAAA,CAAAA,GAAAA,EAMSC,GAAA;SAND,MAAK;SAAS,SAAQ;SAAW,SAAK,AAAAmS,EAAA,SAAA,MAAEtB,GAAKjB,EAAA,MAAO,OAAG,EAAA;;SAC7D,SAAAhQ,QAA8C,CAA7BmQ,EAAA,SAAjBvQ,EAAA,GAAAC,EAA8CE,EAAA4U,CAAA,GAAA;;UAArB,eAAY;SACrC/U,CAAAA,MAAAA,EAAA,GAAAC,EAAsCE,EAAAsU,EAAA,GAAA;;UAArB,eAAY;SAASzT,CAAAA,IAAAA,EAAA,MACtCV,EACEiQ,EAAA,QAASnE,EAAE,eAAA,CAAA,GAAA,aAAA,IAAqCA,EAAE,aAAA,CAAA,GAAA,WAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;;QAIxD/L,EAUO,QAVPkJ,IAUOjJ,EARH8P,EAAA,MAAO,YAA8BhE,EAAA,gBAAwE,EAAA,MAAAjM,EAAAwL,CAAA,CAAS,CAAC,SAASyE,EAAA,MAAO,SAAS,EAAA,GAAA,eAAA,IAAsFhE,EAAE,sBAAA,CAAA,GAAA,eAAA,CAAA,GAAA,CAAA;;OAUnOoE,GAAA,OAAO,eAAlBxQ,EAAA,GAAAS,EA0DM,OA1DN+I,IA0DM,CAzDJnJ,EAAmE,MAAnEoJ,IAAmEnJ,EAAhC8L,EAAE,SAAA,CAAA,GAAA,OAAA,CAAA,GAAA,CAAA,GACtBgE,EAAA,MAAO,UAAK,QAA3BpQ,EAAA,GAAAC,EAAwCmB,GAAA,EAAA,KAAA,EAAA,CAAA,KAC1BgP,EAAA,MAAO,MAAM,WAAM,KAAjCpQ,EAAA,GAAAS,EAEI,KAFJiJ,IAEIpJ,EADC8L,EAAE,YAAA,CAAA,GAAA,cAAA,CAAA,GAAA,CAAA,MAEPpM,EAAA,GAAAS,EAmDK,MAnDLkJ,IAmDK,EAlDH3J,EAAA,EAAA,GAAAS,EAiDKE,GAAA,MAAAC,EAhDYwP,EAAA,MAAO,QAAf,OADTpQ,EAAA,GAAAS,EAiDK,MAAA;QA/CF,KAAK4U,EAAK;QACX,OAAM;;QAENhV,EAwBM,OAxBNuJ,IAwBM,CAvBJvJ,EAKI,KAAA;SAJD,OAAKK,EAAEP,EAAA4T,CAAA,CAAE,CAAA,YAAasB,EAAK,WAAO,oCAAA,CAAA;SACnC,KAAI;QAED,GAAA/U,EAAA+U,EAAK,GAAG,GAAA,CAAA,GAEbhV,EAgBI,KAhBJwJ,IAgBIvJ,EAdA+U,EAAK,UAAkCjJ,EAAE,gBAAA,CAAA,GAAA,SAAA,IAA0DiJ,EAAK,YAAsCjJ,EAAA,gBAAwF,EAAA,MAAAjM,EAAAwL,CAAA,CAAS,CAAC,SAAS0J,EAAK,SAAS,EAAA,GAAA,eAAA,IAA8GjJ,EAAE,sBAAA,CAAA,GAAA,eAAA,CAAA,IASvX,QAEF9L,EACEH,EAAAoL,CAAA,CAAM,CAAA,+BAAgC8J,EAAK,WAAS,CAAA,GAAA,kBAAA,CAAA,GAAA,CAAA,CAAA,CAAA;QAKlDA,EAAK,OAAG,CAAKA,EAAK,WAD1BrV,EAAA,GAAAC,EASSO,GAAA;;SAPP,MAAK;SACL,SAAQ;SACR,MAAK;SACJ,cAAY4L,EAAE,aAAA,CAAA,GAAA,WAAA;SACd,UAAK,MAAEiF,GAAKgE,EAAK,OAAG,EAAA;;SAErB,SAAAjV,QAA+B,CAA/BG,EAA+BJ,EAAAsU,EAAA,GAAA,EAArB,eAAY,OAAM,CAAA,CAAA,CAAA;;;QAE9BlU,EAQSC,GAAA;SAPP,MAAK;SACL,SAAQ;SACR,MAAK;SACL,OAAM;SACL,UAAK,MAAEL,EAAA2M,CAAA,CAAU,CAAC,WAAWuI,EAAK,EAAE;;SAErC,SAAAjV,QAAgC,CAA7BY,EAAAV,EAAA8L,EAAE,UAAA,CAAA,GAAA,QAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;;;OAKb7L,EAIe0B,GAAA,MAAA;QAHb,SAAA7B,QAEW,CAFXG,EAEWC,GAAA;SAFH,MAAK;SAAS,SAAQ;SAAW,SAAOkQ;;SAAO,SAAAtQ,QAErD,CADAY,EAAAV,EAAA8L,EAAE,SAAA,CAAA,GAAA,OAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;;;;;;;;;IAOZ7L,EAmGSqB,GAAA;KAnGA,MAAM2P,EAAA,UAAO;KAAY,iBAAW,AAAAoB,EAAA,SAAG,MAAI,CAAM/B,KAAQzQ,EAAA2M,CAAA,CAAU,CAAC,aAAY;;KACvF,SAAA1M,QAiGgB,CAjGhBG,EAiGgBsB,GAAA;MAhGd,OAAM;MACN,aAAU;MACT,WAASoQ;;MAEV,SAAA7R,QAEe;OAFfG,EAEewB,GAAA,MAAA;QADb,SAAA3B,QAA0E,CAA1EG,EAA0EyB,GAAA,EAA7D,OAAM,gBAAe,GAAA;SAAC,SAAA5B,QAAyB,CAAtBY,EAAAV,EAAAiR,EAAA,OAAS,MAAM,IAAI,GAAA,CAAA,CAAA,CAAA;;;;;OAE3DlR,EA2CM,OA3CNyJ,IA2CM,CAxCY0H,EAAA,QAEFA,EAAA,MAAY,cAObA,EAAA,MAAY,SAAI,WAD7BxR,EAAA,GAAAS,EAKE,OAAA;;QAHC,KAAK+Q,EAAA,MAAY;QACjB,KAAKD,EAAA,OAAS,MAAM,QAAI;QACzB,OAAM;OAGK,GAAA,MAAA,GAAAvH,EAAA,KAAAwH,EAAA,MAAY,SAAI,SAD7BxR,EAAA,GAAAS,EAKE,UAAA;;QAHC,KAAK+Q,EAAA,MAAY;QACjB,OAAOD,EAAA,OAAS,MAAM,QAAI;QAC3B,OAAM;OAGK,GAAA,MAAA,GAAAtH,EAAA,KAAAuH,EAAA,MAAY,SAAI,WAD7BxR,EAAA,GAAAS,EAOQ,SAAA;;QALL,KAAK+Q,EAAA,MAAY;QAClB,UAAA;QACA,OAAM;OAENnR,GAAAA,CAAAA,GAAAA,AAAAA,EAAAA,QAAAA,CAAAA,EAAyB,SAAA,EAAlB,MAAK,WAAU,GAAA,MAAA,EAAA,CAAA,CAAA,GAAA,GAAA6J,EAAA,KAGXsH,EAAA,MAAY,SAAI,WAD7BxR,EAAA,GAAAS,EAKE,SAAA;;QAHC,KAAK+Q,EAAA,MAAY;QAClB,UAAA;QACA,OAAM;OAERxR,GAAAA,MAAAA,GAAAA,EAAAA,MAAAA,EAAA,GAAAS,EAK+B,OAL/B2J,IAK+B9J,EAAzBkR,EAAA,MAAY,IAAI,GAAA,CAAA,MAtCtBxR,EAAA,GAAAS,EAMM,OANNsJ,IAMM,CAFmBwH,EAAA,SAAvBvR,EAAA,GAAAC,EAAyEoB,IAAA;;QAAxC,OAAOkQ,EAAA,MAAQ;QAAO,OAAM;OAC7DlR,GAAAA,MAAAA,GAAAA,CAAAA,OAAAA,CAAAA,KAAAA,EAAAA,IAAAA,EAAAA,GAAAA,EAAwF,KAAA,MAAAC,EAAlF8L,EAAE,uBAAA,CAAA,GAAA,4CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,MANVpM,EAAA,GAAAC,EAA+BmB,GAAA,EAAA,KAAA,EAAA,CAAA,EAuCT,CAAA;OAEfoQ,EAAA,OAAa,aAAtBxR,EAAA,GAAAS,EAEI,KAFJ4J,IAEI/J,EADC8L,EAAE,qBAAA,CAAA,GAAA,2CAAA,CAAA,GAAA,CAAA,KAAA+G,EAAA,IAAA,EAAA;OAEP5S,EAyCe0B,GAAA,EAzCD,OAAM,qDAAoD,GAAA;QACtE,SAAA7B,QAqBM,CArBNC,EAqBM,OArBNiK,IAqBM,CApBJ/J,EASSC,GAAA;SARP,MAAK;SACL,SAAQ;SACR,MAAK;SACJ,UAAQ,CAAGiR,EAAA;SACX,cAAYrF,EAAE,YAAA,CAAA,GAAA,eAAA;SACd,SAAK,AAAAuG,EAAA,SAAA,MAAElB,EAAA,SAAYtR,EAAA2M,CAAA,CAAU,CAAC,YAAY2E,EAAA,KAAQ;;SAEnD,SAAArR,QAA6D,CAA7DG,EAA6DJ,EAAAmV,EAAA,GAAA;UAA5C,OAAM;UAAiB,eAAY;;;QAEtD/U,GAAAA,GAAAA,CAAAA,YAAAA,YAAAA,CAAAA,GAAAA,EASSC,GAAA;SARP,MAAK;SACL,SAAQ;SACR,MAAK;SACJ,UAAQ,CAAGkR,EAAA;SACX,cAAYtF,EAAE,QAAA,CAAA,GAAA,WAAA;SACd,SAAK,AAAAuG,EAAA,SAAA,MAAEjB,EAAA,SAAQvR,EAAA2M,CAAA,CAAU,CAAC,YAAY4E,EAAA,KAAI;;SAE3C,SAAAtR,QAA8D,CAA9DG,EAA8DJ,EAAAiT,EAAA,GAAA;UAA5C,OAAM;UAAiB,eAAY;;;QAGzD/S,GAAAA,GAAAA,CAAAA,YAAAA,YAAAA,CAAAA,CAAAA,CAAAA,GAAAA,EAiBM,OAjBNkK,IAiBM,CAfIiH,EAAA,OAAa,YAAYA,EAAA,MAAY,OAD7CxR,EAAA,GAAAC,EASSO,GAAA;;SAPP,MAAK;SACL,SAAQ;SACR,MAAK;SACJ,SAAOoR;;SAER,SAAAxR,QAAoC,CAApCG,EAAoCJ,EAAAoV,EAAA,GAAA,EAArB,eAAY,OAAM,CAAA,GAAGvU,EAAA,MACpCV,EAAG8L,EAAE,cAAA,CAAA,GAAA,YAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;QAEO,CAAA,KAAA+G,EAAA,IAAA,EAAA,GAAA3B,EAAA,OAAa,eAA3BxR,EAAA,GAAAC,EAKSO,GAAA;;SAL+B,MAAK;SAAS,MAAK;SAAK,YAAA;;SAC9D,SAAAJ,QAGI,CAHJC,EAGI,KAAA,EAHA,MAAMmR,EAAA,MAAY,YAAA,GAAA,CACpBjR,EAAmCJ,EAAAmU,EAAA,GAAA,EAArB,eAAY,OAAM,CAAA,GAAGtT,EAAA,MACnCV,EAAG8L,EAAE,YAAA,CAAA,GAAA,UAAA,CAAA,GAAA,CAAA,CAAA,GAAA,GAAA5B,EAAA,CAAA,CAAA;;;;;;;;;;IAOjBjK,EAAgE8B,IAAA;KAA5C,SAASsP,GAAA;KAAU,SAAS7G"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormBlock.js","names":["_sfc_main","FormBlock_vue_vue_type_script_setup_true_lang_default","FormBlock_default"],"sources":["../../../src/components/form/FormBlock.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { ActionContext, ActionSchema, FormBlock as FormBlockSchema } from '@alfakit/core'\nimport {\n FormStore,\n applyFormRefresh,\n formActionsVisible,\n formIdentity,\n formRefreshFor,\n isImplicitSubmit,\n isLeavingVisit,\n pageFlash,\n pageFormName,\n registerConflictForm,\n registerFormSubmitter,\n registerPageForm,\n resolvePartialProps,\n wizardProgressStore,\n} from '@alfakit/core'\nimport { router } from '@inertiajs/vue3'\nimport { computed, onBeforeUnmount, onMounted, onScopeDispose, watch } from 'vue'\nimport { useStore } from '../../composables/use-store'\nimport { useActionRunner, useAlfakitProps, usePageSchema, usePanel, useT } from '../../context'\nimport ActionList from '../actions/ActionList.vue'\nimport SchemaRenderer from '../schema/SchemaRenderer.vue'\nimport { showToast } from '../notifications/flash-toasts'\nimport { provideForm } from './form-context'\n\n/**\n * A page form: its state lives in a FormStore, and its buttons are actions that post the\n * current values through the action endpoint.\n */\nconst props = defineProps<{ block: FormBlockSchema }>()\n\nconst panel = usePanel()\nconst page = usePageSchema()\nconst pageProps = useAlfakitProps()\nconst runner = useActionRunner()\nconst t = useT()\nconst token = computed(() => page.value?.token ?? '')\n\nconst store = new FormStore(props.block, {\n token: token.value,\n component: props.block.component,\n refreshUrl: panel.value.endpoints.schemaRefresh,\n optionsUrl: panel.value.endpoints.schemaOptions,\n validateUrl: panel.value.endpoints.schemaValidate,\n // A halted wizard step shows what its hook sent.\n onNotifications: (notifications) => notifications.forEach((n) => showToast(n)),\n // Live dashboard filters are applied by the refresh; the widgets reload to follow.\n onRefreshed: () => {\n if (props.block.liveFilters) router.reload({ only: resolvePartialProps(['page']) })\n },\n})\n\nprovideForm(store)\n\n// Named forms of custom pages (`<PageForm name>`) publish their store for page method calls\n// (browser only: mounted hooks never run during a server render).\nlet unregisterPageForm: (() => void) | undefined\n\nonMounted(() => {\n const name = pageFormName(props.block.component)\n\n if (name) unregisterPageForm = registerPageForm(name, store)\n})\n\n// Edit pages: the conflict banner diffs and merges the main form (`detectConflicts()`).\nlet unregisterConflictForm: (() => void) | undefined\n\nonMounted(() => {\n if (props.block.component === 'form') unregisterConflictForm = registerConflictForm(store)\n})\n\nonBeforeUnmount(() => unregisterConflictForm?.())\n\n// Buttons elsewhere with `formId('form')` (a header \"Save\") submit through this form.\nlet unregisterSubmitter: (() => void) | undefined\n\nonMounted(() => {\n unregisterSubmitter = registerFormSubmitter(props.block.component, (action, ctx) =>\n trigger(action, ctx),\n )\n})\n\nonBeforeUnmount(() => {\n unregisterPageForm?.()\n unregisterSubmitter?.()\n})\n\n// The store survives reloads of the same form (table sorting/paging, polling,\n// relation-manager actions all deliver a new `block` object); only a different form\n// identity starts from server state again. The token is re-issued per response, so it\n// is swapped in place instead of being part of the identity.\nwatch(\n () => formIdentity(page.value, props.block),\n () => store.fill(props.block),\n)\n\nwatch(token, (value) => store.setToken(value))\n\n// After this form's own successful submit, refill from the server's new state. The new\n// block may arrive before or after Inertia's `success` event, so handle both orders.\nlet submittedBlock: FormBlockSchema | null = null\nlet refillPending = false\n\nwatch(\n () => props.block,\n (block) => {\n if (refillPending) {\n refillPending = false\n store.fill(block)\n }\n },\n)\n\nwatch(\n () => pageProps.value.errors,\n (errors) => store.setErrors((errors as Record<string, string>) ?? {}),\n { immediate: true },\n)\n\nconst state = useStore(store.store)\nconst context = computed<ActionContext>(() => ({ token: token.value, component: 'page' }))\nlet submitting = false\n\nconst actions = computed<ActionSchema[]>(() =>\n props.block.actions.map((action) => ({ ...action, hasModal: false })),\n)\nconst primary = computed(() => actions.value[0])\n\n// Wizard forms (`HasWizard` pages) show their buttons on the last step only.\nconst progress = useStore(wizardProgressStore(store))\nconst showActions = computed(() => formActionsVisible(props.block, progress.value))\n\nconst trigger = async (action: ActionSchema, ctx: ActionContext) => {\n if (action.url && !action.hasAction) {\n return runner.trigger(action, ctx)\n }\n\n submitting = true\n submittedBlock = props.block\n store.setProcessing(true)\n runner.execute(action, ctx, store.state.values)\n}\n\n// Track this form's own submit visit so unrelated reloads finishing meanwhile (polling,\n// relation-manager paging) neither end its processing state nor count as its success.\nlet submitVisit: string | null = null\n\nconst offStart = router.on('start', (event) => {\n const visit = event.detail.visit\n\n if (submitting && !submitVisit && visit.method !== 'get') {\n submitVisit = visit.id\n }\n})\n\nconst offSuccess = router.on('success', (event) => {\n const id = submitVisit\n\n if (!id || (event.detail.visitId ?? id) !== id) return\n\n // A halted action (rate limit, `halt()`) saved nothing: keep what the user typed.\n if (pageFlash(event.detail.page).alfakitAction?.status === 'halted') return\n\n if (props.block !== submittedBlock) {\n store.fill(props.block)\n } else {\n refillPending = true\n }\n})\n\n// `refreshFormData([...])`: an action changed the record; copy those fields in.\nconst offRefresh = router.on('success', (event) => {\n const refresh = formRefreshFor(pageFlash(event.detail.page), props.block.component)\n\n if (refresh) applyFormRefresh(store, refresh)\n})\n\nconst offFinish = router.on('finish', (event) => {\n if (submitVisit && event.detail.visit.id !== submitVisit) return\n\n store.setProcessing(false)\n submitting = false\n submitVisit = null\n})\n\nconst offBefore = router.on('before', (event) => {\n if (!panel.value.unsavedChangesAlerts) {\n return\n }\n\n if (\n store.isDirty &&\n !submitting &&\n isLeavingVisit(event.detail.visit) &&\n !window.confirm(t('unsaved_changes', {}, 'You have unsaved changes. Leave anyway?'))\n ) {\n event.preventDefault()\n }\n})\n\nonScopeDispose(() => {\n offStart()\n offSuccess()\n offRefresh()\n offFinish()\n offBefore()\n store.destroy()\n})\n\nconst onSubmit = () => {\n if (primary.value && showActions.value) {\n void trigger(primary.value, context.value)\n }\n}\n\n// Enter in a text field runs the primary action (actions are type=\"button\").\nconst onKeydown = (event: KeyboardEvent) => {\n if (\n primary.value &&\n showActions.value &&\n isImplicitSubmit(event, event.currentTarget as HTMLFormElement)\n ) {\n event.preventDefault()\n void trigger(primary.value, context.value)\n }\n}\n</script>\n\n<template>\n <form\n data-slot=\"form-block\"\n class=\"flex flex-col gap-6\"\n @submit.prevent=\"onSubmit\"\n @keydown=\"onKeydown\"\n >\n <fieldset :disabled=\"state.processing || props.block.operation === 'view'\" class=\"contents\">\n <SchemaRenderer :components=\"state.components\" :columns=\"state.columns\" />\n </fieldset>\n <div v-if=\"actions.length > 0 && showActions\" data-slot=\"form-actions\" class=\"border-t pt-6\">\n <ActionList :actions=\"actions\" :context=\"context\" :on-trigger=\"trigger\" />\n </div>\n </form>\n</template>\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"FormBlock.js","names":["_sfc_main","FormBlock_vue_vue_type_script_setup_true_lang_default","FormBlock_default"],"sources":["../../../src/components/form/FormBlock.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { ActionContext, ActionSchema, FormBlock as FormBlockSchema } from '@alfakit/core'\nimport {\n FormStore,\n applyFormRefresh,\n formActionsVisible,\n formIdentity,\n formRefreshFor,\n isImplicitSubmit,\n isLeavingVisit,\n pageFlash,\n pageFormName,\n registerConflictForm,\n registerFormSubmitter,\n registerPageForm,\n resolvePartialProps,\n shouldResyncForm,\n wizardProgressStore,\n} from '@alfakit/core'\nimport { router } from '@inertiajs/vue3'\nimport { computed, onBeforeUnmount, onMounted, onScopeDispose, watch } from 'vue'\nimport { useStore } from '../../composables/use-store'\nimport { useActionRunner, useAlfakitProps, usePageSchema, usePanel, useT } from '../../context'\nimport ActionList from '../actions/ActionList.vue'\nimport SchemaRenderer from '../schema/SchemaRenderer.vue'\nimport { showToast } from '../notifications/flash-toasts'\nimport { provideForm } from './form-context'\n\n/**\n * A page form: its state lives in a FormStore, and its buttons are actions that post the\n * current values through the action endpoint.\n */\nconst props = defineProps<{ block: FormBlockSchema }>()\n\nconst panel = usePanel()\nconst page = usePageSchema()\nconst pageProps = useAlfakitProps()\nconst runner = useActionRunner()\nconst t = useT()\nconst token = computed(() => page.value?.token ?? '')\n\nconst store = new FormStore(props.block, {\n token: token.value,\n component: props.block.component,\n refreshUrl: panel.value.endpoints.schemaRefresh,\n optionsUrl: panel.value.endpoints.schemaOptions,\n validateUrl: panel.value.endpoints.schemaValidate,\n // A halted wizard step shows what its hook sent.\n onNotifications: (notifications) => notifications.forEach((n) => showToast(n)),\n // Live dashboard filters are applied by the refresh; the widgets reload to follow.\n onRefreshed: () => {\n if (props.block.liveFilters) router.reload({ only: resolvePartialProps(['page']) })\n },\n})\n\nprovideForm(store)\n\n// Named forms of custom pages (`<PageForm name>`) publish their store for page method calls\n// (browser only: mounted hooks never run during a server render).\nlet unregisterPageForm: (() => void) | undefined\n\nonMounted(() => {\n const name = pageFormName(props.block.component)\n\n if (name) unregisterPageForm = registerPageForm(name, store)\n})\n\n// Edit pages: the conflict banner diffs and merges the main form (`detectConflicts()`).\nlet unregisterConflictForm: (() => void) | undefined\n\nonMounted(() => {\n if (props.block.component === 'form') unregisterConflictForm = registerConflictForm(store)\n})\n\nonBeforeUnmount(() => unregisterConflictForm?.())\n\n// Buttons elsewhere with `formId('form')` (a header \"Save\") submit through this form.\nlet unregisterSubmitter: (() => void) | undefined\n\nonMounted(() => {\n unregisterSubmitter = registerFormSubmitter(props.block.component, (action, ctx) =>\n trigger(action, ctx),\n )\n})\n\nonBeforeUnmount(() => {\n unregisterPageForm?.()\n unregisterSubmitter?.()\n})\n\n// The store survives reloads of the same form (table sorting/paging, polling,\n// relation-manager actions all deliver a new `block` object); only a different form\n// identity starts from server state again. The token is re-issued per response, so it\n// is swapped in place instead of being part of the identity.\nwatch(\n () => formIdentity(page.value, props.block),\n () => store.fill(props.block),\n)\n\nwatch(token, (value) => store.setToken(value))\n\n// After this form's own successful submit, refill from the server's new state. The new\n// block may arrive before or after Inertia's `success` event, so handle both orders.\nlet submittedBlock: FormBlockSchema | null = null\nlet refillPending = false\n// Another action succeeded and its new block has not arrived yet.\nlet resyncPending = false\n// The block when the latest non-GET visit started, to tell whether its response arrived.\nlet visitBlock: FormBlockSchema | null = null\n\nwatch(\n () => props.block,\n (block) => {\n if (refillPending) {\n refillPending = false\n store.fill(block)\n }\n\n if (resyncPending) {\n resyncPending = false\n\n if (!store.isDirty) store.fill(block)\n }\n },\n)\n\nwatch(\n () => pageProps.value.errors,\n (errors) => store.setErrors((errors as Record<string, string>) ?? {}),\n { immediate: true },\n)\n\nconst state = useStore(store.store)\nconst context = computed<ActionContext>(() => ({ token: token.value, component: 'page' }))\nlet submitting = false\n\nconst actions = computed<ActionSchema[]>(() =>\n props.block.actions.map((action) => ({ ...action, hasModal: false })),\n)\nconst primary = computed(() => actions.value[0])\n\n// Wizard forms (`HasWizard` pages) show their buttons on the last step only.\nconst progress = useStore(wizardProgressStore(store))\nconst showActions = computed(() => formActionsVisible(props.block, progress.value))\n\nconst trigger = async (action: ActionSchema, ctx: ActionContext) => {\n if (action.url && !action.hasAction) {\n return runner.trigger(action, ctx)\n }\n\n submitting = true\n submittedBlock = props.block\n store.setProcessing(true)\n runner.execute(action, ctx, store.state.values)\n}\n\n// Track this form's own submit visit so unrelated reloads finishing meanwhile (polling,\n// relation-manager paging) neither end its processing state nor count as its success.\nlet submitVisit: string | null = null\n\nconst offStart = router.on('start', (event) => {\n const visit = event.detail.visit\n\n if (submitting && !submitVisit && visit.method !== 'get') {\n submitVisit = visit.id\n }\n\n if (visit.method !== 'get') visitBlock = props.block\n})\n\nconst offSuccess = router.on('success', (event) => {\n const id = submitVisit\n\n // Another action changed the record: show the server's new form unless it holds edits.\n if (!id && shouldResyncForm(pageFlash(event.detail.page), store)) {\n if (props.block !== visitBlock) {\n store.fill(props.block)\n } else {\n resyncPending = true\n }\n\n return\n }\n\n if (!id || (event.detail.visitId ?? id) !== id) return\n\n // A halted action (rate limit, `halt()`) saved nothing: keep what the user typed.\n if (pageFlash(event.detail.page).alfakitAction?.status === 'halted') return\n\n if (props.block !== submittedBlock) {\n store.fill(props.block)\n } else {\n refillPending = true\n }\n})\n\n// `refreshFormData([...])`: an action changed the record; copy those fields in.\nconst offRefresh = router.on('success', (event) => {\n const refresh = formRefreshFor(pageFlash(event.detail.page), props.block.component)\n\n if (refresh) applyFormRefresh(store, refresh)\n})\n\nconst offFinish = router.on('finish', (event) => {\n if (submitVisit && event.detail.visit.id !== submitVisit) return\n\n store.setProcessing(false)\n submitting = false\n submitVisit = null\n})\n\nconst offBefore = router.on('before', (event) => {\n if (!panel.value.unsavedChangesAlerts) {\n return\n }\n\n if (\n store.isDirty &&\n !submitting &&\n isLeavingVisit(event.detail.visit) &&\n !window.confirm(t('unsaved_changes', {}, 'You have unsaved changes. Leave anyway?'))\n ) {\n event.preventDefault()\n }\n})\n\nonScopeDispose(() => {\n offStart()\n offSuccess()\n offRefresh()\n offFinish()\n offBefore()\n store.destroy()\n})\n\nconst onSubmit = () => {\n if (primary.value && showActions.value) {\n void trigger(primary.value, context.value)\n }\n}\n\n// Enter in a text field runs the primary action (actions are type=\"button\").\nconst onKeydown = (event: KeyboardEvent) => {\n if (\n primary.value &&\n showActions.value &&\n isImplicitSubmit(event, event.currentTarget as HTMLFormElement)\n ) {\n event.preventDefault()\n void trigger(primary.value, context.value)\n }\n}\n</script>\n\n<template>\n <form\n data-slot=\"form-block\"\n class=\"flex flex-col gap-6\"\n @submit.prevent=\"onSubmit\"\n @keydown=\"onKeydown\"\n >\n <fieldset :disabled=\"state.processing || props.block.operation === 'view'\" class=\"contents\">\n <SchemaRenderer :components=\"state.components\" :columns=\"state.columns\" />\n </fieldset>\n <div v-if=\"actions.length > 0 && showActions\" data-slot=\"form-actions\" class=\"border-t pt-6\">\n <ActionList :actions=\"actions\" :context=\"context\" :on-trigger=\"trigger\" />\n </div>\n </form>\n</template>\n"],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormBlock.vue.d.ts","sourceRoot":"","sources":["../../../src/components/form/FormBlock.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FormBlock.vue.d.ts","sourceRoot":"","sources":["../../../src/components/form/FormBlock.vue"],"names":[],"mappings":"AA+QA,OAAO,KAAK,EAA+B,SAAS,IAAI,eAAe,EAAE,MAAM,eAAe,CAAA;AA2B9F;;;GAGG;AACH,KAAK,WAAW,GAAG;IAAE,KAAK,EAAE,eAAe,CAAA;CAAE,CAAC;;AA8S9C,wBAMG"}
|