@alfakit/vue 0.1.7 → 0.1.9

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.
Files changed (100) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/components/actions/ActionModal.js.map +1 -1
  3. package/dist/components/actions/ActionModal.vue.d.ts.map +1 -1
  4. package/dist/components/actions/ActionModal.vue_vue_type_script_setup_true_lang.js +1 -1
  5. package/dist/components/actions/ActionModal.vue_vue_type_script_setup_true_lang.js.map +1 -1
  6. package/dist/components/form/FormBlock.js.map +1 -1
  7. package/dist/components/form/FormBlock.vue.d.ts.map +1 -1
  8. package/dist/components/form/FormBlock.vue_vue_type_script_setup_true_lang.js +79 -78
  9. package/dist/components/form/FormBlock.vue_vue_type_script_setup_true_lang.js.map +1 -1
  10. package/dist/components/panel/BottomNav.js.map +1 -1
  11. package/dist/components/panel/BottomNav.vue_vue_type_script_setup_true_lang.js +2 -2
  12. package/dist/components/panel/BottomNav.vue_vue_type_script_setup_true_lang.js.map +1 -1
  13. package/dist/components/panel/KeyboardShortcuts.js.map +1 -1
  14. package/dist/components/panel/KeyboardShortcuts.vue_vue_type_script_setup_true_lang.js +1 -1
  15. package/dist/components/panel/KeyboardShortcuts.vue_vue_type_script_setup_true_lang.js.map +1 -1
  16. package/dist/components/panel/NavGroup.js.map +1 -1
  17. package/dist/components/panel/NavGroup.vue_vue_type_script_setup_true_lang.js +3 -3
  18. package/dist/components/panel/NavGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  19. package/dist/components/panel/NavItem.js.map +1 -1
  20. package/dist/components/panel/NavItem.vue.d.ts.map +1 -1
  21. package/dist/components/panel/NavItem.vue_vue_type_script_setup_true_lang.js +1 -1
  22. package/dist/components/panel/NavItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  23. package/dist/components/panel/NavSubItem.js.map +1 -1
  24. package/dist/components/panel/NavSubItem.vue.d.ts.map +1 -1
  25. package/dist/components/panel/NavSubItem.vue_vue_type_script_setup_true_lang.js +1 -1
  26. package/dist/components/panel/NavSubItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  27. package/dist/components/ui/TooltipTrigger.js.map +1 -1
  28. package/dist/components/ui/TooltipTrigger.vue.d.ts +2 -2
  29. package/dist/components/ui/TooltipTrigger.vue.d.ts.map +1 -1
  30. package/dist/components/ui/TooltipTrigger.vue_vue_type_script_setup_true_lang.js +10 -7
  31. package/dist/components/ui/TooltipTrigger.vue_vue_type_script_setup_true_lang.js.map +1 -1
  32. package/dist/eject-manifest.json +4 -2
  33. package/dist/index.js +2 -2
  34. package/dist/layouts/TopNavLayout.js.map +1 -1
  35. package/dist/layouts/TopNavLayout.vue_vue_type_script_setup_true_lang.js +2 -2
  36. package/dist/layouts/TopNavLayout.vue_vue_type_script_setup_true_lang.js.map +1 -1
  37. package/dist/layouts/TopNavMenu.js.map +1 -1
  38. package/dist/layouts/TopNavMenu.vue_vue_type_script_setup_true_lang.js +1 -1
  39. package/dist/layouts/TopNavMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  40. package/dist/standalone/AlfakitComponent.js.map +1 -1
  41. package/dist/standalone/AlfakitComponent.vue.d.ts.map +1 -1
  42. package/dist/standalone/AlfakitComponent.vue_vue_type_script_setup_true_lang.js +29 -24
  43. package/dist/standalone/AlfakitComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  44. package/dist/standalone.css +10 -6
  45. package/dist/starter-kit/AlfakitStarterKitRoot.js.map +1 -1
  46. package/dist/starter-kit/AlfakitStarterKitRoot.vue.d.ts.map +1 -1
  47. package/dist/starter-kit/AlfakitStarterKitRoot.vue_vue_type_script_setup_true_lang.js +25 -21
  48. package/dist/starter-kit/AlfakitStarterKitRoot.vue_vue_type_script_setup_true_lang.js.map +1 -1
  49. package/dist/starter-kit/index.d.ts +1 -1
  50. package/dist/starter-kit/index.d.ts.map +1 -1
  51. package/dist/starter-kit/index.js +2 -2
  52. package/dist/starter-kit/widgets/LanguageMenu.js +7 -0
  53. package/dist/starter-kit/widgets/LanguageMenu.js.map +1 -0
  54. package/dist/starter-kit/widgets/LanguageMenu.vue.d.ts +3 -0
  55. package/dist/starter-kit/widgets/LanguageMenu.vue.d.ts.map +1 -0
  56. package/dist/starter-kit/widgets/LanguageMenu.vue_vue_type_script_setup_true_lang.js +52 -0
  57. package/dist/starter-kit/widgets/LanguageMenu.vue_vue_type_script_setup_true_lang.js.map +1 -0
  58. package/dist/starter-kit/widgets/LanguageSwitcherTrigger.js +7 -0
  59. package/dist/starter-kit/widgets/LanguageSwitcherTrigger.js.map +1 -0
  60. package/dist/starter-kit/widgets/LanguageSwitcherTrigger.vue.d.ts +11 -0
  61. package/dist/starter-kit/widgets/LanguageSwitcherTrigger.vue.d.ts.map +1 -0
  62. package/dist/starter-kit/widgets/LanguageSwitcherTrigger.vue_vue_type_script_setup_true_lang.js +32 -0
  63. package/dist/starter-kit/widgets/LanguageSwitcherTrigger.vue_vue_type_script_setup_true_lang.js.map +1 -0
  64. package/dist/starter-kit/widgets/LoadedLanguageSwitcher.js +7 -0
  65. package/dist/starter-kit/widgets/LoadedLanguageSwitcher.js.map +1 -0
  66. package/dist/starter-kit/widgets/LoadedLanguageSwitcher.vue.d.ts +12 -0
  67. package/dist/starter-kit/widgets/LoadedLanguageSwitcher.vue.d.ts.map +1 -0
  68. package/dist/starter-kit/widgets/LoadedLanguageSwitcher.vue_vue_type_script_setup_true_lang.js +28 -0
  69. package/dist/starter-kit/widgets/LoadedLanguageSwitcher.vue_vue_type_script_setup_true_lang.js.map +1 -0
  70. package/dist/starter-kit/widgets/index.d.ts +26 -0
  71. package/dist/starter-kit/widgets/index.d.ts.map +1 -1
  72. package/dist/starter-kit/widgets/index.js +19 -18
  73. package/dist/starter-kit/widgets/index.js.map +1 -1
  74. package/dist/starter-kit/widgets/loaded.d.ts +1 -0
  75. package/dist/starter-kit/widgets/loaded.d.ts.map +1 -1
  76. package/dist/starter-kit/widgets/loaded.js +5 -4
  77. package/dist/starter-kit/widgets/use-widgets.d.ts +2 -1
  78. package/dist/starter-kit/widgets/use-widgets.d.ts.map +1 -1
  79. package/dist/starter-kit/widgets/use-widgets.js +15 -15
  80. package/dist/starter-kit/widgets/use-widgets.js.map +1 -1
  81. package/package.json +2 -2
  82. package/src/components/actions/ActionModal.vue +2 -0
  83. package/src/components/form/FormBlock.vue +15 -2
  84. package/src/components/panel/BottomNav.vue +2 -2
  85. package/src/components/panel/KeyboardShortcuts.vue +1 -1
  86. package/src/components/panel/NavGroup.vue +3 -3
  87. package/src/components/panel/NavItem.vue +5 -1
  88. package/src/components/panel/NavSubItem.vue +5 -1
  89. package/src/components/ui/TooltipTrigger.vue +4 -1
  90. package/src/layouts/TopNavLayout.vue +2 -2
  91. package/src/layouts/TopNavMenu.vue +1 -1
  92. package/src/standalone/AlfakitComponent.vue +8 -1
  93. package/src/starter-kit/AlfakitStarterKitRoot.vue +6 -0
  94. package/src/starter-kit/index.ts +1 -0
  95. package/src/starter-kit/widgets/LanguageMenu.vue +46 -0
  96. package/src/starter-kit/widgets/LanguageSwitcherTrigger.vue +34 -0
  97. package/src/starter-kit/widgets/LoadedLanguageSwitcher.vue +27 -0
  98. package/src/starter-kit/widgets/index.ts +24 -2
  99. package/src/starter-kit/widgets/loaded.ts +1 -0
  100. package/src/starter-kit/widgets/use-widgets.ts +10 -5
@@ -1 +1 @@
1
- {"version":3,"file":"FormBlock.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_withModifiers","_createElementVNode","_unref","_createVNode","SchemaRenderer","ActionList","_createCommentVNode","ActionList_default","SchemaRenderer_default","_hoisted_1","_hoisted_2","FormBlock_vue_vue_type_script_setup_true_lang_default","props","__props","panel","usePanel","page","usePageSchema","pageProps","useAlfakitProps","runner","useActionRunner","t","useT","token","computed","store","FormStore","notifications","showToast","n","router","resolvePartialProps","unregisterPageForm","name","pageFormName","registerPageForm","unregisterConflictForm","onMounted","registerConflictForm","onBeforeUnmount","unregisterSubmitter","registerFormSubmitter","trigger","action","ctx","watch","formIdentity","value","submittedBlock","refillPending","resyncPending","visitBlock","block","errors","state","useStore","context","submitting","actions","primary","progress","wizardProgressStore","showActions","formActionsVisible","submitVisit","offStart","visit","event","offSuccess","id","shouldResyncForm","pageFlash","offRefresh","refresh","formRefreshFor","applyFormRefresh","offFinish","offBefore","isLeavingVisit","onSubmit","onKeydown","isImplicitSubmit","openBlock","createElementBlock","withModifiers","createElementVNode","unref","createVNode","createCommentVNode"],"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 // A click that blurred a live field started a refresh: send the state it returns.\n store.whenSettled(() => 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":"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"}
1
+ {"version":3,"file":"FormBlock.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_withModifiers","_createElementVNode","_unref","_createVNode","SchemaRenderer","ActionList","_createCommentVNode","ActionList_default","SchemaRenderer_default","_hoisted_1","_hoisted_2","FormBlock_vue_vue_type_script_setup_true_lang_default","props","__props","panel","usePanel","page","usePageSchema","pageProps","useAlfakitProps","runner","useActionRunner","t","useT","token","computed","standalone","useStandalone","instanceId","useId","store","FormStore","formIdPrefix","notifications","showToast","n","router","resolvePartialProps","unregisterPageForm","name","pageFormName","registerPageForm","unregisterConflictForm","onMounted","registerConflictForm","onBeforeUnmount","unregisterSubmitter","registerFormSubmitter","trigger","action","ctx","watch","formIdentity","value","submittedBlock","refillPending","resyncPending","visitBlock","block","errors","state","useStore","context","submitting","actions","primary","progress","wizardProgressStore","showActions","formActionsVisible","submitVisit","offStart","visit","event","offSuccess","id","shouldResyncForm","pageFlash","offRefresh","refresh","formRefreshFor","applyFormRefresh","offFinish","offBefore","isLeavingVisit","onSubmit","onKeydown","isImplicitSubmit","openBlock","createElementBlock","withModifiers","createElementVNode","unref","createVNode","createCommentVNode"],"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 formIdPrefix,\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, useId, watch } from 'vue'\nimport { useStore } from '../../composables/use-store'\nimport {\n useActionRunner,\n useAlfakitProps,\n usePageSchema,\n usePanel,\n useStandalone,\n useT,\n} 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\n// Several standalone components can share a page (and field names): each form gets its own\n// field id prefix, so labels and errors point at their own inputs.\nconst standalone = useStandalone()\nconst instanceId = useId()\nconst store = new FormStore(props.block, {\n token: token.value,\n component: props.block.component,\n idPrefix: standalone ? formIdPrefix(`form-${instanceId}`) : undefined,\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 // A click that blurred a live field started a refresh: send the state it returns.\n store.whenSettled(() => 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":";;;;;;;;;;;;;;;;;;EAwCA,IAAMc,IAAQC,GAERC,IAAQC,EAAS,GACjBC,IAAOC,GAAc,GACrBC,IAAYC,EAAgB,GAC5BC,IAASC,EAAgB,GACzBC,IAAIC,GAAK,GACTC,IAAQC,QAAeT,EAAK,OAAO,SAAS,EAAE,GAI9CU,IAAaC,GAAc,GAC3BC,IAAaC,EAAM,GACnBC,IAAQ,IAAIC,EAAUnB,EAAM,OAAO;GACvC,OAAOY,EAAM;GACb,WAAWZ,EAAM,MAAM;GACvB,UAAUc,IAAaM,EAAa,QAAQJ,GAAY,IAAI,KAAA;GAC5D,YAAYd,EAAM,MAAM,UAAU;GAClC,YAAYA,EAAM,MAAM,UAAU;GAClC,aAAaA,EAAM,MAAM,UAAU;GAEnC,kBAAkB,MAAkBmB,EAAc,SAAS,MAAMC,GAAUC,CAAC,CAAC;GAE7E,mBAAmB;IACjB,AAAIvB,EAAM,MAAM,eAAawB,EAAO,OAAO,EAAE,MAAMC,GAAoB,CAAC,MAAM,CAAC,EAAE,CAAC;GACpF;EACF,CAAC;EAED,GAAYP,CAAK;EAIjB,IAAIQ;EAEJ,QAAgB;GACd,IAAMC,IAAOC,EAAa5B,EAAM,MAAM,SAAS;GAE/C,AAAI2B,MAAM,IAAqBE,GAAiBF,GAAMT,CAAK;EAC7D,CAAC;EAGD,IAAIY;EAMJ,AAJAC,QAAgB;GACd,AAAI/B,EAAM,MAAM,cAAc,WAAQ,IAAyBgC,EAAqBd,CAAK;EAC3F,CAAC,GAEDe,QAAsBH,IAAyB,CAAC;EAGhD,IAAII;EAsBJ,AApBAH,QAAgB;GACd,IAAsBI,GAAsBnC,EAAM,MAAM,YAAY,GAAQ,MAC1EoC,EAAQC,GAAQC,CAAG,CACrB;EACF,CAAC,GAEDL,QAAsB;GAEpB,AADAP,IAAqB,GACrBQ,IAAsB;EACxB,CAAC,GAMDK,QACQC,EAAapC,EAAK,OAAOJ,EAAM,KAAK,SACpCkB,EAAM,KAAKlB,EAAM,KAAK,CAC9B,GAEAuC,EAAM3B,IAAQ,MAAUM,EAAM,SAASuB,CAAK,CAAC;EAI7C,IAAIC,IAAyC,MACzCC,IAAgB,IAEhBC,IAAgB,IAEhBC,IAAqC;EAkBzC,AAhBAN,QACQvC,EAAM,QACX,MAAU;GAMT,AALI2C,MACF,IAAgB,IAChBzB,EAAM,KAAK4B,CAAK,IAGdF,MACF,IAAgB,IAEX1B,EAAM,WAASA,EAAM,KAAK4B,CAAK;EAExC,CACF,GAEAP,QACQjC,EAAU,MAAM,SACrB,MAAWY,EAAM,UAAW6B,KAAqC,CAAC,CAAC,GACpE,EAAE,WAAW,GAAK,CACpB;EAEA,IAAMC,IAAQC,EAAS/B,EAAM,KAAK,GAC5BgC,IAAUrC,SAA+B;GAAE,OAAOD,EAAM;GAAO,WAAW;EAAO,EAAE,GACrFuC,IAAa,IAEXC,IAAUvC,QACdb,EAAM,MAAM,QAAQ,KAAK,OAAY;GAAE,GAAGqC;GAAQ,UAAU;EAAM,EAAE,CACtE,GACMgB,IAAUxC,QAAeuC,EAAQ,MAAM,EAAE,GAGzCE,KAAWL,EAASM,GAAoBrC,CAAK,CAAC,GAC9CsC,IAAc3C,QAAe4C,EAAmBzD,EAAM,OAAOsD,GAAS,KAAK,CAAC,GAE5ElB,IAAU,OAAO,GAAsB,MAAuB;GAClE,IAAIC,EAAO,OAAO,CAACA,EAAO,WACxB,OAAO7B,EAAO,QAAQ6B,GAAQC,CAAG;GAOnC,AAJA,IAAa,IACb,IAAiBtC,EAAM,OACvBkB,EAAM,cAAc,EAAI,GAExBA,EAAM,kBAAkBV,EAAO,QAAQ6B,GAAQC,GAAKpB,EAAM,MAAM,MAAM,CAAC;EACzE,GAIIwC,IAA6B,MAE3BC,KAAWnC,EAAO,GAAG,UAAU,MAAU;GAC7C,IAAMoC,IAAQC,EAAM,OAAO;GAM3B,AAJIV,KAAc,CAACO,KAAeE,EAAM,WAAW,UACjD,IAAcA,EAAM,KAGlBA,EAAM,WAAW,UAAO,IAAa5D,EAAM;EACjD,CAAC,GAEK8D,KAAatC,EAAO,GAAG,YAAY,MAAU;GACjD,IAAMuC,IAAKL;GAGX,IAAI,CAACK,KAAMC,GAAiBC,EAAUJ,EAAM,OAAO,IAAI,GAAG3C,CAAK,GAAG;IAChE,AAAIlB,EAAM,UAAU6C,IAGlB,IAAgB,KAFhB3B,EAAM,KAAKlB,EAAM,KAAK;IAKxB;GACF;GAEA,AAAK+D,MAAOF,EAAM,OAAO,WAAWE,OAAQA,KAGxCE,EAAUJ,EAAM,OAAO,IAAI,CAAC,CAAC,eAAe,WAAW,aAEvD7D,EAAM,UAAU0C,IAGlB,IAAgB,KAFhBxB,EAAM,KAAKlB,EAAM,KAAK;EAI1B,CAAC,GAGKkE,KAAa1C,EAAO,GAAG,YAAY,MAAU;GACjD,IAAM2C,IAAUC,EAAeH,EAAUJ,EAAM,OAAO,IAAI,GAAG7D,EAAM,MAAM,SAAS;GAElF,AAAImE,KAASE,EAAiBnD,GAAOiD,CAAO;EAC9C,CAAC,GAEKG,KAAY9C,EAAO,GAAG,WAAW,MAAU;GAC/C,AAAIkC,KAAeG,EAAM,OAAO,MAAM,OAAOH,MAE7CxC,EAAM,cAAc,EAAK,GACzB,IAAa,IACb,IAAc;EAChB,CAAC,GAEKqD,KAAY/C,EAAO,GAAG,WAAW,MAAU;GAC/C,AAAKtB,EAAM,MAAM,wBAKfgB,EAAM,WACN,CAACiC,KACDqB,EAAeX,EAAM,OAAO,KAAK,KACjC,CAAC,OAAO,QAAQnD,EAAE,mBAAmB,CAAC,GAAG,yCAAyC,CAAC,KAEnFmD,EAAM,eAAe;EAEzB,CAAC;EAED,SAAqB;GAMnB,AALAF,GAAS,GACTG,GAAW,GACXI,GAAW,GACXI,GAAU,GACVC,GAAU,GACVrD,EAAM,QAAQ;EAChB,CAAC;EAED,IAAMuD,WAAiB;GACrB,AAAIpB,EAAQ,SAASG,EAAY,SAC/BpB,EAAaiB,EAAQ,OAAOH,EAAQ,KAAK;EAE7C,GAGMwB,MAAa,MAAyB;GAC1C,AACErB,EAAQ,SACRG,EAAY,SACZmB,EAAiBd,GAAOA,EAAM,aAAgC,MAE9DA,EAAM,eAAe,GACrBzB,EAAaiB,EAAQ,OAAOH,EAAQ,KAAK;EAE7C;oBAIEhE,EAAA,GAAAC,EAYO,QAAA;GAXL,aAAU;GACV,OAAM;GACL,UAAMC,EAAUqF,IAAQ,CAAA,SAAA,CAAA;GACf;EAEVpF,GAAAA,CAAAA,GAEW,YAAA;GAFA,UAAUC,EAAA0D,CAAA,CAAK,CAAC,cAAchD,EAAM,MAAM,cAAS;GAAa,OAAM;EAC/ET,GAAAA,CAAAA,EAA0EC,IAAA;GAAzD,YAAYF,EAAA0D,CAAA,CAAK,CAAC;GAAa,SAAS1D,EAAA0D,CAAA,CAAK,CAAC;EAEtD,GAAA,MAAA,GAAA,CAAA,cAAA,SAAA,CAAA,CAAA,GAAA,GAAAnD,CAAA,GAAAuD,EAAA,MAAQ,SAAM,KAAQI,EAAA,SAAjCtE,EAAA,GAAAC,EAEM,OAFNW,GAEM,CADJP,EAA0EE,IAAA;GAA7D,SAAS2D,EAAA;GAAU,SAASF,EAAA;GAAU,cAAYd"}
@@ -1 +1 @@
1
- {"version":3,"file":"BottomNav.js","names":["_sfc_main","BottomNav_vue_vue_type_script_setup_true_lang_default","BottomNav_default"],"sources":["../../../src/components/panel/BottomNav.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport NavLabel from './NavLabel.vue'\nimport {\n PREFETCH_CACHE_FOR,\n bottomNavigationItems,\n isNavigationItemActive,\n navigationItemUrl,\n type NavigationItemSchema,\n} from '@alfakit/core'\nimport { Link } from '@inertiajs/vue3'\nimport { MenuIcon } from '@lucide/vue'\nimport { computed, ref } from 'vue'\nimport { usePanel, useT } from '../../context'\nimport { Icon } from '../../lib/icons'\nimport Sheet from '../ui/Sheet.vue'\nimport SheetContent from '../ui/SheetContent.vue'\nimport SheetHeader from '../ui/SheetHeader.vue'\nimport SheetTitle from '../ui/SheetTitle.vue'\n\n/**\n * The mobile preset's bottom navigation bar (`Panel::mobile()`): the top-level items, with\n * the rest behind a \"More\" button that opens a sheet. Hidden from `md` up; replace it\n * everywhere with `createAlfakit({ components: { 'panel:bottom-nav': … } })`.\n */\nconst panel = usePanel()\nconst t = useT()\nconst open = ref(false)\nconst items = computed(() => bottomNavigationItems(panel.value.navigation))\nconst overflowActive = computed(() => items.value.overflow.some(isNavigationItemActive))\nconst overflowLinks = computed(() =>\n items.value.overflow.flatMap((item) => [item, ...(item.children ?? [])]),\n)\nconst url = (item: NavigationItemSchema): string => navigationItemUrl(item) ?? '#'\n</script>\n\n<template>\n <nav\n v-if=\"items.primary.length > 0 || items.overflow.length > 0\"\n data-slot=\"bottom-nav\"\n :aria-label=\"t('navigation', {}, 'Navigation')\"\n class=\"md:hidden\"\n >\n <template v-for=\"item in items.primary\" :key=\"item.label\">\n <a\n v-if=\"item.openInNewTab\"\n v-bind=\"item.extraAttributes ?? {}\"\n :href=\"url(item)\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n data-slot=\"bottom-nav-item\"\n class=\"min-w-0\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" />\n <NavLabel class=\"max-w-full truncate\" :text=\"item.label\" :html=\"item.labelHtml\" />\n </a>\n <Link\n v-else\n v-bind=\"item.extraAttributes ?? {}\"\n :href=\"url(item)\"\n prefetch\n :cache-for=\"PREFETCH_CACHE_FOR\"\n data-slot=\"bottom-nav-item\"\n :data-active=\"isNavigationItemActive(item) ? 'true' : undefined\"\n :aria-current=\"isNavigationItemActive(item) ? 'page' : undefined\"\n class=\"min-w-0\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" />\n <NavLabel class=\"max-w-full truncate\" :text=\"item.label\" :html=\"item.labelHtml\" />\n </Link>\n </template>\n <Sheet v-if=\"items.overflow.length > 0\" :open=\"open\" @update:open=\"open = $event\">\n <button\n type=\"button\"\n data-slot=\"bottom-nav-item\"\n :data-active=\"overflowActive ? 'true' : undefined\"\n aria-haspopup=\"dialog\"\n :aria-expanded=\"open\"\n class=\"min-w-0 bg-transparent\"\n @click=\"open = true\"\n >\n <Icon name=\"alfakit::panels.topbar.open-sidebar-button\" :fallback=\"MenuIcon\" />\n <span class=\"max-w-full truncate\">{{ t('more', {}, 'More') }}</span>\n </button>\n <SheetContent side=\"bottom\" class=\"max-h-[80dvh] overflow-y-auto rounded-t-xl p-0\">\n <SheetHeader class=\"border-b\">\n <SheetTitle>{{ t('more', {}, 'More') }}</SheetTitle>\n </SheetHeader>\n <nav\n :aria-label=\"t('navigation', {}, 'Navigation')\"\n class=\"flex flex-col gap-1 p-3 text-sm\"\n >\n <Link\n v-for=\"item in overflowLinks\"\n :key=\"item.label\"\n :href=\"url(item)\"\n :data-active=\"isNavigationItemActive(item) ? 'true' : undefined\"\n class=\"hover:bg-accent data-[active=true]:bg-accent flex min-h-11 items-center gap-3 rounded-md px-3 font-medium [&_svg]:size-4\"\n @click=\"open = false\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" />\n <NavLabel :text=\"item.label\" :html=\"item.labelHtml\" />\n </Link>\n </nav>\n </SheetContent>\n </Sheet>\n </nav>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"BottomNav.js","names":["_sfc_main","BottomNav_vue_vue_type_script_setup_true_lang_default","BottomNav_default"],"sources":["../../../src/components/panel/BottomNav.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport NavLabel from './NavLabel.vue'\nimport {\n PREFETCH_CACHE_FOR,\n bottomNavigationItems,\n isNavigationItemActive,\n navigationItemUrl,\n type NavigationItemSchema,\n} from '@alfakit/core'\nimport { Link } from '@inertiajs/vue3'\nimport { MenuIcon } from '@lucide/vue'\nimport { computed, ref } from 'vue'\nimport { usePanel, useT } from '../../context'\nimport { Icon } from '../../lib/icons'\nimport Sheet from '../ui/Sheet.vue'\nimport SheetContent from '../ui/SheetContent.vue'\nimport SheetHeader from '../ui/SheetHeader.vue'\nimport SheetTitle from '../ui/SheetTitle.vue'\n\n/**\n * The mobile preset's bottom navigation bar (`Panel::mobile()`): the top-level items, with\n * the rest behind a \"More\" button that opens a sheet. Hidden from `md` up; replace it\n * everywhere with `createAlfakit({ components: { 'panel:bottom-nav': … } })`.\n */\nconst panel = usePanel()\nconst t = useT()\nconst open = ref(false)\nconst items = computed(() => bottomNavigationItems(panel.value.navigation))\nconst overflowActive = computed(() => items.value.overflow.some(isNavigationItemActive))\nconst overflowLinks = computed(() =>\n items.value.overflow.flatMap((item) => [item, ...(item.children ?? [])]),\n)\nconst url = (item: NavigationItemSchema): string => navigationItemUrl(item) ?? '#'\n</script>\n\n<template>\n <nav\n v-if=\"items.primary.length > 0 || items.overflow.length > 0\"\n data-slot=\"bottom-nav\"\n :aria-label=\"t('navigation', {}, 'Navigation')\"\n class=\"md:hidden\"\n >\n <template v-for=\"item in items.primary\" :key=\"item.url ?? item.label\">\n <a\n v-if=\"item.openInNewTab\"\n v-bind=\"item.extraAttributes ?? {}\"\n :href=\"url(item)\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n data-slot=\"bottom-nav-item\"\n class=\"min-w-0\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" />\n <NavLabel class=\"max-w-full truncate\" :text=\"item.label\" :html=\"item.labelHtml\" />\n </a>\n <Link\n v-else\n v-bind=\"item.extraAttributes ?? {}\"\n :href=\"url(item)\"\n prefetch\n :cache-for=\"PREFETCH_CACHE_FOR\"\n data-slot=\"bottom-nav-item\"\n :data-active=\"isNavigationItemActive(item) ? 'true' : undefined\"\n :aria-current=\"isNavigationItemActive(item) ? 'page' : undefined\"\n class=\"min-w-0\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" />\n <NavLabel class=\"max-w-full truncate\" :text=\"item.label\" :html=\"item.labelHtml\" />\n </Link>\n </template>\n <Sheet v-if=\"items.overflow.length > 0\" :open=\"open\" @update:open=\"open = $event\">\n <button\n type=\"button\"\n data-slot=\"bottom-nav-item\"\n :data-active=\"overflowActive ? 'true' : undefined\"\n aria-haspopup=\"dialog\"\n :aria-expanded=\"open\"\n class=\"min-w-0 bg-transparent\"\n @click=\"open = true\"\n >\n <Icon name=\"alfakit::panels.topbar.open-sidebar-button\" :fallback=\"MenuIcon\" />\n <span class=\"max-w-full truncate\">{{ t('more', {}, 'More') }}</span>\n </button>\n <SheetContent side=\"bottom\" class=\"max-h-[80dvh] overflow-y-auto rounded-t-xl p-0\">\n <SheetHeader class=\"border-b\">\n <SheetTitle>{{ t('more', {}, 'More') }}</SheetTitle>\n </SheetHeader>\n <nav\n :aria-label=\"t('navigation', {}, 'Navigation')\"\n class=\"flex flex-col gap-1 p-3 text-sm\"\n >\n <Link\n v-for=\"item in overflowLinks\"\n :key=\"item.url ?? item.label\"\n :href=\"url(item)\"\n :data-active=\"isNavigationItemActive(item) ? 'true' : undefined\"\n class=\"hover:bg-accent data-[active=true]:bg-accent flex min-h-11 items-center gap-3 rounded-md px-3 font-medium [&_svg]:size-4\"\n @click=\"open = false\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" />\n <NavLabel :text=\"item.label\" :html=\"item.labelHtml\" />\n </Link>\n </nav>\n </SheetContent>\n </Sheet>\n </nav>\n</template>\n"],"mappings":""}
@@ -19,7 +19,7 @@ var A = ["aria-label"], j = ["href"], M = ["data-active", "aria-expanded"], N =
19
19
  "data-slot": "bottom-nav",
20
20
  "aria-label": D(I)("navigation", {}, "Navigation"),
21
21
  class: "md:hidden"
22
- }, [(C(!0), _(p, null, T(R.value.primary, (e) => (C(), _(p, { key: e.label }, [e.openInNewTab ? (C(), _("a", S({
22
+ }, [(C(!0), _(p, null, T(R.value.primary, (e) => (C(), _(p, { key: e.url ?? e.label }, [e.openInNewTab ? (C(), _("a", S({
23
23
  key: 0,
24
24
  ref_for: !0
25
25
  }, e.extraAttributes ?? {}, {
@@ -91,7 +91,7 @@ var A = ["aria-label"], j = ["href"], M = ["data-active", "aria-expanded"], N =
91
91
  "aria-label": D(I)("navigation", {}, "Navigation"),
92
92
  class: "flex flex-col gap-1 p-3 text-sm"
93
93
  }, [(C(!0), _(p, null, T(B.value, (e) => (C(), h(D(f), {
94
- key: e.label,
94
+ key: e.url ?? e.label,
95
95
  href: V(e),
96
96
  "data-active": D(u)(e) ? "true" : void 0,
97
97
  class: "hover:bg-accent data-[active=true]:bg-accent flex min-h-11 items-center gap-3 rounded-md px-3 font-medium [&_svg]:size-4",
@@ -1 +1 @@
1
- {"version":3,"file":"BottomNav.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_unref","_Fragment","_renderList","_mergeProps","_createBlock","Icon","_createCommentVNode","_createVNode","NavLabel","_withCtx","Sheet","_createElementVNode","_toDisplayString","SheetContent","SheetHeader","SheetTitle","_createTextVNode","Icon_default","Sheet_default","SheetContent_default","SheetHeader_default","SheetTitle_default","NavLabel_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","BottomNav_vue_vue_type_script_setup_true_lang_default","panel","usePanel","t","useT","open","ref","items","computed","bottomNavigationItems","overflowActive","isNavigationItemActive","overflowLinks","item","url","navigationItemUrl","openBlock","createElementBlock","unref","Fragment","renderList","mergeProps","createBlock","createCommentVNode","createVNode","Link","PREFETCH_CACHE_FOR","withCtx","_cache","$event","createElementVNode","MenuIcon","toDisplayString","createTextVNode"],"sources":["../../../src/components/panel/BottomNav.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport NavLabel from './NavLabel.vue'\nimport {\n PREFETCH_CACHE_FOR,\n bottomNavigationItems,\n isNavigationItemActive,\n navigationItemUrl,\n type NavigationItemSchema,\n} from '@alfakit/core'\nimport { Link } from '@inertiajs/vue3'\nimport { MenuIcon } from '@lucide/vue'\nimport { computed, ref } from 'vue'\nimport { usePanel, useT } from '../../context'\nimport { Icon } from '../../lib/icons'\nimport Sheet from '../ui/Sheet.vue'\nimport SheetContent from '../ui/SheetContent.vue'\nimport SheetHeader from '../ui/SheetHeader.vue'\nimport SheetTitle from '../ui/SheetTitle.vue'\n\n/**\n * The mobile preset's bottom navigation bar (`Panel::mobile()`): the top-level items, with\n * the rest behind a \"More\" button that opens a sheet. Hidden from `md` up; replace it\n * everywhere with `createAlfakit({ components: { 'panel:bottom-nav': … } })`.\n */\nconst panel = usePanel()\nconst t = useT()\nconst open = ref(false)\nconst items = computed(() => bottomNavigationItems(panel.value.navigation))\nconst overflowActive = computed(() => items.value.overflow.some(isNavigationItemActive))\nconst overflowLinks = computed(() =>\n items.value.overflow.flatMap((item) => [item, ...(item.children ?? [])]),\n)\nconst url = (item: NavigationItemSchema): string => navigationItemUrl(item) ?? '#'\n</script>\n\n<template>\n <nav\n v-if=\"items.primary.length > 0 || items.overflow.length > 0\"\n data-slot=\"bottom-nav\"\n :aria-label=\"t('navigation', {}, 'Navigation')\"\n class=\"md:hidden\"\n >\n <template v-for=\"item in items.primary\" :key=\"item.label\">\n <a\n v-if=\"item.openInNewTab\"\n v-bind=\"item.extraAttributes ?? {}\"\n :href=\"url(item)\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n data-slot=\"bottom-nav-item\"\n class=\"min-w-0\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" />\n <NavLabel class=\"max-w-full truncate\" :text=\"item.label\" :html=\"item.labelHtml\" />\n </a>\n <Link\n v-else\n v-bind=\"item.extraAttributes ?? {}\"\n :href=\"url(item)\"\n prefetch\n :cache-for=\"PREFETCH_CACHE_FOR\"\n data-slot=\"bottom-nav-item\"\n :data-active=\"isNavigationItemActive(item) ? 'true' : undefined\"\n :aria-current=\"isNavigationItemActive(item) ? 'page' : undefined\"\n class=\"min-w-0\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" />\n <NavLabel class=\"max-w-full truncate\" :text=\"item.label\" :html=\"item.labelHtml\" />\n </Link>\n </template>\n <Sheet v-if=\"items.overflow.length > 0\" :open=\"open\" @update:open=\"open = $event\">\n <button\n type=\"button\"\n data-slot=\"bottom-nav-item\"\n :data-active=\"overflowActive ? 'true' : undefined\"\n aria-haspopup=\"dialog\"\n :aria-expanded=\"open\"\n class=\"min-w-0 bg-transparent\"\n @click=\"open = true\"\n >\n <Icon name=\"alfakit::panels.topbar.open-sidebar-button\" :fallback=\"MenuIcon\" />\n <span class=\"max-w-full truncate\">{{ t('more', {}, 'More') }}</span>\n </button>\n <SheetContent side=\"bottom\" class=\"max-h-[80dvh] overflow-y-auto rounded-t-xl p-0\">\n <SheetHeader class=\"border-b\">\n <SheetTitle>{{ t('more', {}, 'More') }}</SheetTitle>\n </SheetHeader>\n <nav\n :aria-label=\"t('navigation', {}, 'Navigation')\"\n class=\"flex flex-col gap-1 p-3 text-sm\"\n >\n <Link\n v-for=\"item in overflowLinks\"\n :key=\"item.label\"\n :href=\"url(item)\"\n :data-active=\"isNavigationItemActive(item) ? 'true' : undefined\"\n class=\"hover:bg-accent data-[active=true]:bg-accent flex min-h-11 items-center gap-3 rounded-md px-3 font-medium [&_svg]:size-4\"\n @click=\"open = false\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" />\n <NavLabel :text=\"item.label\" :html=\"item.labelHtml\" />\n </Link>\n </nav>\n </SheetContent>\n </Sheet>\n </nav>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;EAwBA,IAAM+B,IAAQC,EAAS,GACjBC,IAAIC,EAAK,GACTC,IAAOC,EAAI,EAAK,GAChBC,IAAQC,QAAeC,EAAsBR,EAAM,MAAM,UAAU,CAAC,GACpES,IAAiBF,QAAeD,EAAM,MAAM,SAAS,KAAKI,CAAsB,CAAC,GACjFC,IAAgBJ,QACpBD,EAAM,MAAM,SAAS,SAAS,MAAS,CAACM,GAAM,GAAIA,EAAK,YAAY,CAAC,CAAE,CAAC,CACzE,GACMC,KAAO,MAAuCC,EAAkBF,CAAI,KAAK;mBAKrEN,EAAA,MAAM,QAAQ,SAAM,KAAQA,EAAA,MAAM,SAAS,SAAM,KADzDrC,EAAA,GAAAC,EAqEM,OAAA;;GAnEJ,aAAU;GACT,cAAYC,EAAA+B,CAAA,CAAC,CAAA,cAAA,CAAA,GAAA,YAAA;GACd,OAAM;EAENjC,GAAAA,EAAAA,EAAA,EAAA,GAAAC,EA2BWE,GAAA,MAAAC,EA3BciC,EAAA,MAAM,UAAd,OAA6BS,EAAA,GAAAC,EAAAE,GAAA,EAAA,KAAAN,EAAK,MAAA,GAAA,CAEzCA,EAAK,gBADb3C,EAAA,GAAAC,EAWI,KAXJI,EAWI;;;EATM,GAAAsC,EAAK,mBAAe,CAAA,GAAA;GAC3B,MAAMC,EAAID,CAAI;GACf,QAAO;GACP,KAAI;GACJ,aAAU;GACV,OAAM;EAEM,CAAA,GAAA,CAAAA,EAAK,QAAjB3C,EAAA,GAAAM,EAA2CJ,EAAAK,CAAA,GAAA;;GAAnB,MAAMoC,EAAK;EACnClC,GAAAA,MAAAA,GAAAA,CAAAA,MAAAA,CAAAA,KAAAA,EAAAA,IAAAA,EAAAA,GAAAA,EAAkFC,GAAA;GAAxE,OAAM;GAAuB,MAAMiC,EAAK;GAAQ,MAAMA,EAAK;EAEvE3C,GAAAA,MAAAA,GAAAA,CAAAA,QAAAA,MAAAA,CAAAA,CAAAA,GAAAA,IAAAA,CAAAA,MAAAA,EAAA,GAAAM,EAaOJ,EAAAqD,CAAA,GAbPlD,EAaO;;;EAXG,GAAAsC,EAAK,mBAAe,CAAA,GAAA;GAC3B,MAAMC,EAAID,CAAI;GACf,UAAA;GACC,aAAWzC,EAAAsD,CAAA;GACZ,aAAU;GACT,eAAatD,EAAAuC,CAAA,CAAsB,CAACE,CAAI,IAAA,SAAa,KAAA;GACrD,gBAAczC,EAAAuC,CAAA,CAAsB,CAACE,CAAI,IAAA,SAAa,KAAA;GACvD,OAAM;;GAEN,SAAAhC,QAA2C,CAA/BgC,EAAK,QAAjB3C,EAAA,GAAAM,EAA2CJ,EAAAK,CAAA,GAAA;;IAAnB,MAAMoC,EAAK;GACnClC,GAAAA,MAAAA,GAAAA,CAAAA,MAAAA,CAAAA,KAAAA,EAAAA,IAAAA,EAAAA,GAAAA,EAAkFC,GAAA;IAAxE,OAAM;IAAuB,MAAMiC,EAAK;IAAQ,MAAMA,EAAK;;;;;;;;YAG5D,GAAA,GAAA,IAAAN,EAAA,MAAM,SAAS,SAAM,KAAlCrC,EAAA,GAAAM,EAkCQM,GAAA;;GAlCiC,MAAMuB,EAAA;GAAO,iBAAW,AAAAuB,EAAA,QAAA,MAAE,EAAA,QAAOC;;GACxE,SAAAhD,QAWS,CAXTE,EAWS,UAAA;IAVP,MAAK;IACL,aAAU;IACT,eAAa2B,EAAA,QAAc,SAAY,KAAA;IACxC,iBAAc;IACb,iBAAeL,EAAA;IAChB,OAAM;IACL,SAAK,AAAAuB,EAAA,QAAA,MAAE,EAAA,QAAI;GAEZjD,GAAAA,CAAAA,EAA+EP,EAAAK,CAAA,GAAA;IAAzE,MAAK;IAA8C,UAAUL,EAAA2D,CAAA;GACnEhD,GAAAA,MAAAA,GAAAA,CAAAA,UAAAA,CAAAA,GAAAA,EAAoE,QAApEe,GAAoEd,EAA/BZ,EAAA+B,CAAA,CAAC,CAAA,QAAA,CAAA,GAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,GAAAN,CAAA,GAExClB,EAoBeM,GAAA;IApBD,MAAK;IAAS,OAAM;;IAChC,SAAAJ,QAEc,CAFdF,EAEcO,GAAA,EAFD,OAAM,WAAU,GAAA;KAC3B,SAAAL,QAAoD,CAApDF,EAAoDQ,GAAA,MAAA;MAAxC,SAAAN,QAA2B,CAAxBO,EAAAJ,EAAAZ,EAAA+B,CAAA,CAAC,CAAA,QAAA,CAAA,GAAA,MAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;;;IAElBpB,CAAAA,GAAAA,EAeM,OAAA;KAdH,cAAYX,EAAA+B,CAAA,CAAC,CAAA,cAAA,CAAA,GAAA,YAAA;KACd,OAAM;IAENjC,GAAAA,EAAAA,EAAA,EAAA,GAAAC,EAUOE,GAAA,MAAAC,EATUsC,EAAA,QAAR,OADT1C,EAAA,GAAAM,EAUOJ,EAAAqD,CAAA,GAAA;KARJ,KAAKZ,EAAK;KACV,MAAMC,EAAID,CAAI;KACd,eAAazC,EAAAuC,CAAA,CAAsB,CAACE,CAAI,IAAA,SAAa,KAAA;KACtD,OAAM;KACL,SAAK,AAAAe,EAAA,QAAA,MAAE,EAAA,QAAI;;KAEZ,SAAA/C,QAA2C,CAA/BgC,EAAK,QAAjB3C,EAAA,GAAAM,EAA2CJ,EAAAK,CAAA,GAAA;;MAAnB,MAAMoC,EAAK;KACnClC,GAAAA,MAAAA,GAAAA,CAAAA,MAAAA,CAAAA,KAAAA,EAAAA,IAAAA,EAAAA,GAAAA,EAAsDC,GAAA;MAA3C,MAAMiC,EAAK;MAAQ,MAAMA,EAAK"}
1
+ {"version":3,"file":"BottomNav.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_unref","_Fragment","_renderList","_mergeProps","_createBlock","Icon","_createCommentVNode","_createVNode","NavLabel","_withCtx","Sheet","_createElementVNode","_toDisplayString","SheetContent","SheetHeader","SheetTitle","_createTextVNode","Icon_default","Sheet_default","SheetContent_default","SheetHeader_default","SheetTitle_default","NavLabel_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","BottomNav_vue_vue_type_script_setup_true_lang_default","panel","usePanel","t","useT","open","ref","items","computed","bottomNavigationItems","overflowActive","isNavigationItemActive","overflowLinks","item","url","navigationItemUrl","openBlock","createElementBlock","unref","Fragment","renderList","mergeProps","createBlock","createCommentVNode","createVNode","Link","PREFETCH_CACHE_FOR","withCtx","_cache","$event","createElementVNode","MenuIcon","toDisplayString","createTextVNode"],"sources":["../../../src/components/panel/BottomNav.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport NavLabel from './NavLabel.vue'\nimport {\n PREFETCH_CACHE_FOR,\n bottomNavigationItems,\n isNavigationItemActive,\n navigationItemUrl,\n type NavigationItemSchema,\n} from '@alfakit/core'\nimport { Link } from '@inertiajs/vue3'\nimport { MenuIcon } from '@lucide/vue'\nimport { computed, ref } from 'vue'\nimport { usePanel, useT } from '../../context'\nimport { Icon } from '../../lib/icons'\nimport Sheet from '../ui/Sheet.vue'\nimport SheetContent from '../ui/SheetContent.vue'\nimport SheetHeader from '../ui/SheetHeader.vue'\nimport SheetTitle from '../ui/SheetTitle.vue'\n\n/**\n * The mobile preset's bottom navigation bar (`Panel::mobile()`): the top-level items, with\n * the rest behind a \"More\" button that opens a sheet. Hidden from `md` up; replace it\n * everywhere with `createAlfakit({ components: { 'panel:bottom-nav': … } })`.\n */\nconst panel = usePanel()\nconst t = useT()\nconst open = ref(false)\nconst items = computed(() => bottomNavigationItems(panel.value.navigation))\nconst overflowActive = computed(() => items.value.overflow.some(isNavigationItemActive))\nconst overflowLinks = computed(() =>\n items.value.overflow.flatMap((item) => [item, ...(item.children ?? [])]),\n)\nconst url = (item: NavigationItemSchema): string => navigationItemUrl(item) ?? '#'\n</script>\n\n<template>\n <nav\n v-if=\"items.primary.length > 0 || items.overflow.length > 0\"\n data-slot=\"bottom-nav\"\n :aria-label=\"t('navigation', {}, 'Navigation')\"\n class=\"md:hidden\"\n >\n <template v-for=\"item in items.primary\" :key=\"item.url ?? item.label\">\n <a\n v-if=\"item.openInNewTab\"\n v-bind=\"item.extraAttributes ?? {}\"\n :href=\"url(item)\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n data-slot=\"bottom-nav-item\"\n class=\"min-w-0\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" />\n <NavLabel class=\"max-w-full truncate\" :text=\"item.label\" :html=\"item.labelHtml\" />\n </a>\n <Link\n v-else\n v-bind=\"item.extraAttributes ?? {}\"\n :href=\"url(item)\"\n prefetch\n :cache-for=\"PREFETCH_CACHE_FOR\"\n data-slot=\"bottom-nav-item\"\n :data-active=\"isNavigationItemActive(item) ? 'true' : undefined\"\n :aria-current=\"isNavigationItemActive(item) ? 'page' : undefined\"\n class=\"min-w-0\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" />\n <NavLabel class=\"max-w-full truncate\" :text=\"item.label\" :html=\"item.labelHtml\" />\n </Link>\n </template>\n <Sheet v-if=\"items.overflow.length > 0\" :open=\"open\" @update:open=\"open = $event\">\n <button\n type=\"button\"\n data-slot=\"bottom-nav-item\"\n :data-active=\"overflowActive ? 'true' : undefined\"\n aria-haspopup=\"dialog\"\n :aria-expanded=\"open\"\n class=\"min-w-0 bg-transparent\"\n @click=\"open = true\"\n >\n <Icon name=\"alfakit::panels.topbar.open-sidebar-button\" :fallback=\"MenuIcon\" />\n <span class=\"max-w-full truncate\">{{ t('more', {}, 'More') }}</span>\n </button>\n <SheetContent side=\"bottom\" class=\"max-h-[80dvh] overflow-y-auto rounded-t-xl p-0\">\n <SheetHeader class=\"border-b\">\n <SheetTitle>{{ t('more', {}, 'More') }}</SheetTitle>\n </SheetHeader>\n <nav\n :aria-label=\"t('navigation', {}, 'Navigation')\"\n class=\"flex flex-col gap-1 p-3 text-sm\"\n >\n <Link\n v-for=\"item in overflowLinks\"\n :key=\"item.url ?? item.label\"\n :href=\"url(item)\"\n :data-active=\"isNavigationItemActive(item) ? 'true' : undefined\"\n class=\"hover:bg-accent data-[active=true]:bg-accent flex min-h-11 items-center gap-3 rounded-md px-3 font-medium [&_svg]:size-4\"\n @click=\"open = false\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" />\n <NavLabel :text=\"item.label\" :html=\"item.labelHtml\" />\n </Link>\n </nav>\n </SheetContent>\n </Sheet>\n </nav>\n</template>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"KeyboardShortcuts.js","names":["_sfc_main","KeyboardShortcuts_vue_vue_type_script_setup_true_lang_default","KeyboardShortcuts_default"],"sources":["../../../src/components/panel/KeyboardShortcuts.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { CommandSchema } from '@alfakit/core'\nimport {\n commandShortcutId,\n COMMANDS_COMPONENT,\n focusTableSearch,\n SHORTCUT_IDS,\n shortcuts,\n} from '@alfakit/core'\nimport { router } from '@inertiajs/vue3'\nimport { computed, ref, shallowRef, watch, type Component } from 'vue'\nimport { useActionRunner, usePageSchema, usePanel, useT } from '../../context'\nimport { shortcutsOverlay } from './lazy-chrome'\n\n/**\n * Keyboard shortcuts of the panel: `/` (focus the table search), `g d` (dashboard), `?`\n * (the overlay) and the panel commands' `shortcut()`, with the user's customised keys\n * (`alfakit.keyboardShortcuts`).\n */\nconst t = useT()\nconst panel = usePanel()\nconst page = usePageSchema()\nconst runner = useActionRunner()\nconst open = ref(false)\n// Null on the server and during hydration (nothing loads there), so the markup matches.\nconst Overlay = shallowRef<Component | null>(shortcutsOverlay.current)\n\n// `?` (or the palette's \"Keyboard shortcuts\") before the code has arrived keeps `open` set;\n// the overlay mounts open once it has loaded.\nwatch(open, (value, _old, onCleanup) => {\n if (!value) return\n\n // Already loaded (by another instance): mount it straight away.\n if (shortcutsOverlay.current) {\n Overlay.value = shortcutsOverlay.current\n\n return\n }\n\n let active = true\n onCleanup(() => {\n active = false\n })\n\n shortcutsOverlay.load().then(\n (component) => {\n if (active) Overlay.value = component\n },\n () => {\n if (active) open.value = false\n },\n )\n})\nconst config = computed(() => panel.value.keyboardShortcuts)\nconst overrides = computed(() => JSON.stringify(config.value ? (config.value.overrides ?? {}) : {}))\n\nwatch(\n [config, overrides],\n ([value, stored]) => {\n if (typeof window === 'undefined') return\n\n shortcuts.setEnabled(value !== false)\n shortcuts.setOverrides(JSON.parse(stored) as Record<string, string[]>)\n },\n { immediate: true },\n)\n\n// Keyed on what the registrations depend on, so reloads (a new panel object) don't churn.\nconst registrations = computed(() =>\n config.value\n ? JSON.stringify({\n token: page.value?.token ?? '',\n home: panel.value.url ?? null,\n commands: (panel.value.commandPalette?.commands ?? []).filter(\n (command) => command.keyBindings?.length && !command.disabled,\n ),\n })\n : '',\n)\n\nwatch(\n registrations,\n (value, _old, onCleanup) => {\n if (!value || typeof window === 'undefined') return\n\n const { token, home, commands } = JSON.parse(value) as {\n token: string\n home: string | null\n commands: CommandSchema[]\n }\n\n const disposers = [\n shortcuts.register({\n id: SHORTCUT_IDS.overlay,\n keys: ['?'],\n label: t('shortcuts.show_overlay', {}, 'Show keyboard shortcuts'),\n group: 'general',\n handler: () => {\n open.value = true\n },\n }),\n // Declined (`false`) on pages without a table search, so `/` keeps its default.\n shortcuts.register({\n id: SHORTCUT_IDS.search,\n keys: ['/'],\n label: t('shortcuts.focus_search', {}, 'Search the table'),\n group: 'general',\n handler: () => focusTableSearch(),\n }),\n ...(home\n ? [\n shortcuts.register({\n id: SHORTCUT_IDS.dashboard,\n keys: ['g d'],\n label: t('shortcuts.go_dashboard', {}, 'Go to the dashboard'),\n group: 'navigation',\n handler: () => router.visit(home),\n }),\n ]\n : []),\n ...commands.map((command) =>\n shortcuts.register({\n id: commandShortcutId(command.name),\n keys: command.keyBindings ?? [],\n label: command.label ?? command.name,\n group: command.url ? 'navigation' : 'commands',\n handler: () => void runner.trigger(command, { token, component: COMMANDS_COMPONENT }),\n }),\n ),\n ]\n\n onCleanup(() => disposers.forEach((dispose) => dispose()))\n },\n { immediate: true },\n)\n\nconst customizable = computed(() =>\n Boolean(config.value && config.value.customizable && panel.value.endpoints.shortcuts),\n)\n</script>\n\n<template>\n <component\n :is=\"Overlay\"\n v-if=\"config && Overlay\"\n :open=\"open\"\n :customizable=\"customizable\"\n :endpoint=\"panel.endpoints.shortcuts\"\n @update:open=\"open = $event\"\n />\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"KeyboardShortcuts.js","names":["_sfc_main","KeyboardShortcuts_vue_vue_type_script_setup_true_lang_default","KeyboardShortcuts_default"],"sources":["../../../src/components/panel/KeyboardShortcuts.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { CommandSchema } from '@alfakit/core'\nimport {\n commandShortcutId,\n COMMANDS_COMPONENT,\n focusTableSearch,\n SHORTCUT_IDS,\n shortcuts,\n} from '@alfakit/core'\nimport { router } from '@inertiajs/vue3'\nimport { computed, ref, shallowRef, watch, type Component } from 'vue'\nimport { useActionRunner, usePageSchema, usePanel, useT } from '../../context'\nimport { shortcutsOverlay } from './lazy-chrome'\n\n/**\n * Keyboard shortcuts of the panel: `/` (focus the table search), `g d` (dashboard), `?`\n * (the overlay) and the panel commands' `shortcut()`, with the user's customised keys\n * (`alfakit.keyboardShortcuts`).\n */\nconst t = useT()\nconst panel = usePanel()\nconst page = usePageSchema()\nconst runner = useActionRunner()\nconst open = ref(false)\n// Null on the server and during hydration (nothing loads there), so the markup matches.\nconst Overlay = shallowRef<Component | null>(shortcutsOverlay.current)\n\n// `?` (or the palette's \"Keyboard shortcuts\") before the code has arrived keeps `open` set;\n// the overlay mounts open once it has loaded.\nwatch(open, (value, _old, onCleanup) => {\n if (!value) return\n\n // Already loaded (by another instance): mount it straight away.\n if (shortcutsOverlay.current) {\n Overlay.value = shortcutsOverlay.current\n\n return\n }\n\n let active = true\n onCleanup(() => {\n active = false\n })\n\n shortcutsOverlay.load().then(\n (component) => {\n if (active) Overlay.value = component\n },\n () => {\n if (active) open.value = false\n },\n )\n})\nconst config = computed(() => panel.value.keyboardShortcuts)\nconst overrides = computed(() => JSON.stringify(config.value ? (config.value.overrides ?? {}) : {}))\n\nwatch(\n [config, overrides],\n ([value, stored]) => {\n if (typeof window === 'undefined') return\n\n shortcuts.setEnabled(value !== false)\n shortcuts.setOverrides(JSON.parse(stored) as Record<string, string[]>)\n },\n { immediate: true },\n)\n\n// Keyed on what the registrations depend on, so reloads (a new panel object) don't churn.\nconst registrations = computed(() =>\n config.value\n ? JSON.stringify({\n token: page.value?.token ?? '',\n home: panel.value.dashboardUrl ?? panel.value.url ?? null,\n commands: (panel.value.commandPalette?.commands ?? []).filter(\n (command) => command.keyBindings?.length && !command.disabled,\n ),\n })\n : '',\n)\n\nwatch(\n registrations,\n (value, _old, onCleanup) => {\n if (!value || typeof window === 'undefined') return\n\n const { token, home, commands } = JSON.parse(value) as {\n token: string\n home: string | null\n commands: CommandSchema[]\n }\n\n const disposers = [\n shortcuts.register({\n id: SHORTCUT_IDS.overlay,\n keys: ['?'],\n label: t('shortcuts.show_overlay', {}, 'Show keyboard shortcuts'),\n group: 'general',\n handler: () => {\n open.value = true\n },\n }),\n // Declined (`false`) on pages without a table search, so `/` keeps its default.\n shortcuts.register({\n id: SHORTCUT_IDS.search,\n keys: ['/'],\n label: t('shortcuts.focus_search', {}, 'Search the table'),\n group: 'general',\n handler: () => focusTableSearch(),\n }),\n ...(home\n ? [\n shortcuts.register({\n id: SHORTCUT_IDS.dashboard,\n keys: ['g d'],\n label: t('shortcuts.go_dashboard', {}, 'Go to the dashboard'),\n group: 'navigation',\n handler: () => router.visit(home),\n }),\n ]\n : []),\n ...commands.map((command) =>\n shortcuts.register({\n id: commandShortcutId(command.name),\n keys: command.keyBindings ?? [],\n label: command.label ?? command.name,\n group: command.url ? 'navigation' : 'commands',\n handler: () => void runner.trigger(command, { token, component: COMMANDS_COMPONENT }),\n }),\n ),\n ]\n\n onCleanup(() => disposers.forEach((dispose) => dispose()))\n },\n { immediate: true },\n)\n\nconst customizable = computed(() =>\n Boolean(config.value && config.value.customizable && panel.value.endpoints.shortcuts),\n)\n</script>\n\n<template>\n <component\n :is=\"Overlay\"\n v-if=\"config && Overlay\"\n :open=\"open\"\n :customizable=\"customizable\"\n :endpoint=\"panel.endpoints.shortcuts\"\n @update:open=\"open = $event\"\n />\n</template>\n"],"mappings":""}
@@ -29,7 +29,7 @@ var x = /*@__PURE__*/ m({
29
29
  }, { immediate: !0 });
30
30
  let k = d(() => D.value ? JSON.stringify({
31
31
  token: C.value?.token ?? "",
32
- home: S.value.url ?? null,
32
+ home: S.value.dashboardUrl ?? S.value.url ?? null,
33
33
  commands: (S.value.commandPalette?.commands ?? []).filter((e) => e.keyBindings?.length && !e.disabled)
34
34
  }) : "");
35
35
  b(k, (e, t, n) => {
@@ -1 +1 @@
1
- {"version":3,"file":"KeyboardShortcuts.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_resolveDynamicComponent","_unref","_createCommentVNode","KeyboardShortcuts_vue_vue_type_script_setup_true_lang_default","t","useT","panel","usePanel","page","usePageSchema","runner","useActionRunner","open","ref","Overlay","shallowRef","shortcutsOverlay","value","active","onCleanup","component","config","computed","overrides","stored","shortcuts","registrations","command","disposers","SHORTCUT_IDS","focusTableSearch","home","router","commands","commandShortcutId","COMMANDS_COMPONENT","dispose","customizable","openBlock","createBlock","resolveDynamicComponent","unref","_cache","$event","createCommentVNode"],"sources":["../../../src/components/panel/KeyboardShortcuts.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { CommandSchema } from '@alfakit/core'\nimport {\n commandShortcutId,\n COMMANDS_COMPONENT,\n focusTableSearch,\n SHORTCUT_IDS,\n shortcuts,\n} from '@alfakit/core'\nimport { router } from '@inertiajs/vue3'\nimport { computed, ref, shallowRef, watch, type Component } from 'vue'\nimport { useActionRunner, usePageSchema, usePanel, useT } from '../../context'\nimport { shortcutsOverlay } from './lazy-chrome'\n\n/**\n * Keyboard shortcuts of the panel: `/` (focus the table search), `g d` (dashboard), `?`\n * (the overlay) and the panel commands' `shortcut()`, with the user's customised keys\n * (`alfakit.keyboardShortcuts`).\n */\nconst t = useT()\nconst panel = usePanel()\nconst page = usePageSchema()\nconst runner = useActionRunner()\nconst open = ref(false)\n// Null on the server and during hydration (nothing loads there), so the markup matches.\nconst Overlay = shallowRef<Component | null>(shortcutsOverlay.current)\n\n// `?` (or the palette's \"Keyboard shortcuts\") before the code has arrived keeps `open` set;\n// the overlay mounts open once it has loaded.\nwatch(open, (value, _old, onCleanup) => {\n if (!value) return\n\n // Already loaded (by another instance): mount it straight away.\n if (shortcutsOverlay.current) {\n Overlay.value = shortcutsOverlay.current\n\n return\n }\n\n let active = true\n onCleanup(() => {\n active = false\n })\n\n shortcutsOverlay.load().then(\n (component) => {\n if (active) Overlay.value = component\n },\n () => {\n if (active) open.value = false\n },\n )\n})\nconst config = computed(() => panel.value.keyboardShortcuts)\nconst overrides = computed(() => JSON.stringify(config.value ? (config.value.overrides ?? {}) : {}))\n\nwatch(\n [config, overrides],\n ([value, stored]) => {\n if (typeof window === 'undefined') return\n\n shortcuts.setEnabled(value !== false)\n shortcuts.setOverrides(JSON.parse(stored) as Record<string, string[]>)\n },\n { immediate: true },\n)\n\n// Keyed on what the registrations depend on, so reloads (a new panel object) don't churn.\nconst registrations = computed(() =>\n config.value\n ? JSON.stringify({\n token: page.value?.token ?? '',\n home: panel.value.url ?? null,\n commands: (panel.value.commandPalette?.commands ?? []).filter(\n (command) => command.keyBindings?.length && !command.disabled,\n ),\n })\n : '',\n)\n\nwatch(\n registrations,\n (value, _old, onCleanup) => {\n if (!value || typeof window === 'undefined') return\n\n const { token, home, commands } = JSON.parse(value) as {\n token: string\n home: string | null\n commands: CommandSchema[]\n }\n\n const disposers = [\n shortcuts.register({\n id: SHORTCUT_IDS.overlay,\n keys: ['?'],\n label: t('shortcuts.show_overlay', {}, 'Show keyboard shortcuts'),\n group: 'general',\n handler: () => {\n open.value = true\n },\n }),\n // Declined (`false`) on pages without a table search, so `/` keeps its default.\n shortcuts.register({\n id: SHORTCUT_IDS.search,\n keys: ['/'],\n label: t('shortcuts.focus_search', {}, 'Search the table'),\n group: 'general',\n handler: () => focusTableSearch(),\n }),\n ...(home\n ? [\n shortcuts.register({\n id: SHORTCUT_IDS.dashboard,\n keys: ['g d'],\n label: t('shortcuts.go_dashboard', {}, 'Go to the dashboard'),\n group: 'navigation',\n handler: () => router.visit(home),\n }),\n ]\n : []),\n ...commands.map((command) =>\n shortcuts.register({\n id: commandShortcutId(command.name),\n keys: command.keyBindings ?? [],\n label: command.label ?? command.name,\n group: command.url ? 'navigation' : 'commands',\n handler: () => void runner.trigger(command, { token, component: COMMANDS_COMPONENT }),\n }),\n ),\n ]\n\n onCleanup(() => disposers.forEach((dispose) => dispose()))\n },\n { immediate: true },\n)\n\nconst customizable = computed(() =>\n Boolean(config.value && config.value.customizable && panel.value.endpoints.shortcuts),\n)\n</script>\n\n<template>\n <component\n :is=\"Overlay\"\n v-if=\"config && Overlay\"\n :open=\"open\"\n :customizable=\"customizable\"\n :endpoint=\"panel.endpoints.shortcuts\"\n @update:open=\"open = $event\"\n />\n</template>\n"],"mappings":";;;;;;;;;EAmBA,IAAMM,IAAIC,EAAK,GACTC,IAAQC,EAAS,GACjBC,IAAOC,EAAc,GACrBC,IAASC,EAAgB,GACzBC,IAAOC,EAAI,EAAK,GAEhBC,IAAUC,EAA6BC,EAAiB,OAAO;EAIrE,EAAMJ,IAAO,GAAO,GAAM,MAAc;GACtC,IAAI,CAACK,GAAO;GAGZ,IAAID,EAAiB,SAAS;IAC5B,EAAQ,QAAQA,EAAiB;IAEjC;GACF;GAEA,IAAIE,IAAS;GAKb,AAJAC,QAAgB;IACd,IAAS;GACX,CAAC,GAEDH,EAAiB,KAAK,CAAC,CAAC,MACrB,MAAc;IACb,AAAIE,MAAQ,EAAQ,QAAQE;GAC9B,SACM;IACJ,AAAIF,MAAQ,EAAK,QAAQ;GAC3B,CACF;EACF,CAAC;EACD,IAAMG,IAASC,QAAehB,EAAM,MAAM,iBAAiB,GACrDiB,IAAYD,QAAe,KAAK,UAAUD,EAAO,QAASA,EAAO,MAAM,aAAa,CAAC,IAAK,CAAC,CAAC,CAAC;EAEnG,EACE,CAACA,GAAQE,CAAS,IACjB,CAACN,GAAOO,OAAY;GACnB,AAAI,OAAO,SAAW,QAEtBC,EAAU,WAAWR,MAAU,EAAK,GACpCQ,EAAU,aAAa,KAAK,MAAMD,CAAM,CAA6B;EACvE,GACA,EAAE,WAAW,GAAK,CACpB;EAGA,IAAME,IAAgBJ,QACpBD,EAAO,QACH,KAAK,UAAU;GACb,OAAOb,EAAK,OAAO,SAAS;GAC5B,MAAMF,EAAM,MAAM,OAAO;GACzB,WAAWA,EAAM,MAAM,gBAAgB,YAAY,CAAC,EAAA,CAAG,QACpD,MAAYqB,EAAQ,aAAa,UAAU,CAACA,EAAQ,QACvD;EACF,CAAC,IACD,EACN;EAEA,EACED,IACC,GAAO,GAAM,MAAc;GAC1B,IAAI,CAACT,KAAS,OAAO,SAAW,KAAa;GAE7C,IAAM,EAAE,UAAO,SAAM,gBAAa,KAAK,MAAMA,CAAK,GAM5CW,IAAY;IAChBH,EAAU,SAAS;KACjB,IAAII,EAAa;KACjB,MAAM,CAAC,GAAG;KACV,OAAOzB,EAAE,0BAA0B,CAAC,GAAG,yBAAyB;KAChE,OAAO;KACP,eAAe;MACb,EAAK,QAAQ;KACf;IACF,CAAC;IAEDqB,EAAU,SAAS;KACjB,IAAII,EAAa;KACjB,MAAM,CAAC,GAAG;KACV,OAAOzB,EAAE,0BAA0B,CAAC,GAAG,kBAAkB;KACzD,OAAO;KACP,eAAe0B,EAAiB;IAClC,CAAC;IACD,GAAIC,IACA,CACEN,EAAU,SAAS;KACjB,IAAII,EAAa;KACjB,MAAM,CAAC,KAAK;KACZ,OAAOzB,EAAE,0BAA0B,CAAC,GAAG,qBAAqB;KAC5D,OAAO;KACP,eAAe4B,EAAO,MAAMD,CAAI;IAClC,CAAC,CACH,IACA,CAAC;IACL,GAAGE,EAAS,KAAK,MACfR,EAAU,SAAS;KACjB,IAAIS,EAAkBP,EAAQ,IAAI;KAClC,MAAMA,EAAQ,eAAe,CAAC;KAC9B,OAAOA,EAAQ,SAASA,EAAQ;KAChC,OAAOA,EAAQ,MAAM,eAAe;KACpC,eAAe,KAAKjB,EAAO,QAAQiB,GAAS;MAAE;MAAO,WAAWQ;KAAmB,CAAC;IACtF,CAAC,CACH;GACF;GAEA,QAAgBP,EAAU,SAAS,MAAYQ,EAAQ,CAAC,CAAC;EAC3D,GACA,EAAE,WAAW,GAAK,CACpB;EAEA,IAAMC,IAAef,QACnB,GAAQD,EAAO,SAASA,EAAO,MAAM,gBAAgBf,EAAM,MAAM,UAAU,UAC7E;mBAMUe,EAAA,SAAUP,EAAA,SAFlBhB,EAAA,GAAAC,EAOEC,EANKc,EAAA,KAAO,GAAA;;GAEX,MAAMF,EAAA;GACN,cAAcyB,EAAA;GACd,UAAUpC,EAAAK,CAAA,CAAK,CAAC,UAAU;GAC1B,iBAAW,AAAAoC,EAAA,QAAA,MAAE,EAAA,QAAOC"}
1
+ {"version":3,"file":"KeyboardShortcuts.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_resolveDynamicComponent","_unref","_createCommentVNode","KeyboardShortcuts_vue_vue_type_script_setup_true_lang_default","t","useT","panel","usePanel","page","usePageSchema","runner","useActionRunner","open","ref","Overlay","shallowRef","shortcutsOverlay","value","active","onCleanup","component","config","computed","overrides","stored","shortcuts","registrations","command","disposers","SHORTCUT_IDS","focusTableSearch","home","router","commands","commandShortcutId","COMMANDS_COMPONENT","dispose","customizable","openBlock","createBlock","resolveDynamicComponent","unref","_cache","$event","createCommentVNode"],"sources":["../../../src/components/panel/KeyboardShortcuts.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { CommandSchema } from '@alfakit/core'\nimport {\n commandShortcutId,\n COMMANDS_COMPONENT,\n focusTableSearch,\n SHORTCUT_IDS,\n shortcuts,\n} from '@alfakit/core'\nimport { router } from '@inertiajs/vue3'\nimport { computed, ref, shallowRef, watch, type Component } from 'vue'\nimport { useActionRunner, usePageSchema, usePanel, useT } from '../../context'\nimport { shortcutsOverlay } from './lazy-chrome'\n\n/**\n * Keyboard shortcuts of the panel: `/` (focus the table search), `g d` (dashboard), `?`\n * (the overlay) and the panel commands' `shortcut()`, with the user's customised keys\n * (`alfakit.keyboardShortcuts`).\n */\nconst t = useT()\nconst panel = usePanel()\nconst page = usePageSchema()\nconst runner = useActionRunner()\nconst open = ref(false)\n// Null on the server and during hydration (nothing loads there), so the markup matches.\nconst Overlay = shallowRef<Component | null>(shortcutsOverlay.current)\n\n// `?` (or the palette's \"Keyboard shortcuts\") before the code has arrived keeps `open` set;\n// the overlay mounts open once it has loaded.\nwatch(open, (value, _old, onCleanup) => {\n if (!value) return\n\n // Already loaded (by another instance): mount it straight away.\n if (shortcutsOverlay.current) {\n Overlay.value = shortcutsOverlay.current\n\n return\n }\n\n let active = true\n onCleanup(() => {\n active = false\n })\n\n shortcutsOverlay.load().then(\n (component) => {\n if (active) Overlay.value = component\n },\n () => {\n if (active) open.value = false\n },\n )\n})\nconst config = computed(() => panel.value.keyboardShortcuts)\nconst overrides = computed(() => JSON.stringify(config.value ? (config.value.overrides ?? {}) : {}))\n\nwatch(\n [config, overrides],\n ([value, stored]) => {\n if (typeof window === 'undefined') return\n\n shortcuts.setEnabled(value !== false)\n shortcuts.setOverrides(JSON.parse(stored) as Record<string, string[]>)\n },\n { immediate: true },\n)\n\n// Keyed on what the registrations depend on, so reloads (a new panel object) don't churn.\nconst registrations = computed(() =>\n config.value\n ? JSON.stringify({\n token: page.value?.token ?? '',\n home: panel.value.dashboardUrl ?? panel.value.url ?? null,\n commands: (panel.value.commandPalette?.commands ?? []).filter(\n (command) => command.keyBindings?.length && !command.disabled,\n ),\n })\n : '',\n)\n\nwatch(\n registrations,\n (value, _old, onCleanup) => {\n if (!value || typeof window === 'undefined') return\n\n const { token, home, commands } = JSON.parse(value) as {\n token: string\n home: string | null\n commands: CommandSchema[]\n }\n\n const disposers = [\n shortcuts.register({\n id: SHORTCUT_IDS.overlay,\n keys: ['?'],\n label: t('shortcuts.show_overlay', {}, 'Show keyboard shortcuts'),\n group: 'general',\n handler: () => {\n open.value = true\n },\n }),\n // Declined (`false`) on pages without a table search, so `/` keeps its default.\n shortcuts.register({\n id: SHORTCUT_IDS.search,\n keys: ['/'],\n label: t('shortcuts.focus_search', {}, 'Search the table'),\n group: 'general',\n handler: () => focusTableSearch(),\n }),\n ...(home\n ? [\n shortcuts.register({\n id: SHORTCUT_IDS.dashboard,\n keys: ['g d'],\n label: t('shortcuts.go_dashboard', {}, 'Go to the dashboard'),\n group: 'navigation',\n handler: () => router.visit(home),\n }),\n ]\n : []),\n ...commands.map((command) =>\n shortcuts.register({\n id: commandShortcutId(command.name),\n keys: command.keyBindings ?? [],\n label: command.label ?? command.name,\n group: command.url ? 'navigation' : 'commands',\n handler: () => void runner.trigger(command, { token, component: COMMANDS_COMPONENT }),\n }),\n ),\n ]\n\n onCleanup(() => disposers.forEach((dispose) => dispose()))\n },\n { immediate: true },\n)\n\nconst customizable = computed(() =>\n Boolean(config.value && config.value.customizable && panel.value.endpoints.shortcuts),\n)\n</script>\n\n<template>\n <component\n :is=\"Overlay\"\n v-if=\"config && Overlay\"\n :open=\"open\"\n :customizable=\"customizable\"\n :endpoint=\"panel.endpoints.shortcuts\"\n @update:open=\"open = $event\"\n />\n</template>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"NavGroup.js","names":["_sfc_main","NavGroup_vue_vue_type_script_setup_true_lang_default","NavGroup_default"],"sources":["../../../src/components/panel/NavGroup.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { NavigationGroupSchema } from '@alfakit/core'\nimport { ChevronRightIcon } from '@lucide/vue'\nimport { Icon } from '../../lib/icons'\nimport Collapsible from '../ui/Collapsible.vue'\nimport CollapsibleContent from '../ui/CollapsibleContent.vue'\nimport CollapsibleTrigger from '../ui/CollapsibleTrigger.vue'\nimport SidebarGroup from '../ui/SidebarGroup.vue'\nimport SidebarGroupContent from '../ui/SidebarGroupContent.vue'\nimport SidebarGroupLabel from '../ui/SidebarGroupLabel.vue'\nimport SidebarMenu from '../ui/SidebarMenu.vue'\nimport { cn } from '../../lib/utils'\nimport NavGroupFlyout from './NavGroupFlyout.vue'\nimport NavItem from './NavItem.vue'\n\nconst props = defineProps<{ group: NavigationGroupSchema }>()\n// `NavigationGroup::extraSidebarAttributes()`; Vue merges `class` with the group's own.\nconst attributes = () => props.group.extraSidebarAttributes ?? {}\n// A labelled group with an icon collapses into a flyout in the icon-only sidebar.\nconst flyout = () => Boolean(props.group.label && props.group.icon)\nconst contentClass = () => cn(flyout() && 'group-data-[collapsible=icon]:hidden')\n</script>\n\n<template>\n <SidebarGroup v-if=\"!props.group.label\" v-bind=\"attributes()\">\n <SidebarGroupContent>\n <SidebarMenu>\n <NavItem v-for=\"item in props.group.items\" :key=\"item.label\" :item=\"item\" />\n </SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n <SidebarGroup v-else-if=\"!props.group.collapsible\" v-bind=\"attributes()\">\n <SidebarGroupLabel>\n <Icon v-if=\"props.group.icon\" :name=\"props.group.icon\" class=\"me-1.5\" />\n {{ props.group.label }}\n </SidebarGroupLabel>\n <SidebarGroupContent :class=\"contentClass()\">\n <SidebarMenu>\n <NavItem v-for=\"item in props.group.items\" :key=\"item.label\" :item=\"item\" />\n </SidebarMenu>\n </SidebarGroupContent>\n <NavGroupFlyout v-if=\"flyout()\" :group=\"props.group\" />\n </SidebarGroup>\n <Collapsible\n v-else\n :default-open=\"!props.group.collapsed || props.group.items.some((item) => item.active)\"\n class=\"group/nav-group\"\n >\n <SidebarGroup v-bind=\"attributes()\">\n <CollapsibleTrigger as-child>\n <SidebarGroupLabel\n as=\"button\"\n type=\"button\"\n class=\"hover:bg-sidebar-accent w-full cursor-pointer justify-between\"\n >\n <span class=\"flex items-center gap-1.5\">\n <Icon v-if=\"props.group.icon\" :name=\"props.group.icon\" />\n {{ props.group.label }}\n </span>\n <Icon\n name=\"alfakit::panels.sidebar.group.collapse-button\"\n :fallback=\"ChevronRightIcon\"\n class=\"size-3.5 transition-transform group-data-[state=open]/nav-group:rotate-90 rtl:rotate-180 rtl:group-data-[state=open]/nav-group:rotate-90\"\n />\n </SidebarGroupLabel>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <SidebarGroupContent :class=\"contentClass()\">\n <SidebarMenu>\n <NavItem v-for=\"item in props.group.items\" :key=\"item.label\" :item=\"item\" />\n </SidebarMenu>\n </SidebarGroupContent>\n </CollapsibleContent>\n <NavGroupFlyout v-if=\"flyout()\" :group=\"props.group\" />\n </SidebarGroup>\n </Collapsible>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"NavGroup.js","names":["_sfc_main","NavGroup_vue_vue_type_script_setup_true_lang_default","NavGroup_default"],"sources":["../../../src/components/panel/NavGroup.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { NavigationGroupSchema } from '@alfakit/core'\nimport { ChevronRightIcon } from '@lucide/vue'\nimport { Icon } from '../../lib/icons'\nimport Collapsible from '../ui/Collapsible.vue'\nimport CollapsibleContent from '../ui/CollapsibleContent.vue'\nimport CollapsibleTrigger from '../ui/CollapsibleTrigger.vue'\nimport SidebarGroup from '../ui/SidebarGroup.vue'\nimport SidebarGroupContent from '../ui/SidebarGroupContent.vue'\nimport SidebarGroupLabel from '../ui/SidebarGroupLabel.vue'\nimport SidebarMenu from '../ui/SidebarMenu.vue'\nimport { cn } from '../../lib/utils'\nimport NavGroupFlyout from './NavGroupFlyout.vue'\nimport NavItem from './NavItem.vue'\n\nconst props = defineProps<{ group: NavigationGroupSchema }>()\n// `NavigationGroup::extraSidebarAttributes()`; Vue merges `class` with the group's own.\nconst attributes = () => props.group.extraSidebarAttributes ?? {}\n// A labelled group with an icon collapses into a flyout in the icon-only sidebar.\nconst flyout = () => Boolean(props.group.label && props.group.icon)\nconst contentClass = () => cn(flyout() && 'group-data-[collapsible=icon]:hidden')\n</script>\n\n<template>\n <SidebarGroup v-if=\"!props.group.label\" v-bind=\"attributes()\">\n <SidebarGroupContent>\n <SidebarMenu>\n <NavItem v-for=\"item in props.group.items\" :key=\"item.url ?? item.label\" :item=\"item\" />\n </SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n <SidebarGroup v-else-if=\"!props.group.collapsible\" v-bind=\"attributes()\">\n <SidebarGroupLabel>\n <Icon v-if=\"props.group.icon\" :name=\"props.group.icon\" class=\"me-1.5\" />\n {{ props.group.label }}\n </SidebarGroupLabel>\n <SidebarGroupContent :class=\"contentClass()\">\n <SidebarMenu>\n <NavItem v-for=\"item in props.group.items\" :key=\"item.url ?? item.label\" :item=\"item\" />\n </SidebarMenu>\n </SidebarGroupContent>\n <NavGroupFlyout v-if=\"flyout()\" :group=\"props.group\" />\n </SidebarGroup>\n <Collapsible\n v-else\n :default-open=\"!props.group.collapsed || props.group.items.some((item) => item.active)\"\n class=\"group/nav-group\"\n >\n <SidebarGroup v-bind=\"attributes()\">\n <CollapsibleTrigger as-child>\n <SidebarGroupLabel\n as=\"button\"\n type=\"button\"\n class=\"hover:bg-sidebar-accent w-full cursor-pointer justify-between\"\n >\n <span class=\"flex items-center gap-1.5\">\n <Icon v-if=\"props.group.icon\" :name=\"props.group.icon\" />\n {{ props.group.label }}\n </span>\n <Icon\n name=\"alfakit::panels.sidebar.group.collapse-button\"\n :fallback=\"ChevronRightIcon\"\n class=\"size-3.5 transition-transform group-data-[state=open]/nav-group:rotate-90 rtl:rotate-180 rtl:group-data-[state=open]/nav-group:rotate-90\"\n />\n </SidebarGroupLabel>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <SidebarGroupContent :class=\"contentClass()\">\n <SidebarMenu>\n <NavItem v-for=\"item in props.group.items\" :key=\"item.url ?? item.label\" :item=\"item\" />\n </SidebarMenu>\n </SidebarGroupContent>\n </CollapsibleContent>\n <NavGroupFlyout v-if=\"flyout()\" :group=\"props.group\" />\n </SidebarGroup>\n </Collapsible>\n</template>\n"],"mappings":""}
@@ -46,7 +46,7 @@ var k = { class: "flex items-center gap-1.5" }, A = /*@__PURE__*/ v({
46
46
  default: D(() => [_(s, { class: x(N()) }, {
47
47
  default: D(() => [_(a, null, {
48
48
  default: D(() => [(C(!0), m(d, null, w(A.group.items, (e) => (C(), f(u, {
49
- key: e.label,
49
+ key: e.url ?? e.label,
50
50
  item: e
51
51
  }, null, 8, ["item"]))), 128))]),
52
52
  _: 1
@@ -76,7 +76,7 @@ var k = { class: "flex items-center gap-1.5" }, A = /*@__PURE__*/ v({
76
76
  _(s, { class: x(N()) }, {
77
77
  default: D(() => [_(a, null, {
78
78
  default: D(() => [(C(!0), m(d, null, w(A.group.items, (e) => (C(), f(u, {
79
- key: e.label,
79
+ key: e.url ?? e.label,
80
80
  item: e
81
81
  }, null, 8, ["item"]))), 128))]),
82
82
  _: 1
@@ -93,7 +93,7 @@ var k = { class: "flex items-center gap-1.5" }, A = /*@__PURE__*/ v({
93
93
  default: D(() => [_(s, null, {
94
94
  default: D(() => [_(a, null, {
95
95
  default: D(() => [(C(!0), m(d, null, w(A.group.items, (e) => (C(), f(u, {
96
- key: e.label,
96
+ key: e.url ?? e.label,
97
97
  item: e
98
98
  }, null, 8, ["item"]))), 128))]),
99
99
  _: 1
@@ -1 +1 @@
1
- {"version":3,"file":"NavGroup.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","SidebarGroup","_normalizeProps","_mergeProps","_withCtx","_createVNode","SidebarGroupContent","SidebarMenu","_createElementBlock","_Fragment","_renderList","NavItem","SidebarGroupLabel","_unref","Icon","_createCommentVNode","_createTextVNode","_toDisplayString","_normalizeClass","NavGroupFlyout","Collapsible","_guardReactiveProps","CollapsibleTrigger","_createElementVNode","CollapsibleContent","Icon_default","Collapsible_default","CollapsibleContent_default","CollapsibleTrigger_default","SidebarMenu_default","SidebarGroup_default","SidebarGroupContent_default","SidebarGroupLabel_default","NavGroupFlyout_default","NavItem_default","_hoisted_1","NavGroup_vue_vue_type_script_setup_true_lang_default","props","__props","attributes","flyout","contentClass","cn","openBlock","createBlock","item","withCtx","createVNode","normalizeProps","guardReactiveProps","createElementVNode","unref","createCommentVNode","createTextVNode","toDisplayString","ChevronRightIcon","normalizeClass","createElementBlock","Fragment","renderList","mergeProps"],"sources":["../../../src/components/panel/NavGroup.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { NavigationGroupSchema } from '@alfakit/core'\nimport { ChevronRightIcon } from '@lucide/vue'\nimport { Icon } from '../../lib/icons'\nimport Collapsible from '../ui/Collapsible.vue'\nimport CollapsibleContent from '../ui/CollapsibleContent.vue'\nimport CollapsibleTrigger from '../ui/CollapsibleTrigger.vue'\nimport SidebarGroup from '../ui/SidebarGroup.vue'\nimport SidebarGroupContent from '../ui/SidebarGroupContent.vue'\nimport SidebarGroupLabel from '../ui/SidebarGroupLabel.vue'\nimport SidebarMenu from '../ui/SidebarMenu.vue'\nimport { cn } from '../../lib/utils'\nimport NavGroupFlyout from './NavGroupFlyout.vue'\nimport NavItem from './NavItem.vue'\n\nconst props = defineProps<{ group: NavigationGroupSchema }>()\n// `NavigationGroup::extraSidebarAttributes()`; Vue merges `class` with the group's own.\nconst attributes = () => props.group.extraSidebarAttributes ?? {}\n// A labelled group with an icon collapses into a flyout in the icon-only sidebar.\nconst flyout = () => Boolean(props.group.label && props.group.icon)\nconst contentClass = () => cn(flyout() && 'group-data-[collapsible=icon]:hidden')\n</script>\n\n<template>\n <SidebarGroup v-if=\"!props.group.label\" v-bind=\"attributes()\">\n <SidebarGroupContent>\n <SidebarMenu>\n <NavItem v-for=\"item in props.group.items\" :key=\"item.label\" :item=\"item\" />\n </SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n <SidebarGroup v-else-if=\"!props.group.collapsible\" v-bind=\"attributes()\">\n <SidebarGroupLabel>\n <Icon v-if=\"props.group.icon\" :name=\"props.group.icon\" class=\"me-1.5\" />\n {{ props.group.label }}\n </SidebarGroupLabel>\n <SidebarGroupContent :class=\"contentClass()\">\n <SidebarMenu>\n <NavItem v-for=\"item in props.group.items\" :key=\"item.label\" :item=\"item\" />\n </SidebarMenu>\n </SidebarGroupContent>\n <NavGroupFlyout v-if=\"flyout()\" :group=\"props.group\" />\n </SidebarGroup>\n <Collapsible\n v-else\n :default-open=\"!props.group.collapsed || props.group.items.some((item) => item.active)\"\n class=\"group/nav-group\"\n >\n <SidebarGroup v-bind=\"attributes()\">\n <CollapsibleTrigger as-child>\n <SidebarGroupLabel\n as=\"button\"\n type=\"button\"\n class=\"hover:bg-sidebar-accent w-full cursor-pointer justify-between\"\n >\n <span class=\"flex items-center gap-1.5\">\n <Icon v-if=\"props.group.icon\" :name=\"props.group.icon\" />\n {{ props.group.label }}\n </span>\n <Icon\n name=\"alfakit::panels.sidebar.group.collapse-button\"\n :fallback=\"ChevronRightIcon\"\n class=\"size-3.5 transition-transform group-data-[state=open]/nav-group:rotate-90 rtl:rotate-180 rtl:group-data-[state=open]/nav-group:rotate-90\"\n />\n </SidebarGroupLabel>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <SidebarGroupContent :class=\"contentClass()\">\n <SidebarMenu>\n <NavItem v-for=\"item in props.group.items\" :key=\"item.label\" :item=\"item\" />\n </SidebarMenu>\n </SidebarGroupContent>\n </CollapsibleContent>\n <NavGroupFlyout v-if=\"flyout()\" :group=\"props.group\" />\n </SidebarGroup>\n </Collapsible>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"NavGroup.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","SidebarGroup","_normalizeProps","_mergeProps","_withCtx","_createVNode","SidebarGroupContent","SidebarMenu","_createElementBlock","_Fragment","_renderList","NavItem","SidebarGroupLabel","_unref","Icon","_createCommentVNode","_createTextVNode","_toDisplayString","_normalizeClass","NavGroupFlyout","Collapsible","_guardReactiveProps","CollapsibleTrigger","_createElementVNode","CollapsibleContent","Icon_default","Collapsible_default","CollapsibleContent_default","CollapsibleTrigger_default","SidebarMenu_default","SidebarGroup_default","SidebarGroupContent_default","SidebarGroupLabel_default","NavGroupFlyout_default","NavItem_default","_hoisted_1","NavGroup_vue_vue_type_script_setup_true_lang_default","props","__props","attributes","flyout","contentClass","cn","openBlock","createBlock","item","withCtx","createVNode","normalizeProps","guardReactiveProps","createElementVNode","unref","createCommentVNode","createTextVNode","toDisplayString","ChevronRightIcon","normalizeClass","createElementBlock","Fragment","renderList","mergeProps"],"sources":["../../../src/components/panel/NavGroup.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { NavigationGroupSchema } from '@alfakit/core'\nimport { ChevronRightIcon } from '@lucide/vue'\nimport { Icon } from '../../lib/icons'\nimport Collapsible from '../ui/Collapsible.vue'\nimport CollapsibleContent from '../ui/CollapsibleContent.vue'\nimport CollapsibleTrigger from '../ui/CollapsibleTrigger.vue'\nimport SidebarGroup from '../ui/SidebarGroup.vue'\nimport SidebarGroupContent from '../ui/SidebarGroupContent.vue'\nimport SidebarGroupLabel from '../ui/SidebarGroupLabel.vue'\nimport SidebarMenu from '../ui/SidebarMenu.vue'\nimport { cn } from '../../lib/utils'\nimport NavGroupFlyout from './NavGroupFlyout.vue'\nimport NavItem from './NavItem.vue'\n\nconst props = defineProps<{ group: NavigationGroupSchema }>()\n// `NavigationGroup::extraSidebarAttributes()`; Vue merges `class` with the group's own.\nconst attributes = () => props.group.extraSidebarAttributes ?? {}\n// A labelled group with an icon collapses into a flyout in the icon-only sidebar.\nconst flyout = () => Boolean(props.group.label && props.group.icon)\nconst contentClass = () => cn(flyout() && 'group-data-[collapsible=icon]:hidden')\n</script>\n\n<template>\n <SidebarGroup v-if=\"!props.group.label\" v-bind=\"attributes()\">\n <SidebarGroupContent>\n <SidebarMenu>\n <NavItem v-for=\"item in props.group.items\" :key=\"item.url ?? item.label\" :item=\"item\" />\n </SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n <SidebarGroup v-else-if=\"!props.group.collapsible\" v-bind=\"attributes()\">\n <SidebarGroupLabel>\n <Icon v-if=\"props.group.icon\" :name=\"props.group.icon\" class=\"me-1.5\" />\n {{ props.group.label }}\n </SidebarGroupLabel>\n <SidebarGroupContent :class=\"contentClass()\">\n <SidebarMenu>\n <NavItem v-for=\"item in props.group.items\" :key=\"item.url ?? item.label\" :item=\"item\" />\n </SidebarMenu>\n </SidebarGroupContent>\n <NavGroupFlyout v-if=\"flyout()\" :group=\"props.group\" />\n </SidebarGroup>\n <Collapsible\n v-else\n :default-open=\"!props.group.collapsed || props.group.items.some((item) => item.active)\"\n class=\"group/nav-group\"\n >\n <SidebarGroup v-bind=\"attributes()\">\n <CollapsibleTrigger as-child>\n <SidebarGroupLabel\n as=\"button\"\n type=\"button\"\n class=\"hover:bg-sidebar-accent w-full cursor-pointer justify-between\"\n >\n <span class=\"flex items-center gap-1.5\">\n <Icon v-if=\"props.group.icon\" :name=\"props.group.icon\" />\n {{ props.group.label }}\n </span>\n <Icon\n name=\"alfakit::panels.sidebar.group.collapse-button\"\n :fallback=\"ChevronRightIcon\"\n class=\"size-3.5 transition-transform group-data-[state=open]/nav-group:rotate-90 rtl:rotate-180 rtl:group-data-[state=open]/nav-group:rotate-90\"\n />\n </SidebarGroupLabel>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <SidebarGroupContent :class=\"contentClass()\">\n <SidebarMenu>\n <NavItem v-for=\"item in props.group.items\" :key=\"item.url ?? item.label\" :item=\"item\" />\n </SidebarMenu>\n </SidebarGroupContent>\n </CollapsibleContent>\n <NavGroupFlyout v-if=\"flyout()\" :group=\"props.group\" />\n </SidebarGroup>\n </Collapsible>\n</template>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"NavItem.js","names":["_sfc_main","NavItem_vue_vue_type_script_setup_true_lang_default","NavItem_default"],"sources":["../../../src/components/panel/NavItem.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { navigationItemText, PREFETCH_CACHE_FOR, type NavigationItemSchema } from '@alfakit/core'\nimport { Link } from '@inertiajs/vue3'\nimport { ChevronRightIcon } from '@lucide/vue'\nimport { badgeColorClasses, colorClass } from '../../lib/colors'\nimport { Icon } from '../../lib/icons'\nimport { cn } from '../../lib/utils'\nimport Badge from '../ui/Badge.vue'\nimport Collapsible from '../ui/Collapsible.vue'\nimport CollapsibleContent from '../ui/CollapsibleContent.vue'\nimport CollapsibleTrigger from '../ui/CollapsibleTrigger.vue'\nimport SidebarMenuButton from '../ui/SidebarMenuButton.vue'\nimport SidebarMenuItem from '../ui/SidebarMenuItem.vue'\nimport SidebarMenuSub from '../ui/SidebarMenuSub.vue'\nimport NavSubItem from './NavSubItem.vue'\nimport NewTabHint from '../../lib/NewTabHint.vue'\nimport NavLabel from './NavLabel.vue'\nimport { useT } from '../../context'\n\nconst props = defineProps<{ item: NavigationItemSchema }>()\nconst t = useT()\n</script>\n\n<template>\n <Collapsible\n v-if=\"props.item.children && props.item.children.length > 0\"\n as-child\n :default-open=\"props.item.active\"\n class=\"group/collapsible\"\n >\n <SidebarMenuItem>\n <CollapsibleTrigger as-child>\n <SidebarMenuButton\n v-bind=\"props.item.extraAttributes ?? {}\"\n :tooltip=\"navigationItemText(props.item)\"\n :is-active=\"props.item.active\"\n >\n <Icon v-if=\"props.item.icon\" :name=\"props.item.icon\" />\n <NavLabel :text=\"props.item.label\" :html=\"props.item.labelHtml\" />\n <Badge\n v-if=\"props.item.badge !== undefined && props.item.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn(\n 'ms-auto px-1.5 py-0',\n colorClass(badgeColorClasses, props.item.badgeColor, 'gray'),\n )\n \"\n :title=\"props.item.badgeTooltip\"\n >{{ props.item.badge }}</Badge\n >\n <span\n v-else-if=\"props.item.badgePending\"\n data-slot=\"badge\"\n aria-busy=\"true\"\n :aria-label=\"t('loading', {}, 'Loading')\"\n class=\"bg-muted-foreground/20 ms-auto inline-block h-4 w-5 animate-pulse rounded-md\"\n />\n <ChevronRightIcon\n class=\"ms-auto transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90 rtl:rotate-180 rtl:group-data-[state=open]/collapsible:rotate-90\"\n />\n </SidebarMenuButton>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <SidebarMenuSub>\n <NavSubItem v-for=\"child in props.item.children\" :key=\"child.label\" :item=\"child\" />\n </SidebarMenuSub>\n </CollapsibleContent>\n </SidebarMenuItem>\n </Collapsible>\n <SidebarMenuItem v-else>\n <SidebarMenuButton\n as-child\n :is-active=\"props.item.active\"\n :tooltip=\"navigationItemText(props.item)\"\n >\n <a\n v-if=\"props.item.openInNewTab\"\n v-bind=\"props.item.extraAttributes ?? {}\"\n :href=\"props.item.url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <Icon v-if=\"props.item.icon\" :name=\"props.item.icon\" />\n <NavLabel :text=\"props.item.label\" :html=\"props.item.labelHtml\" />\n <NewTabHint />\n <Badge\n v-if=\"props.item.badge !== undefined && props.item.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn('ms-auto px-1.5 py-0', colorClass(badgeColorClasses, props.item.badgeColor, 'gray'))\n \"\n :title=\"props.item.badgeTooltip\"\n >{{ props.item.badge }}</Badge\n >\n <span\n v-else-if=\"props.item.badgePending\"\n data-slot=\"badge\"\n aria-busy=\"true\"\n :aria-label=\"t('loading', {}, 'Loading')\"\n class=\"bg-muted-foreground/20 ms-auto inline-block h-4 w-5 animate-pulse rounded-md\"\n />\n </a>\n <Link\n v-else\n v-bind=\"props.item.extraAttributes ?? {}\"\n :href=\"props.item.url ?? '#'\"\n prefetch\n :cache-for=\"PREFETCH_CACHE_FOR\"\n >\n <Icon v-if=\"props.item.icon\" :name=\"props.item.icon\" />\n <NavLabel :text=\"props.item.label\" :html=\"props.item.labelHtml\" />\n <Badge\n v-if=\"props.item.badge !== undefined && props.item.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn('ms-auto px-1.5 py-0', colorClass(badgeColorClasses, props.item.badgeColor, 'gray'))\n \"\n :title=\"props.item.badgeTooltip\"\n >{{ props.item.badge }}</Badge\n >\n <span\n v-else-if=\"props.item.badgePending\"\n data-slot=\"badge\"\n aria-busy=\"true\"\n :aria-label=\"t('loading', {}, 'Loading')\"\n class=\"bg-muted-foreground/20 ms-auto inline-block h-4 w-5 animate-pulse rounded-md\"\n />\n </Link>\n </SidebarMenuButton>\n </SidebarMenuItem>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"NavItem.js","names":["_sfc_main","NavItem_vue_vue_type_script_setup_true_lang_default","NavItem_default"],"sources":["../../../src/components/panel/NavItem.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { navigationItemText, PREFETCH_CACHE_FOR, type NavigationItemSchema } from '@alfakit/core'\nimport { Link } from '@inertiajs/vue3'\nimport { ChevronRightIcon } from '@lucide/vue'\nimport { badgeColorClasses, colorClass } from '../../lib/colors'\nimport { Icon } from '../../lib/icons'\nimport { cn } from '../../lib/utils'\nimport Badge from '../ui/Badge.vue'\nimport Collapsible from '../ui/Collapsible.vue'\nimport CollapsibleContent from '../ui/CollapsibleContent.vue'\nimport CollapsibleTrigger from '../ui/CollapsibleTrigger.vue'\nimport SidebarMenuButton from '../ui/SidebarMenuButton.vue'\nimport SidebarMenuItem from '../ui/SidebarMenuItem.vue'\nimport SidebarMenuSub from '../ui/SidebarMenuSub.vue'\nimport NavSubItem from './NavSubItem.vue'\nimport NewTabHint from '../../lib/NewTabHint.vue'\nimport NavLabel from './NavLabel.vue'\nimport { useT } from '../../context'\n\nconst props = defineProps<{ item: NavigationItemSchema }>()\nconst t = useT()\n</script>\n\n<template>\n <Collapsible\n v-if=\"props.item.children && props.item.children.length > 0\"\n as-child\n :default-open=\"props.item.active\"\n class=\"group/collapsible\"\n >\n <SidebarMenuItem>\n <CollapsibleTrigger as-child>\n <SidebarMenuButton\n v-bind=\"props.item.extraAttributes ?? {}\"\n :tooltip=\"navigationItemText(props.item)\"\n :is-active=\"props.item.active\"\n >\n <Icon v-if=\"props.item.icon\" :name=\"props.item.icon\" />\n <NavLabel :text=\"props.item.label\" :html=\"props.item.labelHtml\" />\n <Badge\n v-if=\"props.item.badge !== undefined && props.item.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn(\n 'ms-auto px-1.5 py-0',\n colorClass(badgeColorClasses, props.item.badgeColor, 'gray'),\n )\n \"\n :title=\"props.item.badgeTooltip\"\n >{{ props.item.badge }}</Badge\n >\n <span\n v-else-if=\"props.item.badgePending\"\n data-slot=\"badge\"\n aria-busy=\"true\"\n :aria-label=\"t('loading', {}, 'Loading')\"\n class=\"bg-muted-foreground/20 ms-auto inline-block h-4 w-5 animate-pulse rounded-md\"\n />\n <ChevronRightIcon\n class=\"ms-auto transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90 rtl:rotate-180 rtl:group-data-[state=open]/collapsible:rotate-90\"\n />\n </SidebarMenuButton>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <SidebarMenuSub>\n <NavSubItem\n v-for=\"child in props.item.children\"\n :key=\"child.url ?? child.label\"\n :item=\"child\"\n />\n </SidebarMenuSub>\n </CollapsibleContent>\n </SidebarMenuItem>\n </Collapsible>\n <SidebarMenuItem v-else>\n <SidebarMenuButton\n as-child\n :is-active=\"props.item.active\"\n :tooltip=\"navigationItemText(props.item)\"\n >\n <a\n v-if=\"props.item.openInNewTab\"\n v-bind=\"props.item.extraAttributes ?? {}\"\n :href=\"props.item.url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <Icon v-if=\"props.item.icon\" :name=\"props.item.icon\" />\n <NavLabel :text=\"props.item.label\" :html=\"props.item.labelHtml\" />\n <NewTabHint />\n <Badge\n v-if=\"props.item.badge !== undefined && props.item.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn('ms-auto px-1.5 py-0', colorClass(badgeColorClasses, props.item.badgeColor, 'gray'))\n \"\n :title=\"props.item.badgeTooltip\"\n >{{ props.item.badge }}</Badge\n >\n <span\n v-else-if=\"props.item.badgePending\"\n data-slot=\"badge\"\n aria-busy=\"true\"\n :aria-label=\"t('loading', {}, 'Loading')\"\n class=\"bg-muted-foreground/20 ms-auto inline-block h-4 w-5 animate-pulse rounded-md\"\n />\n </a>\n <Link\n v-else\n v-bind=\"props.item.extraAttributes ?? {}\"\n :href=\"props.item.url ?? '#'\"\n prefetch\n :cache-for=\"PREFETCH_CACHE_FOR\"\n >\n <Icon v-if=\"props.item.icon\" :name=\"props.item.icon\" />\n <NavLabel :text=\"props.item.label\" :html=\"props.item.labelHtml\" />\n <Badge\n v-if=\"props.item.badge !== undefined && props.item.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn('ms-auto px-1.5 py-0', colorClass(badgeColorClasses, props.item.badgeColor, 'gray'))\n \"\n :title=\"props.item.badgeTooltip\"\n >{{ props.item.badge }}</Badge\n >\n <span\n v-else-if=\"props.item.badgePending\"\n data-slot=\"badge\"\n aria-busy=\"true\"\n :aria-label=\"t('loading', {}, 'Loading')\"\n class=\"bg-muted-foreground/20 ms-auto inline-block h-4 w-5 animate-pulse rounded-md\"\n />\n </Link>\n </SidebarMenuButton>\n </SidebarMenuItem>\n</template>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"NavItem.vue.d.ts","sourceRoot":"","sources":["../../../src/components/panel/NavItem.vue"],"names":[],"mappings":"AAsIA,OAAO,EAA0C,KAAK,oBAAoB,EAAE,MAAM,eAAe,CAAA;AAkBjG,KAAK,WAAW,GAAG;IAAE,IAAI,EAAE,oBAAoB,CAAA;CAAE,CAAC;;AA2XlD,wBAMG"}
1
+ {"version":3,"file":"NavItem.vue.d.ts","sourceRoot":"","sources":["../../../src/components/panel/NavItem.vue"],"names":[],"mappings":"AA0IA,OAAO,EAA0C,KAAK,oBAAoB,EAAE,MAAM,eAAe,CAAA;AAkBjG,KAAK,WAAW,GAAG;IAAE,IAAI,EAAE,oBAAoB,CAAA;CAAE,CAAC;;AA2XlD,wBAMG"}
@@ -66,7 +66,7 @@ var N = ["aria-label"], P = ["href"], F = ["aria-label"], I = ["aria-label"], L
66
66
  }), C(l, null, {
67
67
  default: j(() => [C(p, null, {
68
68
  default: j(() => [(D(!0), x(v, null, O(L.item.children, (e) => (D(), y(m, {
69
- key: e.label,
69
+ key: e.url ?? e.label,
70
70
  item: e
71
71
  }, null, 8, ["item"]))), 128))]),
72
72
  _: 1
@@ -1 +1 @@
1
- {"version":3,"file":"NavItem.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","Collapsible","_withCtx","_createVNode","SidebarMenuItem","CollapsibleTrigger","SidebarMenuButton","_mergeProps","_unref","Icon","_createCommentVNode","NavLabel","Badge","_normalizeClass","_createTextVNode","_toDisplayString","_createElementBlock","CollapsibleContent","SidebarMenuSub","_Fragment","_renderList","NavSubItem","NewTabHint","Icon_default","Badge_default","NewTabHint_default","NavLabel_default","Collapsible_default","CollapsibleContent_default","CollapsibleTrigger_default","SidebarMenuButton_default","SidebarMenuItem_default","SidebarMenuSub_default","NavSubItem_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","NavItem_vue_vue_type_script_setup_true_lang_default","props","__props","t","useT","openBlock","createBlock","withCtx","createVNode","mergeProps","unref","navigationItemText","createCommentVNode","normalizeClass","cn","colorClass","badgeColorClasses","createTextVNode","toDisplayString","createElementBlock","ChevronRightIcon","Fragment","renderList","child","Link","PREFETCH_CACHE_FOR"],"sources":["../../../src/components/panel/NavItem.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { navigationItemText, PREFETCH_CACHE_FOR, type NavigationItemSchema } from '@alfakit/core'\nimport { Link } from '@inertiajs/vue3'\nimport { ChevronRightIcon } from '@lucide/vue'\nimport { badgeColorClasses, colorClass } from '../../lib/colors'\nimport { Icon } from '../../lib/icons'\nimport { cn } from '../../lib/utils'\nimport Badge from '../ui/Badge.vue'\nimport Collapsible from '../ui/Collapsible.vue'\nimport CollapsibleContent from '../ui/CollapsibleContent.vue'\nimport CollapsibleTrigger from '../ui/CollapsibleTrigger.vue'\nimport SidebarMenuButton from '../ui/SidebarMenuButton.vue'\nimport SidebarMenuItem from '../ui/SidebarMenuItem.vue'\nimport SidebarMenuSub from '../ui/SidebarMenuSub.vue'\nimport NavSubItem from './NavSubItem.vue'\nimport NewTabHint from '../../lib/NewTabHint.vue'\nimport NavLabel from './NavLabel.vue'\nimport { useT } from '../../context'\n\nconst props = defineProps<{ item: NavigationItemSchema }>()\nconst t = useT()\n</script>\n\n<template>\n <Collapsible\n v-if=\"props.item.children && props.item.children.length > 0\"\n as-child\n :default-open=\"props.item.active\"\n class=\"group/collapsible\"\n >\n <SidebarMenuItem>\n <CollapsibleTrigger as-child>\n <SidebarMenuButton\n v-bind=\"props.item.extraAttributes ?? {}\"\n :tooltip=\"navigationItemText(props.item)\"\n :is-active=\"props.item.active\"\n >\n <Icon v-if=\"props.item.icon\" :name=\"props.item.icon\" />\n <NavLabel :text=\"props.item.label\" :html=\"props.item.labelHtml\" />\n <Badge\n v-if=\"props.item.badge !== undefined && props.item.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn(\n 'ms-auto px-1.5 py-0',\n colorClass(badgeColorClasses, props.item.badgeColor, 'gray'),\n )\n \"\n :title=\"props.item.badgeTooltip\"\n >{{ props.item.badge }}</Badge\n >\n <span\n v-else-if=\"props.item.badgePending\"\n data-slot=\"badge\"\n aria-busy=\"true\"\n :aria-label=\"t('loading', {}, 'Loading')\"\n class=\"bg-muted-foreground/20 ms-auto inline-block h-4 w-5 animate-pulse rounded-md\"\n />\n <ChevronRightIcon\n class=\"ms-auto transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90 rtl:rotate-180 rtl:group-data-[state=open]/collapsible:rotate-90\"\n />\n </SidebarMenuButton>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <SidebarMenuSub>\n <NavSubItem v-for=\"child in props.item.children\" :key=\"child.label\" :item=\"child\" />\n </SidebarMenuSub>\n </CollapsibleContent>\n </SidebarMenuItem>\n </Collapsible>\n <SidebarMenuItem v-else>\n <SidebarMenuButton\n as-child\n :is-active=\"props.item.active\"\n :tooltip=\"navigationItemText(props.item)\"\n >\n <a\n v-if=\"props.item.openInNewTab\"\n v-bind=\"props.item.extraAttributes ?? {}\"\n :href=\"props.item.url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <Icon v-if=\"props.item.icon\" :name=\"props.item.icon\" />\n <NavLabel :text=\"props.item.label\" :html=\"props.item.labelHtml\" />\n <NewTabHint />\n <Badge\n v-if=\"props.item.badge !== undefined && props.item.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn('ms-auto px-1.5 py-0', colorClass(badgeColorClasses, props.item.badgeColor, 'gray'))\n \"\n :title=\"props.item.badgeTooltip\"\n >{{ props.item.badge }}</Badge\n >\n <span\n v-else-if=\"props.item.badgePending\"\n data-slot=\"badge\"\n aria-busy=\"true\"\n :aria-label=\"t('loading', {}, 'Loading')\"\n class=\"bg-muted-foreground/20 ms-auto inline-block h-4 w-5 animate-pulse rounded-md\"\n />\n </a>\n <Link\n v-else\n v-bind=\"props.item.extraAttributes ?? {}\"\n :href=\"props.item.url ?? '#'\"\n prefetch\n :cache-for=\"PREFETCH_CACHE_FOR\"\n >\n <Icon v-if=\"props.item.icon\" :name=\"props.item.icon\" />\n <NavLabel :text=\"props.item.label\" :html=\"props.item.labelHtml\" />\n <Badge\n v-if=\"props.item.badge !== undefined && props.item.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn('ms-auto px-1.5 py-0', colorClass(badgeColorClasses, props.item.badgeColor, 'gray'))\n \"\n :title=\"props.item.badgeTooltip\"\n >{{ props.item.badge }}</Badge\n >\n <span\n v-else-if=\"props.item.badgePending\"\n data-slot=\"badge\"\n aria-busy=\"true\"\n :aria-label=\"t('loading', {}, 'Loading')\"\n class=\"bg-muted-foreground/20 ms-auto inline-block h-4 w-5 animate-pulse rounded-md\"\n />\n </Link>\n </SidebarMenuButton>\n </SidebarMenuItem>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"NavItem.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","Collapsible","_withCtx","_createVNode","SidebarMenuItem","CollapsibleTrigger","SidebarMenuButton","_mergeProps","_unref","Icon","_createCommentVNode","NavLabel","Badge","_normalizeClass","_createTextVNode","_toDisplayString","_createElementBlock","CollapsibleContent","SidebarMenuSub","_Fragment","_renderList","NavSubItem","NewTabHint","Icon_default","Badge_default","NewTabHint_default","NavLabel_default","Collapsible_default","CollapsibleContent_default","CollapsibleTrigger_default","SidebarMenuButton_default","SidebarMenuItem_default","SidebarMenuSub_default","NavSubItem_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","NavItem_vue_vue_type_script_setup_true_lang_default","props","__props","t","useT","openBlock","createBlock","withCtx","createVNode","mergeProps","unref","navigationItemText","createCommentVNode","normalizeClass","cn","colorClass","badgeColorClasses","createTextVNode","toDisplayString","createElementBlock","ChevronRightIcon","Fragment","renderList","child","Link","PREFETCH_CACHE_FOR"],"sources":["../../../src/components/panel/NavItem.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { navigationItemText, PREFETCH_CACHE_FOR, type NavigationItemSchema } from '@alfakit/core'\nimport { Link } from '@inertiajs/vue3'\nimport { ChevronRightIcon } from '@lucide/vue'\nimport { badgeColorClasses, colorClass } from '../../lib/colors'\nimport { Icon } from '../../lib/icons'\nimport { cn } from '../../lib/utils'\nimport Badge from '../ui/Badge.vue'\nimport Collapsible from '../ui/Collapsible.vue'\nimport CollapsibleContent from '../ui/CollapsibleContent.vue'\nimport CollapsibleTrigger from '../ui/CollapsibleTrigger.vue'\nimport SidebarMenuButton from '../ui/SidebarMenuButton.vue'\nimport SidebarMenuItem from '../ui/SidebarMenuItem.vue'\nimport SidebarMenuSub from '../ui/SidebarMenuSub.vue'\nimport NavSubItem from './NavSubItem.vue'\nimport NewTabHint from '../../lib/NewTabHint.vue'\nimport NavLabel from './NavLabel.vue'\nimport { useT } from '../../context'\n\nconst props = defineProps<{ item: NavigationItemSchema }>()\nconst t = useT()\n</script>\n\n<template>\n <Collapsible\n v-if=\"props.item.children && props.item.children.length > 0\"\n as-child\n :default-open=\"props.item.active\"\n class=\"group/collapsible\"\n >\n <SidebarMenuItem>\n <CollapsibleTrigger as-child>\n <SidebarMenuButton\n v-bind=\"props.item.extraAttributes ?? {}\"\n :tooltip=\"navigationItemText(props.item)\"\n :is-active=\"props.item.active\"\n >\n <Icon v-if=\"props.item.icon\" :name=\"props.item.icon\" />\n <NavLabel :text=\"props.item.label\" :html=\"props.item.labelHtml\" />\n <Badge\n v-if=\"props.item.badge !== undefined && props.item.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn(\n 'ms-auto px-1.5 py-0',\n colorClass(badgeColorClasses, props.item.badgeColor, 'gray'),\n )\n \"\n :title=\"props.item.badgeTooltip\"\n >{{ props.item.badge }}</Badge\n >\n <span\n v-else-if=\"props.item.badgePending\"\n data-slot=\"badge\"\n aria-busy=\"true\"\n :aria-label=\"t('loading', {}, 'Loading')\"\n class=\"bg-muted-foreground/20 ms-auto inline-block h-4 w-5 animate-pulse rounded-md\"\n />\n <ChevronRightIcon\n class=\"ms-auto transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90 rtl:rotate-180 rtl:group-data-[state=open]/collapsible:rotate-90\"\n />\n </SidebarMenuButton>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <SidebarMenuSub>\n <NavSubItem\n v-for=\"child in props.item.children\"\n :key=\"child.url ?? child.label\"\n :item=\"child\"\n />\n </SidebarMenuSub>\n </CollapsibleContent>\n </SidebarMenuItem>\n </Collapsible>\n <SidebarMenuItem v-else>\n <SidebarMenuButton\n as-child\n :is-active=\"props.item.active\"\n :tooltip=\"navigationItemText(props.item)\"\n >\n <a\n v-if=\"props.item.openInNewTab\"\n v-bind=\"props.item.extraAttributes ?? {}\"\n :href=\"props.item.url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <Icon v-if=\"props.item.icon\" :name=\"props.item.icon\" />\n <NavLabel :text=\"props.item.label\" :html=\"props.item.labelHtml\" />\n <NewTabHint />\n <Badge\n v-if=\"props.item.badge !== undefined && props.item.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn('ms-auto px-1.5 py-0', colorClass(badgeColorClasses, props.item.badgeColor, 'gray'))\n \"\n :title=\"props.item.badgeTooltip\"\n >{{ props.item.badge }}</Badge\n >\n <span\n v-else-if=\"props.item.badgePending\"\n data-slot=\"badge\"\n aria-busy=\"true\"\n :aria-label=\"t('loading', {}, 'Loading')\"\n class=\"bg-muted-foreground/20 ms-auto inline-block h-4 w-5 animate-pulse rounded-md\"\n />\n </a>\n <Link\n v-else\n v-bind=\"props.item.extraAttributes ?? {}\"\n :href=\"props.item.url ?? '#'\"\n prefetch\n :cache-for=\"PREFETCH_CACHE_FOR\"\n >\n <Icon v-if=\"props.item.icon\" :name=\"props.item.icon\" />\n <NavLabel :text=\"props.item.label\" :html=\"props.item.labelHtml\" />\n <Badge\n v-if=\"props.item.badge !== undefined && props.item.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn('ms-auto px-1.5 py-0', colorClass(badgeColorClasses, props.item.badgeColor, 'gray'))\n \"\n :title=\"props.item.badgeTooltip\"\n >{{ props.item.badge }}</Badge\n >\n <span\n v-else-if=\"props.item.badgePending\"\n data-slot=\"badge\"\n aria-busy=\"true\"\n :aria-label=\"t('loading', {}, 'Loading')\"\n class=\"bg-muted-foreground/20 ms-auto inline-block h-4 w-5 animate-pulse rounded-md\"\n />\n </Link>\n </SidebarMenuButton>\n </SidebarMenuItem>\n</template>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"NavSubItem.js","names":["_sfc_main","NavSubItem_vue_vue_type_script_setup_true_lang_default","NavSubItem_default"],"sources":["../../../src/components/panel/NavSubItem.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { PREFETCH_CACHE_FOR, type NavigationItemSchema } from '@alfakit/core'\nimport { Link } from '@inertiajs/vue3'\nimport { ChevronRightIcon } from '@lucide/vue'\nimport { computed } from 'vue'\nimport { badgeColorClasses, colorClass } from '../../lib/colors'\nimport { Icon } from '../../lib/icons'\nimport { cn } from '../../lib/utils'\nimport Badge from '../ui/Badge.vue'\nimport Collapsible from '../ui/Collapsible.vue'\nimport CollapsibleContent from '../ui/CollapsibleContent.vue'\nimport CollapsibleTrigger from '../ui/CollapsibleTrigger.vue'\nimport SidebarMenuSub from '../ui/SidebarMenuSub.vue'\nimport SidebarMenuSubButton from '../ui/SidebarMenuSubButton.vue'\nimport SidebarMenuSubItem from '../ui/SidebarMenuSubItem.vue'\nimport NavSubItem from './NavSubItem.vue'\nimport NewTabHint from '../../lib/NewTabHint.vue'\nimport NavLabel from './NavLabel.vue'\nimport { useT } from '../../context'\n\n/** A child navigation item (any depth): badge, new-tab link and nested children. */\nconst props = defineProps<{ item: NavigationItemSchema }>()\nconst t = useT()\nconst hasBadge = computed(() => props.item.badge !== undefined && props.item.badge !== null)\nconst badgeClass = computed(() =>\n cn('ms-auto px-1.5 py-0', colorClass(badgeColorClasses, props.item.badgeColor, 'gray')),\n)\n</script>\n\n<template>\n <SidebarMenuSubItem>\n <Collapsible\n v-if=\"props.item.children && props.item.children.length > 0\"\n :default-open=\"props.item.active\"\n class=\"group/nav-sub\"\n >\n <CollapsibleTrigger as-child>\n <SidebarMenuSubButton\n v-bind=\"props.item.extraAttributes ?? {}\"\n as=\"button\"\n type=\"button\"\n class=\"w-full\"\n :is-active=\"props.item.active\"\n >\n <Icon v-if=\"props.item.icon\" :name=\"props.item.icon\" />\n <NavLabel :text=\"props.item.label\" :html=\"props.item.labelHtml\" />\n <Badge\n v-if=\"hasBadge\"\n variant=\"outline\"\n :class=\"badgeClass\"\n :title=\"props.item.badgeTooltip\"\n >{{ props.item.badge }}</Badge\n >\n <span\n v-else-if=\"props.item.badgePending\"\n data-slot=\"badge\"\n aria-busy=\"true\"\n :aria-label=\"t('loading', {}, 'Loading')\"\n class=\"bg-muted-foreground/20 ms-auto inline-block h-4 w-5 animate-pulse rounded-md\"\n />\n <ChevronRightIcon\n class=\"ms-auto transition-transform duration-200 group-data-[state=open]/nav-sub:rotate-90 rtl:rotate-180 rtl:group-data-[state=open]/nav-sub:rotate-90\"\n />\n </SidebarMenuSubButton>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <SidebarMenuSub>\n <NavSubItem v-for=\"child in props.item.children\" :key=\"child.label\" :item=\"child\" />\n </SidebarMenuSub>\n </CollapsibleContent>\n </Collapsible>\n <SidebarMenuSubButton v-else as-child :is-active=\"props.item.active\">\n <a\n v-if=\"props.item.openInNewTab\"\n v-bind=\"props.item.extraAttributes ?? {}\"\n :href=\"props.item.url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <Icon v-if=\"props.item.icon\" :name=\"props.item.icon\" />\n <NavLabel :text=\"props.item.label\" :html=\"props.item.labelHtml\" />\n <NewTabHint />\n <Badge\n v-if=\"hasBadge\"\n variant=\"outline\"\n :class=\"badgeClass\"\n :title=\"props.item.badgeTooltip\"\n >{{ props.item.badge }}</Badge\n >\n <span\n v-else-if=\"props.item.badgePending\"\n data-slot=\"badge\"\n aria-busy=\"true\"\n :aria-label=\"t('loading', {}, 'Loading')\"\n class=\"bg-muted-foreground/20 ms-auto inline-block h-4 w-5 animate-pulse rounded-md\"\n />\n </a>\n <Link\n v-else\n v-bind=\"props.item.extraAttributes ?? {}\"\n :href=\"props.item.url ?? '#'\"\n prefetch\n :cache-for=\"PREFETCH_CACHE_FOR\"\n >\n <Icon v-if=\"props.item.icon\" :name=\"props.item.icon\" />\n <NavLabel :text=\"props.item.label\" :html=\"props.item.labelHtml\" />\n <Badge\n v-if=\"hasBadge\"\n variant=\"outline\"\n :class=\"badgeClass\"\n :title=\"props.item.badgeTooltip\"\n >{{ props.item.badge }}</Badge\n >\n <span\n v-else-if=\"props.item.badgePending\"\n data-slot=\"badge\"\n aria-busy=\"true\"\n :aria-label=\"t('loading', {}, 'Loading')\"\n class=\"bg-muted-foreground/20 ms-auto inline-block h-4 w-5 animate-pulse rounded-md\"\n />\n </Link>\n </SidebarMenuSubButton>\n </SidebarMenuSubItem>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"NavSubItem.js","names":["_sfc_main","NavSubItem_vue_vue_type_script_setup_true_lang_default","NavSubItem_default"],"sources":["../../../src/components/panel/NavSubItem.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { PREFETCH_CACHE_FOR, type NavigationItemSchema } from '@alfakit/core'\nimport { Link } from '@inertiajs/vue3'\nimport { ChevronRightIcon } from '@lucide/vue'\nimport { computed } from 'vue'\nimport { badgeColorClasses, colorClass } from '../../lib/colors'\nimport { Icon } from '../../lib/icons'\nimport { cn } from '../../lib/utils'\nimport Badge from '../ui/Badge.vue'\nimport Collapsible from '../ui/Collapsible.vue'\nimport CollapsibleContent from '../ui/CollapsibleContent.vue'\nimport CollapsibleTrigger from '../ui/CollapsibleTrigger.vue'\nimport SidebarMenuSub from '../ui/SidebarMenuSub.vue'\nimport SidebarMenuSubButton from '../ui/SidebarMenuSubButton.vue'\nimport SidebarMenuSubItem from '../ui/SidebarMenuSubItem.vue'\nimport NavSubItem from './NavSubItem.vue'\nimport NewTabHint from '../../lib/NewTabHint.vue'\nimport NavLabel from './NavLabel.vue'\nimport { useT } from '../../context'\n\n/** A child navigation item (any depth): badge, new-tab link and nested children. */\nconst props = defineProps<{ item: NavigationItemSchema }>()\nconst t = useT()\nconst hasBadge = computed(() => props.item.badge !== undefined && props.item.badge !== null)\nconst badgeClass = computed(() =>\n cn('ms-auto px-1.5 py-0', colorClass(badgeColorClasses, props.item.badgeColor, 'gray')),\n)\n</script>\n\n<template>\n <SidebarMenuSubItem>\n <Collapsible\n v-if=\"props.item.children && props.item.children.length > 0\"\n :default-open=\"props.item.active\"\n class=\"group/nav-sub\"\n >\n <CollapsibleTrigger as-child>\n <SidebarMenuSubButton\n v-bind=\"props.item.extraAttributes ?? {}\"\n as=\"button\"\n type=\"button\"\n class=\"w-full\"\n :is-active=\"props.item.active\"\n >\n <Icon v-if=\"props.item.icon\" :name=\"props.item.icon\" />\n <NavLabel :text=\"props.item.label\" :html=\"props.item.labelHtml\" />\n <Badge\n v-if=\"hasBadge\"\n variant=\"outline\"\n :class=\"badgeClass\"\n :title=\"props.item.badgeTooltip\"\n >{{ props.item.badge }}</Badge\n >\n <span\n v-else-if=\"props.item.badgePending\"\n data-slot=\"badge\"\n aria-busy=\"true\"\n :aria-label=\"t('loading', {}, 'Loading')\"\n class=\"bg-muted-foreground/20 ms-auto inline-block h-4 w-5 animate-pulse rounded-md\"\n />\n <ChevronRightIcon\n class=\"ms-auto transition-transform duration-200 group-data-[state=open]/nav-sub:rotate-90 rtl:rotate-180 rtl:group-data-[state=open]/nav-sub:rotate-90\"\n />\n </SidebarMenuSubButton>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <SidebarMenuSub>\n <NavSubItem\n v-for=\"child in props.item.children\"\n :key=\"child.url ?? child.label\"\n :item=\"child\"\n />\n </SidebarMenuSub>\n </CollapsibleContent>\n </Collapsible>\n <SidebarMenuSubButton v-else as-child :is-active=\"props.item.active\">\n <a\n v-if=\"props.item.openInNewTab\"\n v-bind=\"props.item.extraAttributes ?? {}\"\n :href=\"props.item.url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <Icon v-if=\"props.item.icon\" :name=\"props.item.icon\" />\n <NavLabel :text=\"props.item.label\" :html=\"props.item.labelHtml\" />\n <NewTabHint />\n <Badge\n v-if=\"hasBadge\"\n variant=\"outline\"\n :class=\"badgeClass\"\n :title=\"props.item.badgeTooltip\"\n >{{ props.item.badge }}</Badge\n >\n <span\n v-else-if=\"props.item.badgePending\"\n data-slot=\"badge\"\n aria-busy=\"true\"\n :aria-label=\"t('loading', {}, 'Loading')\"\n class=\"bg-muted-foreground/20 ms-auto inline-block h-4 w-5 animate-pulse rounded-md\"\n />\n </a>\n <Link\n v-else\n v-bind=\"props.item.extraAttributes ?? {}\"\n :href=\"props.item.url ?? '#'\"\n prefetch\n :cache-for=\"PREFETCH_CACHE_FOR\"\n >\n <Icon v-if=\"props.item.icon\" :name=\"props.item.icon\" />\n <NavLabel :text=\"props.item.label\" :html=\"props.item.labelHtml\" />\n <Badge\n v-if=\"hasBadge\"\n variant=\"outline\"\n :class=\"badgeClass\"\n :title=\"props.item.badgeTooltip\"\n >{{ props.item.badge }}</Badge\n >\n <span\n v-else-if=\"props.item.badgePending\"\n data-slot=\"badge\"\n aria-busy=\"true\"\n :aria-label=\"t('loading', {}, 'Loading')\"\n class=\"bg-muted-foreground/20 ms-auto inline-block h-4 w-5 animate-pulse rounded-md\"\n />\n </Link>\n </SidebarMenuSubButton>\n </SidebarMenuSubItem>\n</template>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"NavSubItem.vue.d.ts","sourceRoot":"","sources":["../../../src/components/panel/NavSubItem.vue"],"names":[],"mappings":"AA8HA,OAAO,EAAsB,KAAK,oBAAoB,EAAE,MAAM,eAAe,CAAA;AAmB7E,oFAAoF;AACpF,KAAK,WAAW,GAAG;IAAE,IAAI,EAAE,oBAAoB,CAAA;CAAE,CAAC;;AAkWlD,wBAMG"}
1
+ {"version":3,"file":"NavSubItem.vue.d.ts","sourceRoot":"","sources":["../../../src/components/panel/NavSubItem.vue"],"names":[],"mappings":"AAkIA,OAAO,EAAsB,KAAK,oBAAoB,EAAE,MAAM,eAAe,CAAA;AAmB7E,oFAAoF;AACpF,KAAK,WAAW,GAAG;IAAE,IAAI,EAAE,oBAAoB,CAAA;CAAE,CAAC;;AAkWlD,wBAMG"}
@@ -67,7 +67,7 @@ var N = ["aria-label"], P = ["href"], F = ["aria-label"], I = ["aria-label"], L
67
67
  }), C(l, null, {
68
68
  default: j(() => [C(d, null, {
69
69
  default: j(() => [(D(!0), x(_, null, O(L.item.children, (e) => (D(), y(m, {
70
- key: e.label,
70
+ key: e.url ?? e.label,
71
71
  item: e
72
72
  }, null, 8, ["item"]))), 128))]),
73
73
  _: 1
@@ -1 +1 @@
1
- {"version":3,"file":"NavSubItem.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","SidebarMenuSubItem","_withCtx","Collapsible","_createVNode","CollapsibleTrigger","SidebarMenuSubButton","_mergeProps","_unref","Icon","_createCommentVNode","NavLabel","Badge","_normalizeClass","_createTextVNode","_toDisplayString","_createElementBlock","CollapsibleContent","SidebarMenuSub","_Fragment","_renderList","NavSubItem","NewTabHint","Icon_default","Badge_default","NewTabHint_default","NavLabel_default","Collapsible_default","CollapsibleContent_default","CollapsibleTrigger_default","SidebarMenuSub_default","SidebarMenuSubButton_default","SidebarMenuSubItem_default","NavSubItem_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","NavSubItem_vue_vue_type_script_setup_true_lang_default","props","__props","t","useT","hasBadge","computed","badgeClass","cn","colorClass","badgeColorClasses","openBlock","createBlock","withCtx","createVNode","mergeProps","unref","createCommentVNode","normalizeClass","createTextVNode","toDisplayString","createElementBlock","ChevronRightIcon","Fragment","renderList","child","Link","PREFETCH_CACHE_FOR"],"sources":["../../../src/components/panel/NavSubItem.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { PREFETCH_CACHE_FOR, type NavigationItemSchema } from '@alfakit/core'\nimport { Link } from '@inertiajs/vue3'\nimport { ChevronRightIcon } from '@lucide/vue'\nimport { computed } from 'vue'\nimport { badgeColorClasses, colorClass } from '../../lib/colors'\nimport { Icon } from '../../lib/icons'\nimport { cn } from '../../lib/utils'\nimport Badge from '../ui/Badge.vue'\nimport Collapsible from '../ui/Collapsible.vue'\nimport CollapsibleContent from '../ui/CollapsibleContent.vue'\nimport CollapsibleTrigger from '../ui/CollapsibleTrigger.vue'\nimport SidebarMenuSub from '../ui/SidebarMenuSub.vue'\nimport SidebarMenuSubButton from '../ui/SidebarMenuSubButton.vue'\nimport SidebarMenuSubItem from '../ui/SidebarMenuSubItem.vue'\nimport NavSubItem from './NavSubItem.vue'\nimport NewTabHint from '../../lib/NewTabHint.vue'\nimport NavLabel from './NavLabel.vue'\nimport { useT } from '../../context'\n\n/** A child navigation item (any depth): badge, new-tab link and nested children. */\nconst props = defineProps<{ item: NavigationItemSchema }>()\nconst t = useT()\nconst hasBadge = computed(() => props.item.badge !== undefined && props.item.badge !== null)\nconst badgeClass = computed(() =>\n cn('ms-auto px-1.5 py-0', colorClass(badgeColorClasses, props.item.badgeColor, 'gray')),\n)\n</script>\n\n<template>\n <SidebarMenuSubItem>\n <Collapsible\n v-if=\"props.item.children && props.item.children.length > 0\"\n :default-open=\"props.item.active\"\n class=\"group/nav-sub\"\n >\n <CollapsibleTrigger as-child>\n <SidebarMenuSubButton\n v-bind=\"props.item.extraAttributes ?? {}\"\n as=\"button\"\n type=\"button\"\n class=\"w-full\"\n :is-active=\"props.item.active\"\n >\n <Icon v-if=\"props.item.icon\" :name=\"props.item.icon\" />\n <NavLabel :text=\"props.item.label\" :html=\"props.item.labelHtml\" />\n <Badge\n v-if=\"hasBadge\"\n variant=\"outline\"\n :class=\"badgeClass\"\n :title=\"props.item.badgeTooltip\"\n >{{ props.item.badge }}</Badge\n >\n <span\n v-else-if=\"props.item.badgePending\"\n data-slot=\"badge\"\n aria-busy=\"true\"\n :aria-label=\"t('loading', {}, 'Loading')\"\n class=\"bg-muted-foreground/20 ms-auto inline-block h-4 w-5 animate-pulse rounded-md\"\n />\n <ChevronRightIcon\n class=\"ms-auto transition-transform duration-200 group-data-[state=open]/nav-sub:rotate-90 rtl:rotate-180 rtl:group-data-[state=open]/nav-sub:rotate-90\"\n />\n </SidebarMenuSubButton>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <SidebarMenuSub>\n <NavSubItem v-for=\"child in props.item.children\" :key=\"child.label\" :item=\"child\" />\n </SidebarMenuSub>\n </CollapsibleContent>\n </Collapsible>\n <SidebarMenuSubButton v-else as-child :is-active=\"props.item.active\">\n <a\n v-if=\"props.item.openInNewTab\"\n v-bind=\"props.item.extraAttributes ?? {}\"\n :href=\"props.item.url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <Icon v-if=\"props.item.icon\" :name=\"props.item.icon\" />\n <NavLabel :text=\"props.item.label\" :html=\"props.item.labelHtml\" />\n <NewTabHint />\n <Badge\n v-if=\"hasBadge\"\n variant=\"outline\"\n :class=\"badgeClass\"\n :title=\"props.item.badgeTooltip\"\n >{{ props.item.badge }}</Badge\n >\n <span\n v-else-if=\"props.item.badgePending\"\n data-slot=\"badge\"\n aria-busy=\"true\"\n :aria-label=\"t('loading', {}, 'Loading')\"\n class=\"bg-muted-foreground/20 ms-auto inline-block h-4 w-5 animate-pulse rounded-md\"\n />\n </a>\n <Link\n v-else\n v-bind=\"props.item.extraAttributes ?? {}\"\n :href=\"props.item.url ?? '#'\"\n prefetch\n :cache-for=\"PREFETCH_CACHE_FOR\"\n >\n <Icon v-if=\"props.item.icon\" :name=\"props.item.icon\" />\n <NavLabel :text=\"props.item.label\" :html=\"props.item.labelHtml\" />\n <Badge\n v-if=\"hasBadge\"\n variant=\"outline\"\n :class=\"badgeClass\"\n :title=\"props.item.badgeTooltip\"\n >{{ props.item.badge }}</Badge\n >\n <span\n v-else-if=\"props.item.badgePending\"\n data-slot=\"badge\"\n aria-busy=\"true\"\n :aria-label=\"t('loading', {}, 'Loading')\"\n class=\"bg-muted-foreground/20 ms-auto inline-block h-4 w-5 animate-pulse rounded-md\"\n />\n </Link>\n </SidebarMenuSubButton>\n </SidebarMenuSubItem>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"NavSubItem.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","SidebarMenuSubItem","_withCtx","Collapsible","_createVNode","CollapsibleTrigger","SidebarMenuSubButton","_mergeProps","_unref","Icon","_createCommentVNode","NavLabel","Badge","_normalizeClass","_createTextVNode","_toDisplayString","_createElementBlock","CollapsibleContent","SidebarMenuSub","_Fragment","_renderList","NavSubItem","NewTabHint","Icon_default","Badge_default","NewTabHint_default","NavLabel_default","Collapsible_default","CollapsibleContent_default","CollapsibleTrigger_default","SidebarMenuSub_default","SidebarMenuSubButton_default","SidebarMenuSubItem_default","NavSubItem_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","NavSubItem_vue_vue_type_script_setup_true_lang_default","props","__props","t","useT","hasBadge","computed","badgeClass","cn","colorClass","badgeColorClasses","openBlock","createBlock","withCtx","createVNode","mergeProps","unref","createCommentVNode","normalizeClass","createTextVNode","toDisplayString","createElementBlock","ChevronRightIcon","Fragment","renderList","child","Link","PREFETCH_CACHE_FOR"],"sources":["../../../src/components/panel/NavSubItem.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { PREFETCH_CACHE_FOR, type NavigationItemSchema } from '@alfakit/core'\nimport { Link } from '@inertiajs/vue3'\nimport { ChevronRightIcon } from '@lucide/vue'\nimport { computed } from 'vue'\nimport { badgeColorClasses, colorClass } from '../../lib/colors'\nimport { Icon } from '../../lib/icons'\nimport { cn } from '../../lib/utils'\nimport Badge from '../ui/Badge.vue'\nimport Collapsible from '../ui/Collapsible.vue'\nimport CollapsibleContent from '../ui/CollapsibleContent.vue'\nimport CollapsibleTrigger from '../ui/CollapsibleTrigger.vue'\nimport SidebarMenuSub from '../ui/SidebarMenuSub.vue'\nimport SidebarMenuSubButton from '../ui/SidebarMenuSubButton.vue'\nimport SidebarMenuSubItem from '../ui/SidebarMenuSubItem.vue'\nimport NavSubItem from './NavSubItem.vue'\nimport NewTabHint from '../../lib/NewTabHint.vue'\nimport NavLabel from './NavLabel.vue'\nimport { useT } from '../../context'\n\n/** A child navigation item (any depth): badge, new-tab link and nested children. */\nconst props = defineProps<{ item: NavigationItemSchema }>()\nconst t = useT()\nconst hasBadge = computed(() => props.item.badge !== undefined && props.item.badge !== null)\nconst badgeClass = computed(() =>\n cn('ms-auto px-1.5 py-0', colorClass(badgeColorClasses, props.item.badgeColor, 'gray')),\n)\n</script>\n\n<template>\n <SidebarMenuSubItem>\n <Collapsible\n v-if=\"props.item.children && props.item.children.length > 0\"\n :default-open=\"props.item.active\"\n class=\"group/nav-sub\"\n >\n <CollapsibleTrigger as-child>\n <SidebarMenuSubButton\n v-bind=\"props.item.extraAttributes ?? {}\"\n as=\"button\"\n type=\"button\"\n class=\"w-full\"\n :is-active=\"props.item.active\"\n >\n <Icon v-if=\"props.item.icon\" :name=\"props.item.icon\" />\n <NavLabel :text=\"props.item.label\" :html=\"props.item.labelHtml\" />\n <Badge\n v-if=\"hasBadge\"\n variant=\"outline\"\n :class=\"badgeClass\"\n :title=\"props.item.badgeTooltip\"\n >{{ props.item.badge }}</Badge\n >\n <span\n v-else-if=\"props.item.badgePending\"\n data-slot=\"badge\"\n aria-busy=\"true\"\n :aria-label=\"t('loading', {}, 'Loading')\"\n class=\"bg-muted-foreground/20 ms-auto inline-block h-4 w-5 animate-pulse rounded-md\"\n />\n <ChevronRightIcon\n class=\"ms-auto transition-transform duration-200 group-data-[state=open]/nav-sub:rotate-90 rtl:rotate-180 rtl:group-data-[state=open]/nav-sub:rotate-90\"\n />\n </SidebarMenuSubButton>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <SidebarMenuSub>\n <NavSubItem\n v-for=\"child in props.item.children\"\n :key=\"child.url ?? child.label\"\n :item=\"child\"\n />\n </SidebarMenuSub>\n </CollapsibleContent>\n </Collapsible>\n <SidebarMenuSubButton v-else as-child :is-active=\"props.item.active\">\n <a\n v-if=\"props.item.openInNewTab\"\n v-bind=\"props.item.extraAttributes ?? {}\"\n :href=\"props.item.url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <Icon v-if=\"props.item.icon\" :name=\"props.item.icon\" />\n <NavLabel :text=\"props.item.label\" :html=\"props.item.labelHtml\" />\n <NewTabHint />\n <Badge\n v-if=\"hasBadge\"\n variant=\"outline\"\n :class=\"badgeClass\"\n :title=\"props.item.badgeTooltip\"\n >{{ props.item.badge }}</Badge\n >\n <span\n v-else-if=\"props.item.badgePending\"\n data-slot=\"badge\"\n aria-busy=\"true\"\n :aria-label=\"t('loading', {}, 'Loading')\"\n class=\"bg-muted-foreground/20 ms-auto inline-block h-4 w-5 animate-pulse rounded-md\"\n />\n </a>\n <Link\n v-else\n v-bind=\"props.item.extraAttributes ?? {}\"\n :href=\"props.item.url ?? '#'\"\n prefetch\n :cache-for=\"PREFETCH_CACHE_FOR\"\n >\n <Icon v-if=\"props.item.icon\" :name=\"props.item.icon\" />\n <NavLabel :text=\"props.item.label\" :html=\"props.item.labelHtml\" />\n <Badge\n v-if=\"hasBadge\"\n variant=\"outline\"\n :class=\"badgeClass\"\n :title=\"props.item.badgeTooltip\"\n >{{ props.item.badge }}</Badge\n >\n <span\n v-else-if=\"props.item.badgePending\"\n data-slot=\"badge\"\n aria-busy=\"true\"\n :aria-label=\"t('loading', {}, 'Loading')\"\n class=\"bg-muted-foreground/20 ms-auto inline-block h-4 w-5 animate-pulse rounded-md\"\n />\n </Link>\n </SidebarMenuSubButton>\n </SidebarMenuSubItem>\n</template>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TooltipTrigger.js","names":["_sfc_main","TooltipTrigger_vue_vue_type_script_setup_true_lang_default","TooltipTrigger_default"],"sources":["../../../src/components/ui/TooltipTrigger.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { TooltipTrigger, type TooltipTriggerProps } from 'reka-ui'\n\nconst props = defineProps<TooltipTriggerProps>()\n</script>\n\n<template>\n <TooltipTrigger v-bind=\"props\" data-slot=\"tooltip-trigger\">\n <slot />\n </TooltipTrigger>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"TooltipTrigger.js","names":["_sfc_main","TooltipTrigger_vue_vue_type_script_setup_true_lang_default","TooltipTrigger_default"],"sources":["../../../src/components/ui/TooltipTrigger.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { TooltipTrigger, type TooltipTriggerProps } from 'reka-ui'\n\nconst props = defineProps<TooltipTriggerProps>()\n</script>\n\n<template>\n <!-- With as-child the child keeps its own data-slot (an action's `button`). -->\n <TooltipTrigger\n v-bind=\"{ ...(props.asChild ? {} : { 'data-slot': 'tooltip-trigger' }), ...props }\"\n >\n <slot />\n </TooltipTrigger>\n</template>\n"],"mappings":""}