@alfakit/vue 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/components/actions/ActionButton.js.map +1 -1
  3. package/dist/components/actions/ActionButton.vue.d.ts.map +1 -1
  4. package/dist/components/actions/ActionButton.vue_vue_type_script_setup_true_lang.js +160 -159
  5. package/dist/components/actions/ActionButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  6. package/dist/components/actions/ActionModal.js.map +1 -1
  7. package/dist/components/actions/ActionModal.vue.d.ts.map +1 -1
  8. package/dist/components/actions/ActionModal.vue_vue_type_script_setup_true_lang.js +214 -214
  9. package/dist/components/actions/ActionModal.vue_vue_type_script_setup_true_lang.js.map +1 -1
  10. package/dist/components/cms/CmsLinkButton.vue.d.ts +1 -1
  11. package/dist/components/fields/ColorPickerField.js.map +1 -1
  12. package/dist/components/fields/ColorPickerField.vue.d.ts.map +1 -1
  13. package/dist/components/fields/ColorPickerField.vue_vue_type_script_setup_true_lang.js +1 -0
  14. package/dist/components/fields/ColorPickerField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  15. package/dist/components/fields/ComboboxSelect.js.map +1 -1
  16. package/dist/components/fields/ComboboxSelect.vue.d.ts.map +1 -1
  17. package/dist/components/fields/ComboboxSelect.vue_vue_type_script_setup_true_lang.js +1 -1
  18. package/dist/components/fields/ComboboxSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  19. package/dist/components/fields/FileUploadField.js.map +1 -1
  20. package/dist/components/fields/FileUploadField.vue.d.ts.map +1 -1
  21. package/dist/components/fields/FileUploadField.vue_vue_type_script_setup_true_lang.js +183 -183
  22. package/dist/components/fields/FileUploadField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  23. package/dist/components/fields/OneTimeCodeInputField.js.map +1 -1
  24. package/dist/components/fields/OneTimeCodeInputField.vue_vue_type_script_setup_true_lang.js +1 -2
  25. package/dist/components/fields/OneTimeCodeInputField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  26. package/dist/components/fields/SelectField.js.map +1 -1
  27. package/dist/components/fields/SelectField.vue.d.ts.map +1 -1
  28. package/dist/components/fields/SelectField.vue_vue_type_script_setup_true_lang.js +2 -2
  29. package/dist/components/fields/SelectField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  30. package/dist/components/fields/TableColumnHeaders.js.map +1 -1
  31. package/dist/components/fields/TableColumnHeaders.vue.d.ts.map +1 -1
  32. package/dist/components/fields/TableColumnHeaders.vue_vue_type_script_setup_true_lang.js +6 -3
  33. package/dist/components/fields/TableColumnHeaders.vue_vue_type_script_setup_true_lang.js.map +1 -1
  34. package/dist/components/file-manager/FileManagerView.js.map +1 -1
  35. package/dist/components/file-manager/FileManagerView.vue_vue_type_script_setup_true_lang.js +1 -1
  36. package/dist/components/file-manager/FileManagerView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  37. package/dist/components/form/FormBlock.js.map +1 -1
  38. package/dist/components/form/FormBlock.vue.d.ts.map +1 -1
  39. package/dist/components/form/FormBlock.vue_vue_type_script_setup_true_lang.js +81 -77
  40. package/dist/components/form/FormBlock.vue_vue_type_script_setup_true_lang.js.map +1 -1
  41. package/dist/components/form/form-context.js +25 -25
  42. package/dist/components/form/form-context.js.map +1 -1
  43. package/dist/components/layout/FusedGroupComponent.js.map +1 -1
  44. package/dist/components/layout/FusedGroupComponent.vue.d.ts.map +1 -1
  45. package/dist/components/layout/FusedGroupComponent.vue_vue_type_script_setup_true_lang.js +1 -0
  46. package/dist/components/layout/FusedGroupComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  47. package/dist/components/layout/TabsComponent.js.map +1 -1
  48. package/dist/components/layout/TabsComponent.vue.d.ts.map +1 -1
  49. package/dist/components/layout/TabsComponent.vue_vue_type_script_setup_true_lang.js +76 -55
  50. package/dist/components/layout/TabsComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  51. package/dist/components/notifications/NotificationsMenu.js.map +1 -1
  52. package/dist/components/notifications/NotificationsMenu.vue.d.ts.map +1 -1
  53. package/dist/components/notifications/NotificationsMenu.vue_vue_type_script_setup_true_lang.js +44 -42
  54. package/dist/components/notifications/NotificationsMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  55. package/dist/components/panel/GlobalSearch.js.map +1 -1
  56. package/dist/components/panel/GlobalSearch.vue.d.ts.map +1 -1
  57. package/dist/components/panel/GlobalSearch.vue_vue_type_script_setup_true_lang.js +1 -0
  58. package/dist/components/panel/GlobalSearch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  59. package/dist/components/panel/ShortcutKeys.js.map +1 -1
  60. package/dist/components/panel/ShortcutKeys.vue.d.ts.map +1 -1
  61. package/dist/components/panel/ShortcutKeys.vue_vue_type_script_setup_true_lang.js +4 -1
  62. package/dist/components/panel/ShortcutKeys.vue_vue_type_script_setup_true_lang.js.map +1 -1
  63. package/dist/components/panel/TenantMenu.js.map +1 -1
  64. package/dist/components/panel/TenantMenu.vue_vue_type_script_setup_true_lang.js +2 -2
  65. package/dist/components/panel/TenantMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  66. package/dist/components/table/GroupHeaderRow.js.map +1 -1
  67. package/dist/components/table/GroupHeaderRow.vue.d.ts.map +1 -1
  68. package/dist/components/table/GroupHeaderRow.vue_vue_type_script_setup_true_lang.js +55 -34
  69. package/dist/components/table/GroupHeaderRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
  70. package/dist/components/table/SelectCell.js.map +1 -1
  71. package/dist/components/table/SelectCell.vue.d.ts.map +1 -1
  72. package/dist/components/table/SelectCell.vue_vue_type_script_setup_true_lang.js +24 -19
  73. package/dist/components/table/SelectCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
  74. package/dist/components/table/TextInputCell.js.map +1 -1
  75. package/dist/components/table/TextInputCell.vue.d.ts.map +1 -1
  76. package/dist/components/table/TextInputCell.vue_vue_type_script_setup_true_lang.js +38 -33
  77. package/dist/components/table/TextInputCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
  78. package/dist/components.css +347 -0
  79. package/dist/eject-manifest.json +2 -2
  80. package/dist/lib/Icon.js.map +1 -1
  81. package/dist/lib/Icon.vue.d.ts.map +1 -1
  82. package/dist/lib/Icon.vue_vue_type_script_setup_true_lang.js +18 -19
  83. package/dist/lib/Icon.vue_vue_type_script_setup_true_lang.js.map +1 -1
  84. package/dist/lib/hydration.d.ts +9 -0
  85. package/dist/lib/hydration.d.ts.map +1 -0
  86. package/dist/lib/hydration.js +17 -0
  87. package/dist/lib/hydration.js.map +1 -0
  88. package/dist/lib/icons.d.ts +3 -5
  89. package/dist/lib/icons.d.ts.map +1 -1
  90. package/dist/lib/icons.js +19 -22
  91. package/dist/lib/icons.js.map +1 -1
  92. package/dist/lib/lazy.d.ts +1 -1
  93. package/dist/lib/lazy.d.ts.map +1 -1
  94. package/dist/lib/lazy.js +12 -11
  95. package/dist/lib/lazy.js.map +1 -1
  96. package/dist/standalone/AlfakitToaster.js.map +1 -1
  97. package/dist/standalone/AlfakitToaster.vue.d.ts.map +1 -1
  98. package/dist/standalone/AlfakitToaster.vue_vue_type_script_setup_true_lang.js +23 -15
  99. package/dist/standalone/AlfakitToaster.vue_vue_type_script_setup_true_lang.js.map +1 -1
  100. package/dist/standalone.css +47 -0
  101. package/dist/starter-kit/widgets/SearchTrigger.js.map +1 -1
  102. package/dist/starter-kit/widgets/SearchTrigger.vue.d.ts.map +1 -1
  103. package/dist/starter-kit/widgets/SearchTrigger.vue_vue_type_script_setup_true_lang.js +1 -0
  104. package/dist/starter-kit/widgets/SearchTrigger.vue_vue_type_script_setup_true_lang.js.map +1 -1
  105. package/dist/starter-kit/widgets/TenantChooser.js.map +1 -1
  106. package/dist/starter-kit/widgets/TenantChooser.vue_vue_type_script_setup_true_lang.js +1 -1
  107. package/dist/starter-kit/widgets/TenantChooser.vue_vue_type_script_setup_true_lang.js.map +1 -1
  108. package/dist/themes.css +2 -334
  109. package/package.json +3 -3
  110. package/src/components/actions/ActionButton.vue +14 -6
  111. package/src/components/actions/ActionModal.vue +3 -1
  112. package/src/components/fields/ColorPickerField.vue +1 -0
  113. package/src/components/fields/ComboboxSelect.vue +1 -1
  114. package/src/components/fields/FileUploadField.vue +14 -11
  115. package/src/components/fields/OneTimeCodeInputField.vue +1 -1
  116. package/src/components/fields/SelectField.vue +4 -2
  117. package/src/components/fields/TableColumnHeaders.vue +6 -1
  118. package/src/components/file-manager/FileManagerView.vue +1 -1
  119. package/src/components/form/FormBlock.vue +24 -0
  120. package/src/components/form/form-context.ts +2 -2
  121. package/src/components/layout/FusedGroupComponent.vue +1 -0
  122. package/src/components/layout/TabsComponent.vue +61 -5
  123. package/src/components/notifications/NotificationsMenu.vue +11 -0
  124. package/src/components/panel/GlobalSearch.vue +1 -0
  125. package/src/components/panel/ShortcutKeys.vue +1 -0
  126. package/src/components/panel/TenantMenu.vue +2 -2
  127. package/src/components/table/GroupHeaderRow.vue +27 -0
  128. package/src/components/table/SelectCell.vue +5 -2
  129. package/src/components/table/TextInputCell.vue +11 -5
  130. package/src/lib/Icon.vue +6 -5
  131. package/src/lib/hydration.ts +35 -0
  132. package/src/lib/icons.ts +6 -11
  133. package/src/lib/lazy.ts +5 -6
  134. package/src/standalone/AlfakitToaster.vue +12 -2
  135. package/src/starter-kit/widgets/SearchTrigger.vue +1 -0
  136. package/src/starter-kit/widgets/TenantChooser.vue +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"GlobalSearch.js","names":["_sfc_main","GlobalSearch_vue_vue_type_script_setup_true_lang_default","GlobalSearch_default"],"sources":["../../../src/components/panel/GlobalSearch.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { formatKeyBinding, globalSearchSuffix, SHORTCUT_IDS, shortcuts } from '@alfakit/core'\nimport { router } from '@inertiajs/vue3'\nimport { SearchIcon } from '@lucide/vue'\nimport { computed, onBeforeUnmount, onMounted, ref, shallowRef, watch, type Component } from 'vue'\nimport { useHydrated } from '../../composables/use-hydrated'\nimport { usePanel, useT } from '../../context'\nimport Button from '../ui/Button.vue'\nimport Slot from './Slot.vue'\nimport { Icon } from '../../lib/icons'\nimport { globalSearchPalette } from './lazy-chrome'\n\n/**\n * The search field and its command palette (`GlobalSearchPalette`, loaded on first open):\n * global search results plus (with `alfakit.commandPalette`) the page's header actions,\n * panel commands, navigation, \"create\" links, recent records, theme switching and the\n * shortcuts overlay. `variant=\"sidebar\"`: the full-width field in the sidebar header\n * (`globalSearch(position: Sidebar)`).\n */\nconst props = withDefaults(defineProps<{ variant?: 'topbar' | 'sidebar' }>(), { variant: 'topbar' })\n\nconst t = useT()\nconst panel = usePanel()\n// The shortcut hint depends on the visitor's platform (⌘ or Ctrl): rendered after hydration.\nconst hydrated = useHydrated()\nconst open = ref(false)\n// Null on the server and during hydration (nothing loads there), so the markup matches.\nconst Palette = shallowRef<Component | null>(globalSearchPalette.current)\nconst config = computed(() => panel.value.globalSearch)\nconst palette = computed(() => panel.value.commandPalette)\nconst endpoint = computed(() => (config.value ? panel.value.endpoints.globalSearch : undefined))\nconst placeholder = computed(\n () =>\n config.value?.placeholder ??\n palette.value?.placeholder ??\n t('palette.placeholder', {}, 'Type a command or search…'),\n)\n// `globalSearchFieldSuffix()`, or the first key binding (default); ⌘K / Ctrl+K without global search.\nconst suffix = computed(() =>\n globalSearchSuffix(\n config.value ??\n (palette.value ? { keyBindings: ['mod+k'], placeholder: placeholder.value } : undefined),\n ),\n)\nconst keys = computed(() =>\n config.value || palette.value ? JSON.stringify(config.value?.keyBindings ?? ['mod+k']) : '',\n)\n\n// The palette's key bindings: essential, so they keep working with `keyboardShortcuts(false)`.\nwatch(\n keys,\n (value, _old, onCleanup) => {\n // Never during a server render: the registry is shared by every request there.\n if (!value || typeof window === 'undefined') return\n\n onCleanup(\n shortcuts.register({\n id: SHORTCUT_IDS.palette,\n keys: JSON.parse(value) as string[],\n label: t('shortcuts.open_palette', {}, 'Open the command palette'),\n group: 'general',\n essential: true,\n handler: () => {\n open.value = true\n },\n }),\n )\n },\n { immediate: true },\n)\n\n// Opening before the code has arrived (a click or `mod+k` right after the page loads)\n// keeps `open` set; the palette 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 (globalSearchPalette.current) {\n Palette.value = globalSearchPalette.current\n\n return\n }\n\n let active = true\n onCleanup(() => {\n active = false\n })\n\n globalSearchPalette.load().then(\n (component) => {\n if (active) Palette.value = component\n },\n () => {\n if (active) open.value = false\n },\n )\n})\n\nconst preload = () => void globalSearchPalette.load().catch(() => undefined)\n\n// A palette opened while its code was still loading closes when the page changes.\nlet stopListening: (() => void) | undefined\n\nonMounted(() => {\n stopListening = router.on('navigate', () => {\n open.value = false\n })\n})\n\nonBeforeUnmount(() => stopListening?.())\n</script>\n\n<template>\n <template v-if=\"(config && endpoint) || palette\">\n <Slot name=\"global-search.before\" />\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n :data-variant=\"props.variant\"\n :class=\"\n props.variant === 'sidebar'\n ? 'text-muted-foreground w-full justify-start gap-2 px-2.5 font-normal group-data-[collapsible=icon]:size-8 group-data-[collapsible=icon]:justify-center group-data-[collapsible=icon]:px-0'\n : 'text-muted-foreground size-8 justify-center gap-2 px-0 font-normal sm:w-56 sm:justify-start sm:px-2.5'\n \"\n @click=\"open = true\"\n @pointerenter=\"preload\"\n @focus=\"preload\"\n >\n <Icon name=\"alfakit::panels.global-search.field\" :fallback=\"SearchIcon\" class=\"size-4\" />\n <span\n :class=\"\n props.variant === 'sidebar'\n ? 'flex-1 truncate text-start group-data-[collapsible=icon]:sr-only'\n : 'sr-only sm:not-sr-only sm:flex-1 sm:text-start'\n \"\n >{{ placeholder }}</span\n >\n <span\n v-if=\"suffix?.type === 'text'\"\n data-slot=\"global-search-suffix\"\n class=\"text-muted-foreground hidden text-[10px] sm:inline\"\n >{{ suffix.text }}</span\n >\n <kbd\n v-if=\"hydrated && suffix?.type === 'keyBinding'\"\n class=\"bg-muted hidden rounded px-1 font-mono text-[10px] sm:inline\"\n >{{ formatKeyBinding(suffix.keyBinding) }}</kbd\n >\n </Button>\n <Slot name=\"global-search.after\" />\n <!-- The dialog's code loads on first open (click or shortcut); hovering or focusing the\n field fetches it ahead. Not rendered on the server, like the closed dialog before it. -->\n <component :is=\"Palette\" v-if=\"Palette\" v-model:open=\"open\" />\n </template>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"GlobalSearch.js","names":["_sfc_main","GlobalSearch_vue_vue_type_script_setup_true_lang_default","GlobalSearch_default"],"sources":["../../../src/components/panel/GlobalSearch.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { formatKeyBinding, globalSearchSuffix, SHORTCUT_IDS, shortcuts } from '@alfakit/core'\nimport { router } from '@inertiajs/vue3'\nimport { SearchIcon } from '@lucide/vue'\nimport { computed, onBeforeUnmount, onMounted, ref, shallowRef, watch, type Component } from 'vue'\nimport { useHydrated } from '../../composables/use-hydrated'\nimport { usePanel, useT } from '../../context'\nimport Button from '../ui/Button.vue'\nimport Slot from './Slot.vue'\nimport { Icon } from '../../lib/icons'\nimport { globalSearchPalette } from './lazy-chrome'\n\n/**\n * The search field and its command palette (`GlobalSearchPalette`, loaded on first open):\n * global search results plus (with `alfakit.commandPalette`) the page's header actions,\n * panel commands, navigation, \"create\" links, recent records, theme switching and the\n * shortcuts overlay. `variant=\"sidebar\"`: the full-width field in the sidebar header\n * (`globalSearch(position: Sidebar)`).\n */\nconst props = withDefaults(defineProps<{ variant?: 'topbar' | 'sidebar' }>(), { variant: 'topbar' })\n\nconst t = useT()\nconst panel = usePanel()\n// The shortcut hint depends on the visitor's platform (⌘ or Ctrl): rendered after hydration.\nconst hydrated = useHydrated()\nconst open = ref(false)\n// Null on the server and during hydration (nothing loads there), so the markup matches.\nconst Palette = shallowRef<Component | null>(globalSearchPalette.current)\nconst config = computed(() => panel.value.globalSearch)\nconst palette = computed(() => panel.value.commandPalette)\nconst endpoint = computed(() => (config.value ? panel.value.endpoints.globalSearch : undefined))\nconst placeholder = computed(\n () =>\n config.value?.placeholder ??\n palette.value?.placeholder ??\n t('palette.placeholder', {}, 'Type a command or search…'),\n)\n// `globalSearchFieldSuffix()`, or the first key binding (default); ⌘K / Ctrl+K without global search.\nconst suffix = computed(() =>\n globalSearchSuffix(\n config.value ??\n (palette.value ? { keyBindings: ['mod+k'], placeholder: placeholder.value } : undefined),\n ),\n)\nconst keys = computed(() =>\n config.value || palette.value ? JSON.stringify(config.value?.keyBindings ?? ['mod+k']) : '',\n)\n\n// The palette's key bindings: essential, so they keep working with `keyboardShortcuts(false)`.\nwatch(\n keys,\n (value, _old, onCleanup) => {\n // Never during a server render: the registry is shared by every request there.\n if (!value || typeof window === 'undefined') return\n\n onCleanup(\n shortcuts.register({\n id: SHORTCUT_IDS.palette,\n keys: JSON.parse(value) as string[],\n label: t('shortcuts.open_palette', {}, 'Open the command palette'),\n group: 'general',\n essential: true,\n handler: () => {\n open.value = true\n },\n }),\n )\n },\n { immediate: true },\n)\n\n// Opening before the code has arrived (a click or `mod+k` right after the page loads)\n// keeps `open` set; the palette 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 (globalSearchPalette.current) {\n Palette.value = globalSearchPalette.current\n\n return\n }\n\n let active = true\n onCleanup(() => {\n active = false\n })\n\n globalSearchPalette.load().then(\n (component) => {\n if (active) Palette.value = component\n },\n () => {\n if (active) open.value = false\n },\n )\n})\n\nconst preload = () => void globalSearchPalette.load().catch(() => undefined)\n\n// A palette opened while its code was still loading closes when the page changes.\nlet stopListening: (() => void) | undefined\n\nonMounted(() => {\n stopListening = router.on('navigate', () => {\n open.value = false\n })\n})\n\nonBeforeUnmount(() => stopListening?.())\n</script>\n\n<template>\n <template v-if=\"(config && endpoint) || palette\">\n <Slot name=\"global-search.before\" />\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n :data-variant=\"props.variant\"\n :class=\"\n props.variant === 'sidebar'\n ? 'text-muted-foreground w-full justify-start gap-2 px-2.5 font-normal group-data-[collapsible=icon]:size-8 group-data-[collapsible=icon]:justify-center group-data-[collapsible=icon]:px-0'\n : 'text-muted-foreground size-8 justify-center gap-2 px-0 font-normal sm:w-56 sm:justify-start sm:px-2.5'\n \"\n @click=\"open = true\"\n @pointerenter=\"preload\"\n @focus=\"preload\"\n >\n <Icon name=\"alfakit::panels.global-search.field\" :fallback=\"SearchIcon\" class=\"size-4\" />\n <span\n :class=\"\n props.variant === 'sidebar'\n ? 'flex-1 truncate text-start group-data-[collapsible=icon]:sr-only'\n : 'sr-only sm:not-sr-only sm:flex-1 sm:text-start'\n \"\n >{{ placeholder }}</span\n >\n <span\n v-if=\"suffix?.type === 'text'\"\n data-slot=\"global-search-suffix\"\n class=\"text-muted-foreground hidden text-[10px] sm:inline\"\n >{{ suffix.text }}</span\n >\n <kbd\n v-if=\"hydrated && suffix?.type === 'keyBinding'\"\n dir=\"ltr\"\n class=\"bg-muted hidden rounded px-1 font-mono text-[10px] sm:inline\"\n >{{ formatKeyBinding(suffix.keyBinding) }}</kbd\n >\n </Button>\n <Slot name=\"global-search.after\" />\n <!-- The dialog's code loads on first open (click or shortcut); hovering or focusing the\n field fetches it ahead. Not rendered on the server, like the closed dialog before it. -->\n <component :is=\"Palette\" v-if=\"Palette\" v-model:open=\"open\" />\n </template>\n</template>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"GlobalSearch.vue.d.ts","sourceRoot":"","sources":["../../../src/components/panel/GlobalSearch.vue"],"names":[],"mappings":"AAyKA;;;;;;GAMG;AACH,KAAK,WAAW,GAAG;IAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;CAAE,CAAC;;aAAvB,QAAQ,GAAG,SAAS;;AA6PnD,wBAOG"}
1
+ {"version":3,"file":"GlobalSearch.vue.d.ts","sourceRoot":"","sources":["../../../src/components/panel/GlobalSearch.vue"],"names":[],"mappings":"AA0KA;;;;;;GAMG;AACH,KAAK,WAAW,GAAG;IAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;CAAE,CAAC;;aAAvB,QAAQ,GAAG,SAAS;;AA8PnD,wBAOG"}
@@ -15,6 +15,7 @@ var M = {
15
15
  class: "text-muted-foreground hidden text-[10px] sm:inline"
16
16
  }, N = {
17
17
  key: 1,
18
+ dir: "ltr",
18
19
  class: "bg-muted hidden rounded px-1 font-mono text-[10px] sm:inline"
19
20
  }, P = /*@__PURE__*/ y({
20
21
  __name: "GlobalSearch",
@@ -1 +1 @@
1
- {"version":3,"file":"GlobalSearch.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_Fragment","_createVNode","Slot","Button","_normalizeClass","_withCtx","_unref","Icon","_createElementVNode","_toDisplayString","_createCommentVNode","_createBlock","_resolveDynamicComponent","Icon_default","Button_default","Slot_default","_hoisted_1","_hoisted_2","GlobalSearch_vue_vue_type_script_setup_true_lang_default","props","__props","t","useT","panel","usePanel","hydrated","useHydrated","open","ref","Palette","shallowRef","globalSearchPalette","config","computed","palette","endpoint","placeholder","suffix","globalSearchSuffix","keys","watch","value","onCleanup","shortcuts","SHORTCUT_IDS","active","component","preload","stopListening","onMounted","router","onBeforeUnmount","openBlock","createElementBlock","Fragment","createVNode","normalizeClass","_cache","withCtx","unref","SearchIcon","createElementVNode","toDisplayString","createCommentVNode","formatKeyBinding","createBlock","resolveDynamicComponent","$event"],"sources":["../../../src/components/panel/GlobalSearch.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { formatKeyBinding, globalSearchSuffix, SHORTCUT_IDS, shortcuts } from '@alfakit/core'\nimport { router } from '@inertiajs/vue3'\nimport { SearchIcon } from '@lucide/vue'\nimport { computed, onBeforeUnmount, onMounted, ref, shallowRef, watch, type Component } from 'vue'\nimport { useHydrated } from '../../composables/use-hydrated'\nimport { usePanel, useT } from '../../context'\nimport Button from '../ui/Button.vue'\nimport Slot from './Slot.vue'\nimport { Icon } from '../../lib/icons'\nimport { globalSearchPalette } from './lazy-chrome'\n\n/**\n * The search field and its command palette (`GlobalSearchPalette`, loaded on first open):\n * global search results plus (with `alfakit.commandPalette`) the page's header actions,\n * panel commands, navigation, \"create\" links, recent records, theme switching and the\n * shortcuts overlay. `variant=\"sidebar\"`: the full-width field in the sidebar header\n * (`globalSearch(position: Sidebar)`).\n */\nconst props = withDefaults(defineProps<{ variant?: 'topbar' | 'sidebar' }>(), { variant: 'topbar' })\n\nconst t = useT()\nconst panel = usePanel()\n// The shortcut hint depends on the visitor's platform (⌘ or Ctrl): rendered after hydration.\nconst hydrated = useHydrated()\nconst open = ref(false)\n// Null on the server and during hydration (nothing loads there), so the markup matches.\nconst Palette = shallowRef<Component | null>(globalSearchPalette.current)\nconst config = computed(() => panel.value.globalSearch)\nconst palette = computed(() => panel.value.commandPalette)\nconst endpoint = computed(() => (config.value ? panel.value.endpoints.globalSearch : undefined))\nconst placeholder = computed(\n () =>\n config.value?.placeholder ??\n palette.value?.placeholder ??\n t('palette.placeholder', {}, 'Type a command or search…'),\n)\n// `globalSearchFieldSuffix()`, or the first key binding (default); ⌘K / Ctrl+K without global search.\nconst suffix = computed(() =>\n globalSearchSuffix(\n config.value ??\n (palette.value ? { keyBindings: ['mod+k'], placeholder: placeholder.value } : undefined),\n ),\n)\nconst keys = computed(() =>\n config.value || palette.value ? JSON.stringify(config.value?.keyBindings ?? ['mod+k']) : '',\n)\n\n// The palette's key bindings: essential, so they keep working with `keyboardShortcuts(false)`.\nwatch(\n keys,\n (value, _old, onCleanup) => {\n // Never during a server render: the registry is shared by every request there.\n if (!value || typeof window === 'undefined') return\n\n onCleanup(\n shortcuts.register({\n id: SHORTCUT_IDS.palette,\n keys: JSON.parse(value) as string[],\n label: t('shortcuts.open_palette', {}, 'Open the command palette'),\n group: 'general',\n essential: true,\n handler: () => {\n open.value = true\n },\n }),\n )\n },\n { immediate: true },\n)\n\n// Opening before the code has arrived (a click or `mod+k` right after the page loads)\n// keeps `open` set; the palette 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 (globalSearchPalette.current) {\n Palette.value = globalSearchPalette.current\n\n return\n }\n\n let active = true\n onCleanup(() => {\n active = false\n })\n\n globalSearchPalette.load().then(\n (component) => {\n if (active) Palette.value = component\n },\n () => {\n if (active) open.value = false\n },\n )\n})\n\nconst preload = () => void globalSearchPalette.load().catch(() => undefined)\n\n// A palette opened while its code was still loading closes when the page changes.\nlet stopListening: (() => void) | undefined\n\nonMounted(() => {\n stopListening = router.on('navigate', () => {\n open.value = false\n })\n})\n\nonBeforeUnmount(() => stopListening?.())\n</script>\n\n<template>\n <template v-if=\"(config && endpoint) || palette\">\n <Slot name=\"global-search.before\" />\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n :data-variant=\"props.variant\"\n :class=\"\n props.variant === 'sidebar'\n ? 'text-muted-foreground w-full justify-start gap-2 px-2.5 font-normal group-data-[collapsible=icon]:size-8 group-data-[collapsible=icon]:justify-center group-data-[collapsible=icon]:px-0'\n : 'text-muted-foreground size-8 justify-center gap-2 px-0 font-normal sm:w-56 sm:justify-start sm:px-2.5'\n \"\n @click=\"open = true\"\n @pointerenter=\"preload\"\n @focus=\"preload\"\n >\n <Icon name=\"alfakit::panels.global-search.field\" :fallback=\"SearchIcon\" class=\"size-4\" />\n <span\n :class=\"\n props.variant === 'sidebar'\n ? 'flex-1 truncate text-start group-data-[collapsible=icon]:sr-only'\n : 'sr-only sm:not-sr-only sm:flex-1 sm:text-start'\n \"\n >{{ placeholder }}</span\n >\n <span\n v-if=\"suffix?.type === 'text'\"\n data-slot=\"global-search-suffix\"\n class=\"text-muted-foreground hidden text-[10px] sm:inline\"\n >{{ suffix.text }}</span\n >\n <kbd\n v-if=\"hydrated && suffix?.type === 'keyBinding'\"\n class=\"bg-muted hidden rounded px-1 font-mono text-[10px] sm:inline\"\n >{{ formatKeyBinding(suffix.keyBinding) }}</kbd\n >\n </Button>\n <Slot name=\"global-search.after\" />\n <!-- The dialog's code loads on first open (click or shortcut); hovering or focusing the\n field fetches it ahead. Not rendered on the server, like the closed dialog before it. -->\n <component :is=\"Palette\" v-if=\"Palette\" v-model:open=\"open\" />\n </template>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"GlobalSearch.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_Fragment","_createVNode","Slot","Button","_normalizeClass","_withCtx","_unref","Icon","_createElementVNode","_toDisplayString","_createCommentVNode","_createBlock","_resolveDynamicComponent","Icon_default","Button_default","Slot_default","_hoisted_1","_hoisted_2","GlobalSearch_vue_vue_type_script_setup_true_lang_default","props","__props","t","useT","panel","usePanel","hydrated","useHydrated","open","ref","Palette","shallowRef","globalSearchPalette","config","computed","palette","endpoint","placeholder","suffix","globalSearchSuffix","keys","watch","value","onCleanup","shortcuts","SHORTCUT_IDS","active","component","preload","stopListening","onMounted","router","onBeforeUnmount","openBlock","createElementBlock","Fragment","createVNode","normalizeClass","_cache","withCtx","unref","SearchIcon","createElementVNode","toDisplayString","createCommentVNode","formatKeyBinding","createBlock","resolveDynamicComponent","$event"],"sources":["../../../src/components/panel/GlobalSearch.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { formatKeyBinding, globalSearchSuffix, SHORTCUT_IDS, shortcuts } from '@alfakit/core'\nimport { router } from '@inertiajs/vue3'\nimport { SearchIcon } from '@lucide/vue'\nimport { computed, onBeforeUnmount, onMounted, ref, shallowRef, watch, type Component } from 'vue'\nimport { useHydrated } from '../../composables/use-hydrated'\nimport { usePanel, useT } from '../../context'\nimport Button from '../ui/Button.vue'\nimport Slot from './Slot.vue'\nimport { Icon } from '../../lib/icons'\nimport { globalSearchPalette } from './lazy-chrome'\n\n/**\n * The search field and its command palette (`GlobalSearchPalette`, loaded on first open):\n * global search results plus (with `alfakit.commandPalette`) the page's header actions,\n * panel commands, navigation, \"create\" links, recent records, theme switching and the\n * shortcuts overlay. `variant=\"sidebar\"`: the full-width field in the sidebar header\n * (`globalSearch(position: Sidebar)`).\n */\nconst props = withDefaults(defineProps<{ variant?: 'topbar' | 'sidebar' }>(), { variant: 'topbar' })\n\nconst t = useT()\nconst panel = usePanel()\n// The shortcut hint depends on the visitor's platform (⌘ or Ctrl): rendered after hydration.\nconst hydrated = useHydrated()\nconst open = ref(false)\n// Null on the server and during hydration (nothing loads there), so the markup matches.\nconst Palette = shallowRef<Component | null>(globalSearchPalette.current)\nconst config = computed(() => panel.value.globalSearch)\nconst palette = computed(() => panel.value.commandPalette)\nconst endpoint = computed(() => (config.value ? panel.value.endpoints.globalSearch : undefined))\nconst placeholder = computed(\n () =>\n config.value?.placeholder ??\n palette.value?.placeholder ??\n t('palette.placeholder', {}, 'Type a command or search…'),\n)\n// `globalSearchFieldSuffix()`, or the first key binding (default); ⌘K / Ctrl+K without global search.\nconst suffix = computed(() =>\n globalSearchSuffix(\n config.value ??\n (palette.value ? { keyBindings: ['mod+k'], placeholder: placeholder.value } : undefined),\n ),\n)\nconst keys = computed(() =>\n config.value || palette.value ? JSON.stringify(config.value?.keyBindings ?? ['mod+k']) : '',\n)\n\n// The palette's key bindings: essential, so they keep working with `keyboardShortcuts(false)`.\nwatch(\n keys,\n (value, _old, onCleanup) => {\n // Never during a server render: the registry is shared by every request there.\n if (!value || typeof window === 'undefined') return\n\n onCleanup(\n shortcuts.register({\n id: SHORTCUT_IDS.palette,\n keys: JSON.parse(value) as string[],\n label: t('shortcuts.open_palette', {}, 'Open the command palette'),\n group: 'general',\n essential: true,\n handler: () => {\n open.value = true\n },\n }),\n )\n },\n { immediate: true },\n)\n\n// Opening before the code has arrived (a click or `mod+k` right after the page loads)\n// keeps `open` set; the palette 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 (globalSearchPalette.current) {\n Palette.value = globalSearchPalette.current\n\n return\n }\n\n let active = true\n onCleanup(() => {\n active = false\n })\n\n globalSearchPalette.load().then(\n (component) => {\n if (active) Palette.value = component\n },\n () => {\n if (active) open.value = false\n },\n )\n})\n\nconst preload = () => void globalSearchPalette.load().catch(() => undefined)\n\n// A palette opened while its code was still loading closes when the page changes.\nlet stopListening: (() => void) | undefined\n\nonMounted(() => {\n stopListening = router.on('navigate', () => {\n open.value = false\n })\n})\n\nonBeforeUnmount(() => stopListening?.())\n</script>\n\n<template>\n <template v-if=\"(config && endpoint) || palette\">\n <Slot name=\"global-search.before\" />\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n :data-variant=\"props.variant\"\n :class=\"\n props.variant === 'sidebar'\n ? 'text-muted-foreground w-full justify-start gap-2 px-2.5 font-normal group-data-[collapsible=icon]:size-8 group-data-[collapsible=icon]:justify-center group-data-[collapsible=icon]:px-0'\n : 'text-muted-foreground size-8 justify-center gap-2 px-0 font-normal sm:w-56 sm:justify-start sm:px-2.5'\n \"\n @click=\"open = true\"\n @pointerenter=\"preload\"\n @focus=\"preload\"\n >\n <Icon name=\"alfakit::panels.global-search.field\" :fallback=\"SearchIcon\" class=\"size-4\" />\n <span\n :class=\"\n props.variant === 'sidebar'\n ? 'flex-1 truncate text-start group-data-[collapsible=icon]:sr-only'\n : 'sr-only sm:not-sr-only sm:flex-1 sm:text-start'\n \"\n >{{ placeholder }}</span\n >\n <span\n v-if=\"suffix?.type === 'text'\"\n data-slot=\"global-search-suffix\"\n class=\"text-muted-foreground hidden text-[10px] sm:inline\"\n >{{ suffix.text }}</span\n >\n <kbd\n v-if=\"hydrated && suffix?.type === 'keyBinding'\"\n dir=\"ltr\"\n class=\"bg-muted hidden rounded px-1 font-mono text-[10px] sm:inline\"\n >{{ formatKeyBinding(suffix.keyBinding) }}</kbd\n >\n </Button>\n <Slot name=\"global-search.after\" />\n <!-- The dialog's code loads on first open (click or shortcut); hovering or focusing the\n field fetches it ahead. Not rendered on the server, like the closed dialog before it. -->\n <component :is=\"Palette\" v-if=\"Palette\" v-model:open=\"open\" />\n </template>\n</template>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ShortcutKeys.js","names":["_sfc_main","ShortcutKeys_vue_vue_type_script_setup_true_lang_default","ShortcutKeys_default"],"sources":["../../../src/components/panel/ShortcutKeys.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { shortcutSteps } from '@alfakit/core'\nimport { computed } from 'vue'\nimport { useHydrated } from '../../composables/use-hydrated'\nimport { useT } from '../../context'\nimport { cn } from '../../lib/utils'\n\n/**\n * A key binding as `<kbd>` keys (`G` then `D`, `⌘K`). The keys depend on the visitor's\n * platform (⌘ or Ctrl), so they render after hydration.\n */\nconst props = defineProps<{ binding: string; class?: string }>()\nconst t = useT()\nconst hydrated = useHydrated()\nconst steps = computed(() => shortcutSteps(props.binding))\n</script>\n\n<template>\n <span\n v-if=\"hydrated\"\n data-slot=\"shortcut-keys\"\n :class=\"cn('inline-flex items-center gap-1', props.class)\"\n >\n <span v-for=\"(step, index) in steps\" :key=\"index\" class=\"inline-flex items-center gap-1\">\n <span v-if=\"index > 0\" class=\"text-muted-foreground text-[10px]\">{{\n t('shortcuts.then', {}, 'then')\n }}</span>\n <kbd\n class=\"bg-muted text-muted-foreground rounded border px-1.5 font-mono text-[10px] leading-5\"\n >{{ step }}</kbd\n >\n </span>\n </span>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"ShortcutKeys.js","names":["_sfc_main","ShortcutKeys_vue_vue_type_script_setup_true_lang_default","ShortcutKeys_default"],"sources":["../../../src/components/panel/ShortcutKeys.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { shortcutSteps } from '@alfakit/core'\nimport { computed } from 'vue'\nimport { useHydrated } from '../../composables/use-hydrated'\nimport { useT } from '../../context'\nimport { cn } from '../../lib/utils'\n\n/**\n * A key binding as `<kbd>` keys (`G` then `D`, `⌘K`). The keys depend on the visitor's\n * platform (⌘ or Ctrl), so they render after hydration.\n */\nconst props = defineProps<{ binding: string; class?: string }>()\nconst t = useT()\nconst hydrated = useHydrated()\nconst steps = computed(() => shortcutSteps(props.binding))\n</script>\n\n<template>\n <span\n v-if=\"hydrated\"\n data-slot=\"shortcut-keys\"\n :class=\"cn('inline-flex items-center gap-1', props.class)\"\n >\n <span v-for=\"(step, index) in steps\" :key=\"index\" class=\"inline-flex items-center gap-1\">\n <span v-if=\"index > 0\" class=\"text-muted-foreground text-[10px]\">{{\n t('shortcuts.then', {}, 'then')\n }}</span>\n <kbd\n dir=\"ltr\"\n class=\"bg-muted text-muted-foreground rounded border px-1.5 font-mono text-[10px] leading-5\"\n >{{ step }}</kbd\n >\n </span>\n </span>\n</template>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"ShortcutKeys.vue.d.ts","sourceRoot":"","sources":["../../../src/components/panel/ShortcutKeys.vue"],"names":[],"mappings":"AA0CA;;;GAGG;AACH,KAAK,WAAW,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;;AA0EvD,wBAMG"}
1
+ {"version":3,"file":"ShortcutKeys.vue.d.ts","sourceRoot":"","sources":["../../../src/components/panel/ShortcutKeys.vue"],"names":[],"mappings":"AA2CA;;;GAGG;AACH,KAAK,WAAW,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;;AA2EvD,wBAMG"}
@@ -7,7 +7,10 @@ import { Fragment as i, computed as a, createCommentVNode as o, createElementBlo
7
7
  var h = {
8
8
  key: 0,
9
9
  class: "text-muted-foreground text-[10px]"
10
- }, g = { class: "bg-muted text-muted-foreground rounded border px-1.5 font-mono text-[10px] leading-5" }, _ = /*@__PURE__*/ l({
10
+ }, g = {
11
+ dir: "ltr",
12
+ class: "bg-muted text-muted-foreground rounded border px-1.5 font-mono text-[10px] leading-5"
13
+ }, _ = /*@__PURE__*/ l({
11
14
  __name: "ShortcutKeys",
12
15
  props: {
13
16
  binding: {},
@@ -1 +1 @@
1
- {"version":3,"file":"ShortcutKeys.vue_vue_type_script_setup_true_lang.js","names":["_unref","_openBlock","_createElementBlock","_normalizeClass","_Fragment","_renderList","_toDisplayString","_createCommentVNode","_createElementVNode","_hoisted_1","_hoisted_2","ShortcutKeys_vue_vue_type_script_setup_true_lang_default","props","__props","t","useT","hydrated","useHydrated","steps","computed","shortcutSteps","unref","openBlock","createElementBlock","normalizeClass","cn","Fragment","renderList","index","toDisplayString","createCommentVNode","createElementVNode","step"],"sources":["../../../src/components/panel/ShortcutKeys.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { shortcutSteps } from '@alfakit/core'\nimport { computed } from 'vue'\nimport { useHydrated } from '../../composables/use-hydrated'\nimport { useT } from '../../context'\nimport { cn } from '../../lib/utils'\n\n/**\n * A key binding as `<kbd>` keys (`G` then `D`, `⌘K`). The keys depend on the visitor's\n * platform (⌘ or Ctrl), so they render after hydration.\n */\nconst props = defineProps<{ binding: string; class?: string }>()\nconst t = useT()\nconst hydrated = useHydrated()\nconst steps = computed(() => shortcutSteps(props.binding))\n</script>\n\n<template>\n <span\n v-if=\"hydrated\"\n data-slot=\"shortcut-keys\"\n :class=\"cn('inline-flex items-center gap-1', props.class)\"\n >\n <span v-for=\"(step, index) in steps\" :key=\"index\" class=\"inline-flex items-center gap-1\">\n <span v-if=\"index > 0\" class=\"text-muted-foreground text-[10px]\">{{\n t('shortcuts.then', {}, 'then')\n }}</span>\n <kbd\n class=\"bg-muted text-muted-foreground rounded border px-1.5 font-mono text-[10px] leading-5\"\n >{{ step }}</kbd\n >\n </span>\n </span>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;EAWA,IAAMY,IAAQC,GACRC,IAAIC,EAAK,GACTC,IAAWC,EAAY,GACvBC,IAAQC,QAAeC,EAAcR,EAAM,OAAO,CAAC;mBAK/CZ,EAAAgB,CAAA,KADRf,EAAA,GAAAC,EAcO,QAAA;;GAZL,aAAU;GACT,OAAKC,EAAEH,EAAAyB,CAAA,CAAE,CAAA,kCAAmCb,EAAM,KAAK,CAAA;EAExDX,GAAAA,EAAAA,EAAA,EAAA,GAAAC,EAQOE,GAAA,MAAAC,EARuBa,EAAA,QAAhB,GAAM,OAApBjB,EAAA,GAAAC,EAQO,QAAA;GAR+B,KAAK0B;GAAO,OAAM;EAC1C,GAAA,CAAAA,IAAK,KAAjB3B,EAAA,GAAAC,EAES,QAFTO,GAESH,EADPN,EAAAc,CAAA,CAAC,CAAA,kBAAA,CAAA,GAAA,MAAA,CAAA,GAAA,CAAA,KAAAgB,EAAA,IAAA,EAAA,GAEHtB,EAGC,OAHDE,GAGCJ,EADK0B,CAAI,GAAA,CAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"ShortcutKeys.vue_vue_type_script_setup_true_lang.js","names":["_unref","_openBlock","_createElementBlock","_normalizeClass","_Fragment","_renderList","_toDisplayString","_createCommentVNode","_createElementVNode","_hoisted_1","_hoisted_2","ShortcutKeys_vue_vue_type_script_setup_true_lang_default","props","__props","t","useT","hydrated","useHydrated","steps","computed","shortcutSteps","unref","openBlock","createElementBlock","normalizeClass","cn","Fragment","renderList","index","toDisplayString","createCommentVNode","createElementVNode","step"],"sources":["../../../src/components/panel/ShortcutKeys.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { shortcutSteps } from '@alfakit/core'\nimport { computed } from 'vue'\nimport { useHydrated } from '../../composables/use-hydrated'\nimport { useT } from '../../context'\nimport { cn } from '../../lib/utils'\n\n/**\n * A key binding as `<kbd>` keys (`G` then `D`, `⌘K`). The keys depend on the visitor's\n * platform (⌘ or Ctrl), so they render after hydration.\n */\nconst props = defineProps<{ binding: string; class?: string }>()\nconst t = useT()\nconst hydrated = useHydrated()\nconst steps = computed(() => shortcutSteps(props.binding))\n</script>\n\n<template>\n <span\n v-if=\"hydrated\"\n data-slot=\"shortcut-keys\"\n :class=\"cn('inline-flex items-center gap-1', props.class)\"\n >\n <span v-for=\"(step, index) in steps\" :key=\"index\" class=\"inline-flex items-center gap-1\">\n <span v-if=\"index > 0\" class=\"text-muted-foreground text-[10px]\">{{\n t('shortcuts.then', {}, 'then')\n }}</span>\n <kbd\n dir=\"ltr\"\n class=\"bg-muted text-muted-foreground rounded border px-1.5 font-mono text-[10px] leading-5\"\n >{{ step }}</kbd\n >\n </span>\n </span>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;EAWA,IAAMY,IAAQC,GACRC,IAAIC,EAAK,GACTC,IAAWC,EAAY,GACvBC,IAAQC,QAAeC,EAAcR,EAAM,OAAO,CAAC;mBAK/CZ,EAAAgB,CAAA,KADRf,EAAA,GAAAC,EAeO,QAAA;;GAbL,aAAU;GACT,OAAKC,EAAEH,EAAAyB,CAAA,CAAE,CAAA,kCAAmCb,EAAM,KAAK,CAAA;EAExDX,GAAAA,EAAAA,EAAA,EAAA,GAAAC,EASOE,GAAA,MAAAC,EATuBa,EAAA,QAAhB,GAAM,OAApBjB,EAAA,GAAAC,EASO,QAAA;GAT+B,KAAK0B;GAAO,OAAM;EAC1C,GAAA,CAAAA,IAAK,KAAjB3B,EAAA,GAAAC,EAES,QAFTO,GAESH,EADPN,EAAAc,CAAA,CAAC,CAAA,kBAAA,CAAA,GAAA,MAAA,CAAA,GAAA,CAAA,KAAAgB,EAAA,IAAA,EAAA,GAEHtB,EAIC,OAJDE,GAICJ,EADK0B,CAAI,GAAA,CAAA,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"TenantMenu.js","names":["_sfc_main","TenantMenu_vue_vue_type_script_setup_true_lang_default","TenantMenu_default"],"sources":["../../../src/components/panel/TenantMenu.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { filterTenants, initials, tenantNameText } from '@alfakit/core'\nimport { Link, router } from '@inertiajs/vue3'\nimport { CheckIcon, ChevronsUpDownIcon, PlusIcon, SearchIcon, SettingsIcon } from '@lucide/vue'\nimport { computed, ref } from 'vue'\nimport { usePanel, useT } from '../../context'\nimport { Icon } from '../../lib/icons'\nimport Avatar from '../ui/Avatar.vue'\nimport AvatarFallback from '../ui/AvatarFallback.vue'\nimport AvatarImage from '../ui/AvatarImage.vue'\nimport DropdownMenu from '../ui/DropdownMenu.vue'\nimport DropdownMenuContent from '../ui/DropdownMenuContent.vue'\nimport DropdownMenuItem from '../ui/DropdownMenuItem.vue'\nimport DropdownMenuLabel from '../ui/DropdownMenuLabel.vue'\nimport DropdownMenuSeparator from '../ui/DropdownMenuSeparator.vue'\nimport DropdownMenuTrigger from '../ui/DropdownMenuTrigger.vue'\nimport SidebarMenuButton from '../ui/SidebarMenuButton.vue'\nimport MenuItemEntries from './MenuItemEntries.vue'\nimport MenuItemEntry from './MenuItemEntry.vue'\nimport NavLabel from './NavLabel.vue'\n\n/**\n * The tenant switcher: a sidebar header button, or a compact button in the top bar of the\n * `topbar` layout (`variant=\"topbar\"`), where the store name shows from `lg` up.\n */\nconst props = withDefaults(defineProps<{ variant?: 'sidebar' | 'topbar' }>(), {\n variant: 'sidebar',\n})\n\nconst t = useT()\nconst panel = usePanel()\nconst tenancy = computed(() => panel.value.tenancy)\nconst current = computed(() => tenancy.value?.current)\nconst search = ref('')\n// `tenantSwitcher(false)` sends no tenants; `searchableTenantMenu()` adds a search field.\nconst hasSwitcher = computed(\n () => tenancy.value?.switcher !== false && (tenancy.value?.tenants.length ?? 0) > 0,\n)\nconst tenants = computed(() =>\n tenancy.value?.searchable\n ? filterTenants(tenancy.value.tenants, search.value)\n : (tenancy.value?.tenants ?? []),\n)\n</script>\n\n<template>\n <DropdownMenu v-if=\"tenancy && current\">\n <DropdownMenuTrigger as-child>\n <button\n v-if=\"props.variant === 'topbar'\"\n type=\"button\"\n data-slot=\"tenant-menu\"\n class=\"hover:bg-accent data-[state=open]:bg-accent inline-flex h-9 max-w-60 shrink-0 items-center gap-2 rounded-md px-2 text-sm font-medium\"\n >\n <Avatar class=\"size-6 rounded-md\">\n <AvatarImage v-if=\"current.avatar\" :src=\"current.avatar\" alt=\"\" />\n <AvatarFallback class=\"rounded-md text-[10px]\">{{\n initials(tenantNameText(current))\n }}</AvatarFallback>\n </Avatar>\n <span\n class=\"sr-only min-w-0 truncate lg:not-sr-only lg:grid lg:text-start lg:leading-tight\"\n >\n <span\n v-if=\"current.label\"\n data-slot=\"tenant-menu-label\"\n class=\"text-muted-foreground text-[10px]\"\n >{{ current.label }}\n </span>\n <NavLabel class=\"truncate\" :text=\"current.name\" :html=\"current.nameHtml\" />\n </span>\n <Icon\n name=\"alfakit::panels.tenant-menu.toggle-button\"\n :fallback=\"ChevronsUpDownIcon\"\n class=\"text-muted-foreground size-4 shrink-0\"\n />\n </button>\n <SidebarMenuButton v-else size=\"lg\" class=\"data-[state=open]:bg-sidebar-accent\">\n <Avatar class=\"size-8 rounded-lg\">\n <AvatarImage v-if=\"current.avatar\" :src=\"current.avatar\" :alt=\"tenantNameText(current)\" />\n <AvatarFallback class=\"rounded-lg\">{{\n initials(tenantNameText(current))\n }}</AvatarFallback>\n </Avatar>\n <div class=\"grid flex-1 text-start text-sm leading-tight\">\n <!-- `HasCurrentTenantLabel`: a caption above the name instead of the brand. -->\n <span\n v-if=\"current.label\"\n data-slot=\"tenant-menu-label\"\n class=\"text-muted-foreground truncate text-xs\"\n >{{ current.label }}</span\n >\n <NavLabel class=\"truncate font-medium\" :text=\"current.name\" :html=\"current.nameHtml\" />\n <span v-if=\"!current.label\" class=\"text-muted-foreground truncate text-xs\">{{\n panel.brandName\n }}</span>\n </div>\n <Icon\n name=\"alfakit::panels.tenant-menu.toggle-button\"\n :fallback=\"ChevronsUpDownIcon\"\n class=\"ms-auto size-4\"\n />\n </SidebarMenuButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent class=\"min-w-56 rounded-lg\" side=\"bottom\" align=\"start\" :side-offset=\"4\">\n <DropdownMenuLabel v-if=\"hasSwitcher\" class=\"text-muted-foreground text-xs\">{{\n t('tenancy.switch', {}, 'Switch')\n }}</DropdownMenuLabel>\n <div\n v-if=\"hasSwitcher && tenancy.searchable\"\n data-slot=\"tenant-menu-search\"\n class=\"relative px-1 pb-1\"\n >\n <SearchIcon\n class=\"text-muted-foreground pointer-events-none absolute start-3 top-1/2 size-3.5 -translate-y-1/2\"\n aria-hidden=\"true\"\n />\n <!-- Keep the menu's type-ahead from taking the keys. -->\n <input\n v-model=\"search\"\n type=\"search\"\n :placeholder=\"t('tenancy.search', {}, 'Search')\"\n :aria-label=\"t('tenancy.search', {}, 'Search')\"\n class=\"border-input focus-visible:ring-ring/50 h-8 w-full rounded-md border bg-transparent ps-7 pe-2 text-sm outline-none focus-visible:ring-[3px]\"\n @keydown.stop\n />\n </div>\n <p\n v-if=\"hasSwitcher && tenancy.searchable && tenants.length === 0\"\n class=\"text-muted-foreground px-2 py-1.5 text-sm\"\n >\n {{ t('no_results', {}, 'No results.') }}\n </p>\n <DropdownMenuItem\n v-for=\"tenant in tenants\"\n :key=\"String(tenant.id)\"\n @select=\"router.visit(tenant.url)\"\n >\n <Avatar class=\"size-6 rounded-sm\">\n <AvatarImage v-if=\"tenant.avatar\" :src=\"tenant.avatar\" :alt=\"tenantNameText(tenant)\" />\n <AvatarFallback class=\"rounded-sm text-[10px]\">{{\n initials(tenantNameText(tenant))\n }}</AvatarFallback>\n </Avatar>\n <NavLabel class=\"flex-1 truncate\" :text=\"tenant.name\" :html=\"tenant.nameHtml\" />\n <CheckIcon v-if=\"String(tenant.id) === String(current.id)\" class=\"size-4\" />\n </DropdownMenuItem>\n <DropdownMenuSeparator\n v-if=\"\n hasSwitcher && (tenancy.registrationUrl || tenancy.profileUrl || tenancy.menu?.length)\n \"\n />\n <MenuItemEntry v-if=\"tenancy.profile\" :item=\"tenancy.profile\" menu=\"tenantMenu\" />\n <DropdownMenuItem v-else-if=\"tenancy.profileUrl\" as-child>\n <Link :href=\"tenancy.profileUrl\" class=\"w-full\"\n ><Icon name=\"alfakit::panels.tenant-menu.profile-button\" :fallback=\"SettingsIcon\" />\n {{ t('tenancy.profile', {}, 'Settings') }}</Link\n >\n </DropdownMenuItem>\n <MenuItemEntries v-if=\"tenancy.menu\" :items=\"tenancy.menu\" menu=\"tenantMenu\" />\n <MenuItemEntry v-if=\"tenancy.registration\" :item=\"tenancy.registration\" menu=\"tenantMenu\" />\n <DropdownMenuItem v-else-if=\"tenancy.registrationUrl\" as-child>\n <Link :href=\"tenancy.registrationUrl\" class=\"w-full\"\n ><Icon name=\"alfakit::panels.tenant-menu.registration-button\" :fallback=\"PlusIcon\" />\n {{ t('tenancy.register', {}, 'New') }}</Link\n >\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"TenantMenu.js","names":["_sfc_main","TenantMenu_vue_vue_type_script_setup_true_lang_default","TenantMenu_default"],"sources":["../../../src/components/panel/TenantMenu.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { filterTenants, initials, tenantNameText } from '@alfakit/core'\nimport { Link, router } from '@inertiajs/vue3'\nimport { CheckIcon, ChevronsUpDownIcon, PlusIcon, SearchIcon, SettingsIcon } from '@lucide/vue'\nimport { computed, ref } from 'vue'\nimport { usePanel, useT } from '../../context'\nimport { Icon } from '../../lib/icons'\nimport Avatar from '../ui/Avatar.vue'\nimport AvatarFallback from '../ui/AvatarFallback.vue'\nimport AvatarImage from '../ui/AvatarImage.vue'\nimport DropdownMenu from '../ui/DropdownMenu.vue'\nimport DropdownMenuContent from '../ui/DropdownMenuContent.vue'\nimport DropdownMenuItem from '../ui/DropdownMenuItem.vue'\nimport DropdownMenuLabel from '../ui/DropdownMenuLabel.vue'\nimport DropdownMenuSeparator from '../ui/DropdownMenuSeparator.vue'\nimport DropdownMenuTrigger from '../ui/DropdownMenuTrigger.vue'\nimport SidebarMenuButton from '../ui/SidebarMenuButton.vue'\nimport MenuItemEntries from './MenuItemEntries.vue'\nimport MenuItemEntry from './MenuItemEntry.vue'\nimport NavLabel from './NavLabel.vue'\n\n/**\n * The tenant switcher: a sidebar header button, or a compact button in the top bar of the\n * `topbar` layout (`variant=\"topbar\"`), where the store name shows from `lg` up.\n */\nconst props = withDefaults(defineProps<{ variant?: 'sidebar' | 'topbar' }>(), {\n variant: 'sidebar',\n})\n\nconst t = useT()\nconst panel = usePanel()\nconst tenancy = computed(() => panel.value.tenancy)\nconst current = computed(() => tenancy.value?.current)\nconst search = ref('')\n// `tenantSwitcher(false)` sends no tenants; `searchableTenantMenu()` adds a search field.\nconst hasSwitcher = computed(\n () => tenancy.value?.switcher !== false && (tenancy.value?.tenants.length ?? 0) > 0,\n)\nconst tenants = computed(() =>\n tenancy.value?.searchable\n ? filterTenants(tenancy.value.tenants, search.value)\n : (tenancy.value?.tenants ?? []),\n)\n</script>\n\n<template>\n <DropdownMenu v-if=\"tenancy && current\">\n <DropdownMenuTrigger as-child>\n <button\n v-if=\"props.variant === 'topbar'\"\n type=\"button\"\n data-slot=\"tenant-menu\"\n class=\"hover:bg-accent data-[state=open]:bg-accent inline-flex h-9 max-w-60 shrink-0 items-center gap-2 rounded-md px-2 text-sm font-medium\"\n >\n <Avatar class=\"size-6 rounded-md\">\n <AvatarImage v-if=\"current.avatar\" :src=\"current.avatar\" alt=\"\" />\n <AvatarFallback class=\"rounded-md text-[10px]\">{{\n initials(tenantNameText(current))\n }}</AvatarFallback>\n </Avatar>\n <span\n class=\"sr-only min-w-0 truncate lg:not-sr-only lg:grid lg:text-start lg:leading-tight\"\n >\n <span\n v-if=\"current.label\"\n data-slot=\"tenant-menu-label\"\n class=\"text-muted-foreground text-[10px]\"\n >{{ current.label }}\n </span>\n <NavLabel class=\"truncate\" :text=\"current.name\" :html=\"current.nameHtml\" />\n </span>\n <Icon\n name=\"alfakit::panels.tenant-menu.toggle-button\"\n :fallback=\"ChevronsUpDownIcon\"\n class=\"text-muted-foreground size-4 shrink-0\"\n />\n </button>\n <SidebarMenuButton v-else size=\"lg\" class=\"data-[state=open]:bg-sidebar-accent\">\n <Avatar class=\"size-8 rounded-lg\">\n <AvatarImage v-if=\"current.avatar\" :src=\"current.avatar\" :alt=\"tenantNameText(current)\" />\n <AvatarFallback class=\"rounded-lg\">{{\n initials(tenantNameText(current))\n }}</AvatarFallback>\n </Avatar>\n <div class=\"grid flex-1 text-start text-sm leading-tight\">\n <!-- `HasCurrentTenantLabel`: a caption above the name instead of the brand. -->\n <span\n v-if=\"current.label\"\n data-slot=\"tenant-menu-label\"\n class=\"text-muted-foreground truncate text-xs\"\n >{{ current.label }}</span\n >\n <NavLabel class=\"truncate font-medium\" :text=\"current.name\" :html=\"current.nameHtml\" />\n <span v-if=\"!current.label\" class=\"text-muted-foreground truncate text-xs\">{{\n panel.brandName\n }}</span>\n </div>\n <Icon\n name=\"alfakit::panels.tenant-menu.toggle-button\"\n :fallback=\"ChevronsUpDownIcon\"\n class=\"ms-auto size-4\"\n />\n </SidebarMenuButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent class=\"min-w-56 rounded-lg\" side=\"bottom\" align=\"start\" :side-offset=\"4\">\n <DropdownMenuLabel v-if=\"hasSwitcher\" class=\"text-muted-foreground text-xs\">{{\n t('tenancy.switch', {}, 'Switch')\n }}</DropdownMenuLabel>\n <div\n v-if=\"hasSwitcher && tenancy.searchable\"\n data-slot=\"tenant-menu-search\"\n class=\"relative px-1 pb-1\"\n >\n <SearchIcon\n class=\"text-muted-foreground pointer-events-none absolute start-3 top-1/2 size-3.5 -translate-y-1/2\"\n aria-hidden=\"true\"\n />\n <!-- Keep the menu's type-ahead from taking the keys. -->\n <input\n v-model=\"search\"\n type=\"search\"\n :placeholder=\"t('tenancy.search', {}, 'Search')\"\n :aria-label=\"t('tenancy.search', {}, 'Search')\"\n class=\"border-input focus-visible:ring-ring/50 h-8 w-full rounded-md border bg-transparent ps-7 pe-2 text-sm outline-none focus-visible:ring-[3px]\"\n @keydown.stop\n />\n </div>\n <p\n v-if=\"hasSwitcher && tenancy.searchable && tenants.length === 0\"\n class=\"text-muted-foreground px-2 py-1.5 text-sm\"\n >\n {{ t('no_results', {}, 'No results.') }}\n </p>\n <DropdownMenuItem\n v-for=\"tenant in tenants\"\n :key=\"String(tenant.id)\"\n @select=\"router.visit(tenant.url)\"\n >\n <Avatar class=\"size-6 rounded-sm\">\n <AvatarImage v-if=\"tenant.avatar\" :src=\"tenant.avatar\" :alt=\"tenantNameText(tenant)\" />\n <AvatarFallback class=\"rounded-sm text-[10px]\">{{\n initials(tenantNameText(tenant))\n }}</AvatarFallback>\n </Avatar>\n <NavLabel class=\"flex-1 truncate\" :text=\"tenant.name\" :html=\"tenant.nameHtml\" />\n <CheckIcon v-if=\"String(tenant.id) === String(current.id)\" class=\"size-4\" />\n </DropdownMenuItem>\n <DropdownMenuSeparator\n v-if=\"\n hasSwitcher && (tenancy.registrationUrl || tenancy.profileUrl || tenancy.menu?.length)\n \"\n />\n <MenuItemEntry v-if=\"tenancy.profile\" :item=\"tenancy.profile\" menu=\"tenantMenu\" />\n <DropdownMenuItem v-else-if=\"tenancy.profileUrl\" as-child>\n <Link :href=\"tenancy.profileUrl\" class=\"w-full\"\n ><Icon name=\"alfakit::panels.tenant-menu.profile-button\" :fallback=\"SettingsIcon\" />\n {{ tenancy.profileLabel ?? t('tenancy.profile', {}, 'Settings') }}</Link\n >\n </DropdownMenuItem>\n <MenuItemEntries v-if=\"tenancy.menu\" :items=\"tenancy.menu\" menu=\"tenantMenu\" />\n <MenuItemEntry v-if=\"tenancy.registration\" :item=\"tenancy.registration\" menu=\"tenantMenu\" />\n <DropdownMenuItem v-else-if=\"tenancy.registrationUrl\" as-child>\n <Link :href=\"tenancy.registrationUrl\" class=\"w-full\"\n ><Icon name=\"alfakit::panels.tenant-menu.registration-button\" :fallback=\"PlusIcon\" />\n {{ tenancy.registrationLabel ?? t('tenancy.register', {}, 'New') }}</Link\n >\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n</template>\n"],"mappings":""}
@@ -175,7 +175,7 @@ var L = {
175
175
  default: k(() => [C(D(n), {
176
176
  name: "alfakit::panels.tenant-menu.profile-button",
177
177
  fallback: D(I)
178
- }, null, 8, ["fallback"]), S(" " + E(D(q)("tenancy.profile", {}, "Settings")), 1)]),
178
+ }, null, 8, ["fallback"]), S(" " + E(Y.value.profileLabel ?? D(q)("tenancy.profile", {}, "Settings")), 1)]),
179
179
  _: 1
180
180
  }, 8, ["href"])]),
181
181
  _: 1
@@ -200,7 +200,7 @@ var L = {
200
200
  default: k(() => [C(D(n), {
201
201
  name: "alfakit::panels.tenant-menu.registration-button",
202
202
  fallback: D(P)
203
- }, null, 8, ["fallback"]), S(" " + E(D(q)("tenancy.register", {}, "New")), 1)]),
203
+ }, null, 8, ["fallback"]), S(" " + E(Y.value.registrationLabel ?? D(q)("tenancy.register", {}, "New")), 1)]),
204
204
  _: 1
205
205
  }, 8, ["href"])]),
206
206
  _: 1
@@ -1 +1 @@
1
- {"version":3,"file":"TenantMenu.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","DropdownMenu","_withCtx","_createVNode","DropdownMenuTrigger","_createElementBlock","Avatar","AvatarImage","_createCommentVNode","AvatarFallback","_createTextVNode","_toDisplayString","_unref","_createElementVNode","NavLabel","Icon","SidebarMenuButton","DropdownMenuContent","DropdownMenuLabel","_withDirectives","_withModifiers","_vModelText","_Fragment","_renderList","DropdownMenuItem","DropdownMenuSeparator","MenuItemEntry","MenuItemEntries","Icon_default","DropdownMenu_default","DropdownMenuContent_default","DropdownMenuItem_default","DropdownMenuSeparator_default","DropdownMenuTrigger_default","DropdownMenuLabel_default","SidebarMenuButton_default","NavLabel_default","Avatar_default","AvatarFallback_default","AvatarImage_default","MenuItemEntry_default","MenuItemEntries_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","TenantMenu_vue_vue_type_script_setup_true_lang_default","props","__props","t","useT","panel","usePanel","tenancy","computed","current","search","ref","hasSwitcher","tenants","filterTenants","openBlock","createBlock","withCtx","createVNode","createElementBlock","createCommentVNode","createTextVNode","toDisplayString","unref","initials","tenantNameText","createElementVNode","ChevronsUpDownIcon","SearchIcon","withDirectives","_cache","$event","withModifiers","vModelText","Fragment","renderList","tenant","router","CheckIcon","Link","SettingsIcon","PlusIcon"],"sources":["../../../src/components/panel/TenantMenu.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { filterTenants, initials, tenantNameText } from '@alfakit/core'\nimport { Link, router } from '@inertiajs/vue3'\nimport { CheckIcon, ChevronsUpDownIcon, PlusIcon, SearchIcon, SettingsIcon } from '@lucide/vue'\nimport { computed, ref } from 'vue'\nimport { usePanel, useT } from '../../context'\nimport { Icon } from '../../lib/icons'\nimport Avatar from '../ui/Avatar.vue'\nimport AvatarFallback from '../ui/AvatarFallback.vue'\nimport AvatarImage from '../ui/AvatarImage.vue'\nimport DropdownMenu from '../ui/DropdownMenu.vue'\nimport DropdownMenuContent from '../ui/DropdownMenuContent.vue'\nimport DropdownMenuItem from '../ui/DropdownMenuItem.vue'\nimport DropdownMenuLabel from '../ui/DropdownMenuLabel.vue'\nimport DropdownMenuSeparator from '../ui/DropdownMenuSeparator.vue'\nimport DropdownMenuTrigger from '../ui/DropdownMenuTrigger.vue'\nimport SidebarMenuButton from '../ui/SidebarMenuButton.vue'\nimport MenuItemEntries from './MenuItemEntries.vue'\nimport MenuItemEntry from './MenuItemEntry.vue'\nimport NavLabel from './NavLabel.vue'\n\n/**\n * The tenant switcher: a sidebar header button, or a compact button in the top bar of the\n * `topbar` layout (`variant=\"topbar\"`), where the store name shows from `lg` up.\n */\nconst props = withDefaults(defineProps<{ variant?: 'sidebar' | 'topbar' }>(), {\n variant: 'sidebar',\n})\n\nconst t = useT()\nconst panel = usePanel()\nconst tenancy = computed(() => panel.value.tenancy)\nconst current = computed(() => tenancy.value?.current)\nconst search = ref('')\n// `tenantSwitcher(false)` sends no tenants; `searchableTenantMenu()` adds a search field.\nconst hasSwitcher = computed(\n () => tenancy.value?.switcher !== false && (tenancy.value?.tenants.length ?? 0) > 0,\n)\nconst tenants = computed(() =>\n tenancy.value?.searchable\n ? filterTenants(tenancy.value.tenants, search.value)\n : (tenancy.value?.tenants ?? []),\n)\n</script>\n\n<template>\n <DropdownMenu v-if=\"tenancy && current\">\n <DropdownMenuTrigger as-child>\n <button\n v-if=\"props.variant === 'topbar'\"\n type=\"button\"\n data-slot=\"tenant-menu\"\n class=\"hover:bg-accent data-[state=open]:bg-accent inline-flex h-9 max-w-60 shrink-0 items-center gap-2 rounded-md px-2 text-sm font-medium\"\n >\n <Avatar class=\"size-6 rounded-md\">\n <AvatarImage v-if=\"current.avatar\" :src=\"current.avatar\" alt=\"\" />\n <AvatarFallback class=\"rounded-md text-[10px]\">{{\n initials(tenantNameText(current))\n }}</AvatarFallback>\n </Avatar>\n <span\n class=\"sr-only min-w-0 truncate lg:not-sr-only lg:grid lg:text-start lg:leading-tight\"\n >\n <span\n v-if=\"current.label\"\n data-slot=\"tenant-menu-label\"\n class=\"text-muted-foreground text-[10px]\"\n >{{ current.label }}\n </span>\n <NavLabel class=\"truncate\" :text=\"current.name\" :html=\"current.nameHtml\" />\n </span>\n <Icon\n name=\"alfakit::panels.tenant-menu.toggle-button\"\n :fallback=\"ChevronsUpDownIcon\"\n class=\"text-muted-foreground size-4 shrink-0\"\n />\n </button>\n <SidebarMenuButton v-else size=\"lg\" class=\"data-[state=open]:bg-sidebar-accent\">\n <Avatar class=\"size-8 rounded-lg\">\n <AvatarImage v-if=\"current.avatar\" :src=\"current.avatar\" :alt=\"tenantNameText(current)\" />\n <AvatarFallback class=\"rounded-lg\">{{\n initials(tenantNameText(current))\n }}</AvatarFallback>\n </Avatar>\n <div class=\"grid flex-1 text-start text-sm leading-tight\">\n <!-- `HasCurrentTenantLabel`: a caption above the name instead of the brand. -->\n <span\n v-if=\"current.label\"\n data-slot=\"tenant-menu-label\"\n class=\"text-muted-foreground truncate text-xs\"\n >{{ current.label }}</span\n >\n <NavLabel class=\"truncate font-medium\" :text=\"current.name\" :html=\"current.nameHtml\" />\n <span v-if=\"!current.label\" class=\"text-muted-foreground truncate text-xs\">{{\n panel.brandName\n }}</span>\n </div>\n <Icon\n name=\"alfakit::panels.tenant-menu.toggle-button\"\n :fallback=\"ChevronsUpDownIcon\"\n class=\"ms-auto size-4\"\n />\n </SidebarMenuButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent class=\"min-w-56 rounded-lg\" side=\"bottom\" align=\"start\" :side-offset=\"4\">\n <DropdownMenuLabel v-if=\"hasSwitcher\" class=\"text-muted-foreground text-xs\">{{\n t('tenancy.switch', {}, 'Switch')\n }}</DropdownMenuLabel>\n <div\n v-if=\"hasSwitcher && tenancy.searchable\"\n data-slot=\"tenant-menu-search\"\n class=\"relative px-1 pb-1\"\n >\n <SearchIcon\n class=\"text-muted-foreground pointer-events-none absolute start-3 top-1/2 size-3.5 -translate-y-1/2\"\n aria-hidden=\"true\"\n />\n <!-- Keep the menu's type-ahead from taking the keys. -->\n <input\n v-model=\"search\"\n type=\"search\"\n :placeholder=\"t('tenancy.search', {}, 'Search')\"\n :aria-label=\"t('tenancy.search', {}, 'Search')\"\n class=\"border-input focus-visible:ring-ring/50 h-8 w-full rounded-md border bg-transparent ps-7 pe-2 text-sm outline-none focus-visible:ring-[3px]\"\n @keydown.stop\n />\n </div>\n <p\n v-if=\"hasSwitcher && tenancy.searchable && tenants.length === 0\"\n class=\"text-muted-foreground px-2 py-1.5 text-sm\"\n >\n {{ t('no_results', {}, 'No results.') }}\n </p>\n <DropdownMenuItem\n v-for=\"tenant in tenants\"\n :key=\"String(tenant.id)\"\n @select=\"router.visit(tenant.url)\"\n >\n <Avatar class=\"size-6 rounded-sm\">\n <AvatarImage v-if=\"tenant.avatar\" :src=\"tenant.avatar\" :alt=\"tenantNameText(tenant)\" />\n <AvatarFallback class=\"rounded-sm text-[10px]\">{{\n initials(tenantNameText(tenant))\n }}</AvatarFallback>\n </Avatar>\n <NavLabel class=\"flex-1 truncate\" :text=\"tenant.name\" :html=\"tenant.nameHtml\" />\n <CheckIcon v-if=\"String(tenant.id) === String(current.id)\" class=\"size-4\" />\n </DropdownMenuItem>\n <DropdownMenuSeparator\n v-if=\"\n hasSwitcher && (tenancy.registrationUrl || tenancy.profileUrl || tenancy.menu?.length)\n \"\n />\n <MenuItemEntry v-if=\"tenancy.profile\" :item=\"tenancy.profile\" menu=\"tenantMenu\" />\n <DropdownMenuItem v-else-if=\"tenancy.profileUrl\" as-child>\n <Link :href=\"tenancy.profileUrl\" class=\"w-full\"\n ><Icon name=\"alfakit::panels.tenant-menu.profile-button\" :fallback=\"SettingsIcon\" />\n {{ t('tenancy.profile', {}, 'Settings') }}</Link\n >\n </DropdownMenuItem>\n <MenuItemEntries v-if=\"tenancy.menu\" :items=\"tenancy.menu\" menu=\"tenantMenu\" />\n <MenuItemEntry v-if=\"tenancy.registration\" :item=\"tenancy.registration\" menu=\"tenantMenu\" />\n <DropdownMenuItem v-else-if=\"tenancy.registrationUrl\" as-child>\n <Link :href=\"tenancy.registrationUrl\" class=\"w-full\"\n ><Icon name=\"alfakit::panels.tenant-menu.registration-button\" :fallback=\"PlusIcon\" />\n {{ t('tenancy.register', {}, 'New') }}</Link\n >\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"TenantMenu.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","DropdownMenu","_withCtx","_createVNode","DropdownMenuTrigger","_createElementBlock","Avatar","AvatarImage","_createCommentVNode","AvatarFallback","_createTextVNode","_toDisplayString","_unref","_createElementVNode","NavLabel","Icon","SidebarMenuButton","DropdownMenuContent","DropdownMenuLabel","_withDirectives","_withModifiers","_vModelText","_Fragment","_renderList","DropdownMenuItem","DropdownMenuSeparator","MenuItemEntry","MenuItemEntries","Icon_default","DropdownMenu_default","DropdownMenuContent_default","DropdownMenuItem_default","DropdownMenuSeparator_default","DropdownMenuTrigger_default","DropdownMenuLabel_default","SidebarMenuButton_default","NavLabel_default","Avatar_default","AvatarFallback_default","AvatarImage_default","MenuItemEntry_default","MenuItemEntries_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","TenantMenu_vue_vue_type_script_setup_true_lang_default","props","__props","t","useT","panel","usePanel","tenancy","computed","current","search","ref","hasSwitcher","tenants","filterTenants","openBlock","createBlock","withCtx","createVNode","createElementBlock","createCommentVNode","createTextVNode","toDisplayString","unref","initials","tenantNameText","createElementVNode","ChevronsUpDownIcon","SearchIcon","withDirectives","_cache","$event","withModifiers","vModelText","Fragment","renderList","tenant","router","CheckIcon","Link","SettingsIcon","PlusIcon"],"sources":["../../../src/components/panel/TenantMenu.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { filterTenants, initials, tenantNameText } from '@alfakit/core'\nimport { Link, router } from '@inertiajs/vue3'\nimport { CheckIcon, ChevronsUpDownIcon, PlusIcon, SearchIcon, SettingsIcon } from '@lucide/vue'\nimport { computed, ref } from 'vue'\nimport { usePanel, useT } from '../../context'\nimport { Icon } from '../../lib/icons'\nimport Avatar from '../ui/Avatar.vue'\nimport AvatarFallback from '../ui/AvatarFallback.vue'\nimport AvatarImage from '../ui/AvatarImage.vue'\nimport DropdownMenu from '../ui/DropdownMenu.vue'\nimport DropdownMenuContent from '../ui/DropdownMenuContent.vue'\nimport DropdownMenuItem from '../ui/DropdownMenuItem.vue'\nimport DropdownMenuLabel from '../ui/DropdownMenuLabel.vue'\nimport DropdownMenuSeparator from '../ui/DropdownMenuSeparator.vue'\nimport DropdownMenuTrigger from '../ui/DropdownMenuTrigger.vue'\nimport SidebarMenuButton from '../ui/SidebarMenuButton.vue'\nimport MenuItemEntries from './MenuItemEntries.vue'\nimport MenuItemEntry from './MenuItemEntry.vue'\nimport NavLabel from './NavLabel.vue'\n\n/**\n * The tenant switcher: a sidebar header button, or a compact button in the top bar of the\n * `topbar` layout (`variant=\"topbar\"`), where the store name shows from `lg` up.\n */\nconst props = withDefaults(defineProps<{ variant?: 'sidebar' | 'topbar' }>(), {\n variant: 'sidebar',\n})\n\nconst t = useT()\nconst panel = usePanel()\nconst tenancy = computed(() => panel.value.tenancy)\nconst current = computed(() => tenancy.value?.current)\nconst search = ref('')\n// `tenantSwitcher(false)` sends no tenants; `searchableTenantMenu()` adds a search field.\nconst hasSwitcher = computed(\n () => tenancy.value?.switcher !== false && (tenancy.value?.tenants.length ?? 0) > 0,\n)\nconst tenants = computed(() =>\n tenancy.value?.searchable\n ? filterTenants(tenancy.value.tenants, search.value)\n : (tenancy.value?.tenants ?? []),\n)\n</script>\n\n<template>\n <DropdownMenu v-if=\"tenancy && current\">\n <DropdownMenuTrigger as-child>\n <button\n v-if=\"props.variant === 'topbar'\"\n type=\"button\"\n data-slot=\"tenant-menu\"\n class=\"hover:bg-accent data-[state=open]:bg-accent inline-flex h-9 max-w-60 shrink-0 items-center gap-2 rounded-md px-2 text-sm font-medium\"\n >\n <Avatar class=\"size-6 rounded-md\">\n <AvatarImage v-if=\"current.avatar\" :src=\"current.avatar\" alt=\"\" />\n <AvatarFallback class=\"rounded-md text-[10px]\">{{\n initials(tenantNameText(current))\n }}</AvatarFallback>\n </Avatar>\n <span\n class=\"sr-only min-w-0 truncate lg:not-sr-only lg:grid lg:text-start lg:leading-tight\"\n >\n <span\n v-if=\"current.label\"\n data-slot=\"tenant-menu-label\"\n class=\"text-muted-foreground text-[10px]\"\n >{{ current.label }}\n </span>\n <NavLabel class=\"truncate\" :text=\"current.name\" :html=\"current.nameHtml\" />\n </span>\n <Icon\n name=\"alfakit::panels.tenant-menu.toggle-button\"\n :fallback=\"ChevronsUpDownIcon\"\n class=\"text-muted-foreground size-4 shrink-0\"\n />\n </button>\n <SidebarMenuButton v-else size=\"lg\" class=\"data-[state=open]:bg-sidebar-accent\">\n <Avatar class=\"size-8 rounded-lg\">\n <AvatarImage v-if=\"current.avatar\" :src=\"current.avatar\" :alt=\"tenantNameText(current)\" />\n <AvatarFallback class=\"rounded-lg\">{{\n initials(tenantNameText(current))\n }}</AvatarFallback>\n </Avatar>\n <div class=\"grid flex-1 text-start text-sm leading-tight\">\n <!-- `HasCurrentTenantLabel`: a caption above the name instead of the brand. -->\n <span\n v-if=\"current.label\"\n data-slot=\"tenant-menu-label\"\n class=\"text-muted-foreground truncate text-xs\"\n >{{ current.label }}</span\n >\n <NavLabel class=\"truncate font-medium\" :text=\"current.name\" :html=\"current.nameHtml\" />\n <span v-if=\"!current.label\" class=\"text-muted-foreground truncate text-xs\">{{\n panel.brandName\n }}</span>\n </div>\n <Icon\n name=\"alfakit::panels.tenant-menu.toggle-button\"\n :fallback=\"ChevronsUpDownIcon\"\n class=\"ms-auto size-4\"\n />\n </SidebarMenuButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent class=\"min-w-56 rounded-lg\" side=\"bottom\" align=\"start\" :side-offset=\"4\">\n <DropdownMenuLabel v-if=\"hasSwitcher\" class=\"text-muted-foreground text-xs\">{{\n t('tenancy.switch', {}, 'Switch')\n }}</DropdownMenuLabel>\n <div\n v-if=\"hasSwitcher && tenancy.searchable\"\n data-slot=\"tenant-menu-search\"\n class=\"relative px-1 pb-1\"\n >\n <SearchIcon\n class=\"text-muted-foreground pointer-events-none absolute start-3 top-1/2 size-3.5 -translate-y-1/2\"\n aria-hidden=\"true\"\n />\n <!-- Keep the menu's type-ahead from taking the keys. -->\n <input\n v-model=\"search\"\n type=\"search\"\n :placeholder=\"t('tenancy.search', {}, 'Search')\"\n :aria-label=\"t('tenancy.search', {}, 'Search')\"\n class=\"border-input focus-visible:ring-ring/50 h-8 w-full rounded-md border bg-transparent ps-7 pe-2 text-sm outline-none focus-visible:ring-[3px]\"\n @keydown.stop\n />\n </div>\n <p\n v-if=\"hasSwitcher && tenancy.searchable && tenants.length === 0\"\n class=\"text-muted-foreground px-2 py-1.5 text-sm\"\n >\n {{ t('no_results', {}, 'No results.') }}\n </p>\n <DropdownMenuItem\n v-for=\"tenant in tenants\"\n :key=\"String(tenant.id)\"\n @select=\"router.visit(tenant.url)\"\n >\n <Avatar class=\"size-6 rounded-sm\">\n <AvatarImage v-if=\"tenant.avatar\" :src=\"tenant.avatar\" :alt=\"tenantNameText(tenant)\" />\n <AvatarFallback class=\"rounded-sm text-[10px]\">{{\n initials(tenantNameText(tenant))\n }}</AvatarFallback>\n </Avatar>\n <NavLabel class=\"flex-1 truncate\" :text=\"tenant.name\" :html=\"tenant.nameHtml\" />\n <CheckIcon v-if=\"String(tenant.id) === String(current.id)\" class=\"size-4\" />\n </DropdownMenuItem>\n <DropdownMenuSeparator\n v-if=\"\n hasSwitcher && (tenancy.registrationUrl || tenancy.profileUrl || tenancy.menu?.length)\n \"\n />\n <MenuItemEntry v-if=\"tenancy.profile\" :item=\"tenancy.profile\" menu=\"tenantMenu\" />\n <DropdownMenuItem v-else-if=\"tenancy.profileUrl\" as-child>\n <Link :href=\"tenancy.profileUrl\" class=\"w-full\"\n ><Icon name=\"alfakit::panels.tenant-menu.profile-button\" :fallback=\"SettingsIcon\" />\n {{ tenancy.profileLabel ?? t('tenancy.profile', {}, 'Settings') }}</Link\n >\n </DropdownMenuItem>\n <MenuItemEntries v-if=\"tenancy.menu\" :items=\"tenancy.menu\" menu=\"tenantMenu\" />\n <MenuItemEntry v-if=\"tenancy.registration\" :item=\"tenancy.registration\" menu=\"tenantMenu\" />\n <DropdownMenuItem v-else-if=\"tenancy.registrationUrl\" as-child>\n <Link :href=\"tenancy.registrationUrl\" class=\"w-full\"\n ><Icon name=\"alfakit::panels.tenant-menu.registration-button\" :fallback=\"PlusIcon\" />\n {{ tenancy.registrationLabel ?? t('tenancy.register', {}, 'New') }}</Link\n >\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n</template>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"GroupHeaderRow.js","names":["_sfc_main","GroupHeaderRow_vue_vue_type_script_setup_true_lang_default","GroupHeaderRow_default"],"sources":["../../../src/components/table/GroupHeaderRow.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { TableRecordGroupSchema } from '@alfakit/core'\nimport { ChevronDownIcon, ChevronRightIcon } from '@lucide/vue'\nimport { computed } from 'vue'\nimport { useT } from '../../context'\nimport { Icon } from '../../lib/icons'\nimport Checkbox from '../ui/Checkbox.vue'\nimport TableCell from '../ui/TableCell.vue'\nimport TableRow from '../ui/TableRow.vue'\n\n/** A group heading row (`data-slot=\"table-group\"`), with a collapse toggle when collapsible. */\nconst props = defineProps<{\n group: TableRecordGroupSchema\n collapsed: boolean\n collapsible: boolean\n colSpan: number\n /** `selectGroupsOnly()`: a checkbox selecting the group's records on the page. */\n selection?: { checked: boolean | 'indeterminate'; onChange: (checked: boolean) => void }\n}>()\nconst emit = defineEmits<{ toggle: [] }>()\nconst t = useT()\n\nconst toggleLabel = computed(\n () =>\n `${props.collapsed ? t('table_grouping.expand', {}, 'Expand group') : t('table_grouping.collapse', {}, 'Collapse group')}: ${props.group.title}`,\n)\n</script>\n\n<template>\n <TableRow data-slot=\"table-group\" class=\"bg-muted/50 hover:bg-muted/50\">\n <TableCell :colspan=\"props.colSpan\" class=\"py-2\">\n <span class=\"flex items-center gap-3\">\n <Checkbox\n v-if=\"props.selection\"\n :model-value=\"props.selection.checked\"\n :aria-label=\"t('table.select_group', { group: props.group.title }, 'Select group :group')\"\n @update:model-value=\"props.selection.onChange($event === true)\"\n />\n <button\n v-if=\"props.collapsible\"\n type=\"button\"\n class=\"focus-visible:ring-ring/50 flex items-center gap-2 rounded-sm text-start outline-none focus-visible:ring-[3px]\"\n :aria-expanded=\"!props.collapsed\"\n :aria-label=\"toggleLabel\"\n @click=\"emit('toggle')\"\n >\n <ChevronRightIcon\n v-if=\"props.collapsed\"\n class=\"size-4 shrink-0 rtl:rotate-180\"\n aria-hidden=\"true\"\n />\n <Icon\n v-else\n name=\"alfakit::tables.grouping.collapse-button\"\n :fallback=\"ChevronDownIcon\"\n class=\"size-4 shrink-0\"\n aria-hidden=\"true\"\n />\n <span class=\"flex flex-col items-start\">\n <span class=\"font-medium\">{{ props.group.title }}</span>\n <span\n v-if=\"props.group.description\"\n class=\"text-muted-foreground text-xs font-normal\"\n >{{ props.group.description }}</span\n >\n </span>\n </button>\n <span v-else class=\"flex flex-col items-start\">\n <span class=\"font-medium\">{{ props.group.title }}</span>\n <span v-if=\"props.group.description\" class=\"text-muted-foreground text-xs font-normal\">{{\n props.group.description\n }}</span>\n </span>\n </span>\n </TableCell>\n </TableRow>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"GroupHeaderRow.js","names":["_sfc_main","GroupHeaderRow_vue_vue_type_script_setup_true_lang_default","GroupHeaderRow_default"],"sources":["../../../src/components/table/GroupHeaderRow.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { TableRecordGroupSchema } from '@alfakit/core'\nimport { ChevronDownIcon, ChevronRightIcon } from '@lucide/vue'\nimport { computed } from 'vue'\nimport { useT } from '../../context'\nimport { colorClass, textColorClasses } from '../../lib/colors'\nimport { Icon } from '../../lib/icons'\nimport Checkbox from '../ui/Checkbox.vue'\nimport TableCell from '../ui/TableCell.vue'\nimport TableRow from '../ui/TableRow.vue'\n\n/** A group heading row (`data-slot=\"table-group\"`), with a collapse toggle when collapsible. */\nconst props = defineProps<{\n group: TableRecordGroupSchema\n collapsed: boolean\n collapsible: boolean\n colSpan: number\n /** `selectGroupsOnly()`: a checkbox selecting the group's records on the page. */\n selection?: { checked: boolean | 'indeterminate'; onChange: (checked: boolean) => void }\n}>()\nconst emit = defineEmits<{ toggle: [] }>()\nconst t = useT()\n\n// An enum group shows its `HasIcon` icon, in its `HasColor` colour, before the title.\nconst groupIconClass = computed(\n () => `size-4 shrink-0 ${colorClass(textColorClasses, props.group.color, 'gray')}`,\n)\n\nconst toggleLabel = computed(\n () =>\n `${props.collapsed ? t('table_grouping.expand', {}, 'Expand group') : t('table_grouping.collapse', {}, 'Collapse group')}: ${props.group.title}`,\n)\n</script>\n\n<template>\n <TableRow data-slot=\"table-group\" class=\"bg-muted/50 hover:bg-muted/50\">\n <TableCell :colspan=\"props.colSpan\" class=\"py-2\">\n <span class=\"flex items-center gap-3\">\n <Checkbox\n v-if=\"props.selection\"\n :model-value=\"props.selection.checked\"\n :aria-label=\"t('table.select_group', { group: props.group.title }, 'Select group :group')\"\n @update:model-value=\"props.selection.onChange($event === true)\"\n />\n <button\n v-if=\"props.collapsible\"\n type=\"button\"\n class=\"focus-visible:ring-ring/50 flex items-center gap-2 rounded-sm text-start outline-none focus-visible:ring-[3px]\"\n :aria-expanded=\"!props.collapsed\"\n :aria-label=\"toggleLabel\"\n @click=\"emit('toggle')\"\n >\n <ChevronRightIcon\n v-if=\"props.collapsed\"\n class=\"size-4 shrink-0 rtl:rotate-180\"\n aria-hidden=\"true\"\n />\n <Icon\n v-else\n name=\"alfakit::tables.grouping.collapse-button\"\n :fallback=\"ChevronDownIcon\"\n class=\"size-4 shrink-0\"\n aria-hidden=\"true\"\n />\n <Icon\n v-if=\"props.group.icon\"\n :name=\"props.group.icon\"\n :class=\"groupIconClass\"\n aria-hidden=\"true\"\n />\n <span class=\"flex flex-col items-start\">\n <span class=\"font-medium\">{{ props.group.title }}</span>\n <span\n v-if=\"props.group.description\"\n class=\"text-muted-foreground text-xs font-normal\"\n >{{ props.group.description }}</span\n >\n </span>\n </button>\n <span\n v-else-if=\"props.group.icon\"\n data-slot=\"table-group-title\"\n class=\"flex items-center gap-2\"\n >\n <Icon :name=\"props.group.icon\" :class=\"groupIconClass\" aria-hidden=\"true\" />\n <span class=\"flex flex-col items-start\">\n <span class=\"font-medium\">{{ props.group.title }}</span>\n <span\n v-if=\"props.group.description\"\n class=\"text-muted-foreground text-xs font-normal\"\n >{{ props.group.description }}</span\n >\n </span>\n </span>\n <span v-else class=\"flex flex-col items-start\">\n <span class=\"font-medium\">{{ props.group.title }}</span>\n <span v-if=\"props.group.description\" class=\"text-muted-foreground text-xs font-normal\">{{\n props.group.description\n }}</span>\n </span>\n </span>\n </TableCell>\n </TableRow>\n</template>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"GroupHeaderRow.vue.d.ts","sourceRoot":"","sources":["../../../src/components/table/GroupHeaderRow.vue"],"names":[],"mappings":"AA+EA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAS3D,gGAAgG;AAChG,KAAK,WAAW,GAAG;IACjB,KAAK,EAAE,sBAAsB,CAAA;IAC7B,SAAS,EAAE,OAAO,CAAA;IAClB,WAAW,EAAE,OAAO,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,kFAAkF;IAClF,SAAS,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,GAAG,eAAe,CAAC;QAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;KAAE,CAAA;CACzF,CAAC;;;;;;AA4MF,wBAOG"}
1
+ {"version":3,"file":"GroupHeaderRow.vue.d.ts","sourceRoot":"","sources":["../../../src/components/table/GroupHeaderRow.vue"],"names":[],"mappings":"AA0GA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAU3D,gGAAgG;AAChG,KAAK,WAAW,GAAG;IACjB,KAAK,EAAE,sBAAsB,CAAA;IAC7B,SAAS,EAAE,OAAO,CAAA;IAClB,WAAW,EAAE,OAAO,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,kFAAkF;IAClF,SAAS,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,GAAG,eAAe,CAAC;QAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;KAAE,CAAA;CACzF,CAAC;;;;;;AA2QF,wBAOG"}
@@ -1,21 +1,29 @@
1
1
  import { useT as e } from "../../context.js";
2
- import t from "../../lib/Icon.js";
3
- import n from "../ui/Checkbox.js";
4
- import r from "../ui/TableCell.js";
5
- import i from "../ui/TableRow.js";
6
- import { computed as a, createBlock as o, createCommentVNode as s, createElementBlock as c, createElementVNode as l, createVNode as u, defineComponent as d, openBlock as f, toDisplayString as p, unref as m, withCtx as h } from "vue";
7
- import { ChevronDownIcon as g, ChevronRightIcon as _ } from "@lucide/vue";
2
+ import { colorClass as t, textColorClasses as n } from "../../lib/colors.js";
3
+ import r from "../../lib/Icon.js";
4
+ import i from "../ui/Checkbox.js";
5
+ import a from "../ui/TableCell.js";
6
+ import o from "../ui/TableRow.js";
7
+ import { computed as s, createBlock as c, createCommentVNode as l, createElementBlock as u, createElementVNode as d, createVNode as f, defineComponent as p, normalizeClass as m, openBlock as h, toDisplayString as g, unref as _, withCtx as v } from "vue";
8
+ import { ChevronDownIcon as y, ChevronRightIcon as b } from "@lucide/vue";
8
9
  //#region src/components/table/GroupHeaderRow.vue?vue&type=script&setup=true&lang.ts
9
- var v = { class: "flex items-center gap-3" }, y = ["aria-expanded", "aria-label"], b = { class: "flex flex-col items-start" }, x = { class: "font-medium" }, S = {
10
+ var x = { class: "flex items-center gap-3" }, S = ["aria-expanded", "aria-label"], C = { class: "flex flex-col items-start" }, w = { class: "font-medium" }, T = {
10
11
  key: 0,
11
12
  class: "text-muted-foreground text-xs font-normal"
12
- }, C = {
13
+ }, E = {
13
14
  key: 2,
15
+ "data-slot": "table-group-title",
16
+ class: "flex items-center gap-2"
17
+ }, D = { class: "flex flex-col items-start" }, O = { class: "font-medium" }, k = {
18
+ key: 0,
19
+ class: "text-muted-foreground text-xs font-normal"
20
+ }, A = {
21
+ key: 3,
14
22
  class: "flex flex-col items-start"
15
- }, w = { class: "font-medium" }, T = {
23
+ }, j = { class: "font-medium" }, M = {
16
24
  key: 0,
17
25
  class: "text-muted-foreground text-xs font-normal"
18
- }, E = /*@__PURE__*/ d({
26
+ }, N = /*@__PURE__*/ p({
19
27
  __name: "GroupHeaderRow",
20
28
  props: {
21
29
  group: {},
@@ -25,39 +33,52 @@ var v = { class: "flex items-center gap-3" }, y = ["aria-expanded", "aria-label"
25
33
  selection: {}
26
34
  },
27
35
  emits: ["toggle"],
28
- setup(d, { emit: E }) {
29
- let D = d, O = E, k = e(), A = a(() => `${D.collapsed ? k("table_grouping.expand", {}, "Expand group") : k("table_grouping.collapse", {}, "Collapse group")}: ${D.group.title}`);
30
- return (e, a) => (f(), o(i, {
36
+ setup(p, { emit: N }) {
37
+ let P = p, F = N, I = e(), L = s(() => `size-4 shrink-0 ${t(n, P.group.color, "gray")}`), R = s(() => `${P.collapsed ? I("table_grouping.expand", {}, "Expand group") : I("table_grouping.collapse", {}, "Collapse group")}: ${P.group.title}`);
38
+ return (e, t) => (h(), c(o, {
31
39
  "data-slot": "table-group",
32
40
  class: "bg-muted/50 hover:bg-muted/50"
33
41
  }, {
34
- default: h(() => [u(r, {
35
- colspan: D.colSpan,
42
+ default: v(() => [f(a, {
43
+ colspan: P.colSpan,
36
44
  class: "py-2"
37
45
  }, {
38
- default: h(() => [l("span", v, [D.selection ? (f(), o(n, {
46
+ default: v(() => [d("span", x, [P.selection ? (h(), c(i, {
39
47
  key: 0,
40
- "model-value": D.selection.checked,
41
- "aria-label": m(k)("table.select_group", { group: D.group.title }, "Select group :group"),
42
- "onUpdate:modelValue": a[0] ||= (e) => D.selection.onChange(e === !0)
43
- }, null, 8, ["model-value", "aria-label"])) : s("", !0), D.collapsible ? (f(), c("button", {
48
+ "model-value": P.selection.checked,
49
+ "aria-label": _(I)("table.select_group", { group: P.group.title }, "Select group :group"),
50
+ "onUpdate:modelValue": t[0] ||= (e) => P.selection.onChange(e === !0)
51
+ }, null, 8, ["model-value", "aria-label"])) : l("", !0), P.collapsible ? (h(), u("button", {
44
52
  key: 1,
45
53
  type: "button",
46
54
  class: "focus-visible:ring-ring/50 flex items-center gap-2 rounded-sm text-start outline-none focus-visible:ring-[3px]",
47
- "aria-expanded": !D.collapsed,
48
- "aria-label": A.value,
49
- onClick: a[1] ||= (e) => O("toggle")
50
- }, [D.collapsed ? (f(), o(m(_), {
51
- key: 0,
52
- class: "size-4 shrink-0 rtl:rotate-180",
53
- "aria-hidden": "true"
54
- })) : (f(), o(m(t), {
55
- key: 1,
56
- name: "alfakit::tables.grouping.collapse-button",
57
- fallback: m(g),
58
- class: "size-4 shrink-0",
55
+ "aria-expanded": !P.collapsed,
56
+ "aria-label": R.value,
57
+ onClick: t[1] ||= (e) => F("toggle")
58
+ }, [
59
+ P.collapsed ? (h(), c(_(b), {
60
+ key: 0,
61
+ class: "size-4 shrink-0 rtl:rotate-180",
62
+ "aria-hidden": "true"
63
+ })) : (h(), c(_(r), {
64
+ key: 1,
65
+ name: "alfakit::tables.grouping.collapse-button",
66
+ fallback: _(y),
67
+ class: "size-4 shrink-0",
68
+ "aria-hidden": "true"
69
+ }, null, 8, ["fallback"])),
70
+ P.group.icon ? (h(), c(_(r), {
71
+ key: 2,
72
+ name: P.group.icon,
73
+ class: m(L.value),
74
+ "aria-hidden": "true"
75
+ }, null, 8, ["name", "class"])) : l("", !0),
76
+ d("span", C, [d("span", w, g(P.group.title), 1), P.group.description ? (h(), u("span", T, g(P.group.description), 1)) : l("", !0)])
77
+ ], 8, S)) : P.group.icon ? (h(), u("span", E, [f(_(r), {
78
+ name: P.group.icon,
79
+ class: m(L.value),
59
80
  "aria-hidden": "true"
60
- }, null, 8, ["fallback"])), l("span", b, [l("span", x, p(D.group.title), 1), D.group.description ? (f(), c("span", S, p(D.group.description), 1)) : s("", !0)])], 8, y)) : (f(), c("span", C, [l("span", w, p(D.group.title), 1), D.group.description ? (f(), c("span", T, p(D.group.description), 1)) : s("", !0)]))])]),
81
+ }, null, 8, ["name", "class"]), d("span", D, [d("span", O, g(P.group.title), 1), P.group.description ? (h(), u("span", k, g(P.group.description), 1)) : l("", !0)])])) : (h(), u("span", A, [d("span", j, g(P.group.title), 1), P.group.description ? (h(), u("span", M, g(P.group.description), 1)) : l("", !0)]))])]),
61
82
  _: 1
62
83
  }, 8, ["colspan"])]),
63
84
  _: 1
@@ -65,6 +86,6 @@ var v = { class: "flex items-center gap-3" }, y = ["aria-expanded", "aria-label"
65
86
  }
66
87
  });
67
88
  //#endregion
68
- export { E as default };
89
+ export { N as default };
69
90
 
70
91
  //# sourceMappingURL=GroupHeaderRow.vue_vue_type_script_setup_true_lang.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GroupHeaderRow.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","TableRow","_withCtx","_createVNode","TableCell","_createElementVNode","Checkbox","_unref","_createCommentVNode","_createElementBlock","Icon","_toDisplayString","Icon_default","Checkbox_default","TableCell_default","TableRow_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","GroupHeaderRow_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","t","useT","toggleLabel","computed","openBlock","createBlock","withCtx","createVNode","createElementVNode","unref","_cache","$event","createCommentVNode","createElementBlock","ChevronRightIcon","ChevronDownIcon","toDisplayString"],"sources":["../../../src/components/table/GroupHeaderRow.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { TableRecordGroupSchema } from '@alfakit/core'\nimport { ChevronDownIcon, ChevronRightIcon } from '@lucide/vue'\nimport { computed } from 'vue'\nimport { useT } from '../../context'\nimport { Icon } from '../../lib/icons'\nimport Checkbox from '../ui/Checkbox.vue'\nimport TableCell from '../ui/TableCell.vue'\nimport TableRow from '../ui/TableRow.vue'\n\n/** A group heading row (`data-slot=\"table-group\"`), with a collapse toggle when collapsible. */\nconst props = defineProps<{\n group: TableRecordGroupSchema\n collapsed: boolean\n collapsible: boolean\n colSpan: number\n /** `selectGroupsOnly()`: a checkbox selecting the group's records on the page. */\n selection?: { checked: boolean | 'indeterminate'; onChange: (checked: boolean) => void }\n}>()\nconst emit = defineEmits<{ toggle: [] }>()\nconst t = useT()\n\nconst toggleLabel = computed(\n () =>\n `${props.collapsed ? t('table_grouping.expand', {}, 'Expand group') : t('table_grouping.collapse', {}, 'Collapse group')}: ${props.group.title}`,\n)\n</script>\n\n<template>\n <TableRow data-slot=\"table-group\" class=\"bg-muted/50 hover:bg-muted/50\">\n <TableCell :colspan=\"props.colSpan\" class=\"py-2\">\n <span class=\"flex items-center gap-3\">\n <Checkbox\n v-if=\"props.selection\"\n :model-value=\"props.selection.checked\"\n :aria-label=\"t('table.select_group', { group: props.group.title }, 'Select group :group')\"\n @update:model-value=\"props.selection.onChange($event === true)\"\n />\n <button\n v-if=\"props.collapsible\"\n type=\"button\"\n class=\"focus-visible:ring-ring/50 flex items-center gap-2 rounded-sm text-start outline-none focus-visible:ring-[3px]\"\n :aria-expanded=\"!props.collapsed\"\n :aria-label=\"toggleLabel\"\n @click=\"emit('toggle')\"\n >\n <ChevronRightIcon\n v-if=\"props.collapsed\"\n class=\"size-4 shrink-0 rtl:rotate-180\"\n aria-hidden=\"true\"\n />\n <Icon\n v-else\n name=\"alfakit::tables.grouping.collapse-button\"\n :fallback=\"ChevronDownIcon\"\n class=\"size-4 shrink-0\"\n aria-hidden=\"true\"\n />\n <span class=\"flex flex-col items-start\">\n <span class=\"font-medium\">{{ props.group.title }}</span>\n <span\n v-if=\"props.group.description\"\n class=\"text-muted-foreground text-xs font-normal\"\n >{{ props.group.description }}</span\n >\n </span>\n </button>\n <span v-else class=\"flex flex-col items-start\">\n <span class=\"font-medium\">{{ props.group.title }}</span>\n <span v-if=\"props.group.description\" class=\"text-muted-foreground text-xs font-normal\">{{\n props.group.description\n }}</span>\n </span>\n </span>\n </TableCell>\n </TableRow>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWA,IAAM2B,IAAQC,GAQRC,IAAOH,GACPI,IAAIC,EAAK,GAETC,IAAcC,QAEhB,GAAGN,EAAM,YAAYG,EAAE,yBAAyB,CAAC,GAAG,cAAc,IAAIA,EAAE,2BAA2B,CAAC,GAAG,gBAAgB,EAAE,IAAIH,EAAM,MAAM,OAC7I;oBAIE3B,EAAA,GAAAC,EA8CWC,GAAA;GA9CD,aAAU;GAAc,OAAM;;GACtC,SAAAC,QA4CY,CA5CZC,EA4CYC,GAAA;IA5CA,SAASsB,EAAM;IAAS,OAAM;;IACxC,SAAAxB,QA0CO,CA1CPG,EA0CO,QA1CPW,GA0CO,CAxCGU,EAAM,aADd3B,EAAA,GAAAC,EAKEM,GAAA;;KAHC,eAAaoB,EAAM,UAAU;KAC7B,cAAYnB,EAAAsB,CAAA,CAAC,CAAA,sBAAA,EAAA,OAAgCH,EAAM,MAAM,MAAK,GAAA,qBAAA;KAC9D,uBAAkB,AAAAa,EAAA,QAAA,MAAEb,EAAM,UAAU,SAASc,MAAM,EAAA;IAG9C,GAAA,MAAA,GAAA,CAAA,eAAA,YAAA,CAAA,KAAAC,EAAA,IAAA,EAAA,GAAAf,EAAM,eADd3B,EAAA,GAAAU,EA4BS,UAAA;;KA1BP,MAAK;KACL,OAAM;KACL,iBAAa,CAAGiB,EAAM;KACtB,cAAYK,EAAA;KACZ,SAAK,AAAAQ,EAAA,QAAA,MAAEX,EAAI,QAAA;IAGJ,GAAA,CAAAF,EAAM,aADd3B,EAAA,GAAAC,EAIEO,EAAAoC,CAAA,GAAA;;KAFA,OAAM;KACN,eAAY;IAEd5C,CAAAA,MAAAA,EAAA,GAAAC,EAMEO,EAAAG,CAAA,GAAA;;KAJA,MAAK;KACJ,UAAUH,EAAAqC,CAAA;KACX,OAAM;KACN,eAAY;IAEdvC,GAAAA,MAAAA,GAAAA,CAAAA,UAAAA,CAAAA,IAAAA,EAOO,QAPPa,GAOO,CANLb,EAAwD,QAAxDc,GAAwDR,EAA3Be,EAAM,MAAM,KAAK,GAAA,CAAA,GAEtCA,EAAM,MAAM,eADpB3B,EAAA,GAAAU,EAIC,QAJDW,GAICT,EADKe,EAAM,MAAM,WAAW,GAAA,CAAA,KAAAe,EAAA,IAAA,EAAA,CAAA,CAAA,CAAA,GAAA,GAAAxB,CAAA,MAIjClB,EAAA,GAAAU,EAKO,QALPY,GAKO,CAJLhB,EAAwD,QAAxDiB,GAAwDX,EAA3Be,EAAM,MAAM,KAAK,GAAA,CAAA,GAClCA,EAAM,MAAM,eAAxB3B,EAAA,GAAAU,EAES,QAFTc,GAESZ,EADPe,EAAM,MAAM,WAAW,GAAA,CAAA,KAAAe,EAAA,IAAA,EAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"GroupHeaderRow.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","TableRow","_withCtx","_createVNode","TableCell","_createElementVNode","Checkbox","_unref","_createCommentVNode","_createElementBlock","Icon","_normalizeClass","_toDisplayString","Icon_default","Checkbox_default","TableCell_default","TableRow_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","GroupHeaderRow_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","t","useT","groupIconClass","computed","colorClass","textColorClasses","toggleLabel","openBlock","createBlock","withCtx","createVNode","createElementVNode","unref","_cache","$event","createCommentVNode","createElementBlock","ChevronRightIcon","ChevronDownIcon","normalizeClass","toDisplayString"],"sources":["../../../src/components/table/GroupHeaderRow.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { TableRecordGroupSchema } from '@alfakit/core'\nimport { ChevronDownIcon, ChevronRightIcon } from '@lucide/vue'\nimport { computed } from 'vue'\nimport { useT } from '../../context'\nimport { colorClass, textColorClasses } from '../../lib/colors'\nimport { Icon } from '../../lib/icons'\nimport Checkbox from '../ui/Checkbox.vue'\nimport TableCell from '../ui/TableCell.vue'\nimport TableRow from '../ui/TableRow.vue'\n\n/** A group heading row (`data-slot=\"table-group\"`), with a collapse toggle when collapsible. */\nconst props = defineProps<{\n group: TableRecordGroupSchema\n collapsed: boolean\n collapsible: boolean\n colSpan: number\n /** `selectGroupsOnly()`: a checkbox selecting the group's records on the page. */\n selection?: { checked: boolean | 'indeterminate'; onChange: (checked: boolean) => void }\n}>()\nconst emit = defineEmits<{ toggle: [] }>()\nconst t = useT()\n\n// An enum group shows its `HasIcon` icon, in its `HasColor` colour, before the title.\nconst groupIconClass = computed(\n () => `size-4 shrink-0 ${colorClass(textColorClasses, props.group.color, 'gray')}`,\n)\n\nconst toggleLabel = computed(\n () =>\n `${props.collapsed ? t('table_grouping.expand', {}, 'Expand group') : t('table_grouping.collapse', {}, 'Collapse group')}: ${props.group.title}`,\n)\n</script>\n\n<template>\n <TableRow data-slot=\"table-group\" class=\"bg-muted/50 hover:bg-muted/50\">\n <TableCell :colspan=\"props.colSpan\" class=\"py-2\">\n <span class=\"flex items-center gap-3\">\n <Checkbox\n v-if=\"props.selection\"\n :model-value=\"props.selection.checked\"\n :aria-label=\"t('table.select_group', { group: props.group.title }, 'Select group :group')\"\n @update:model-value=\"props.selection.onChange($event === true)\"\n />\n <button\n v-if=\"props.collapsible\"\n type=\"button\"\n class=\"focus-visible:ring-ring/50 flex items-center gap-2 rounded-sm text-start outline-none focus-visible:ring-[3px]\"\n :aria-expanded=\"!props.collapsed\"\n :aria-label=\"toggleLabel\"\n @click=\"emit('toggle')\"\n >\n <ChevronRightIcon\n v-if=\"props.collapsed\"\n class=\"size-4 shrink-0 rtl:rotate-180\"\n aria-hidden=\"true\"\n />\n <Icon\n v-else\n name=\"alfakit::tables.grouping.collapse-button\"\n :fallback=\"ChevronDownIcon\"\n class=\"size-4 shrink-0\"\n aria-hidden=\"true\"\n />\n <Icon\n v-if=\"props.group.icon\"\n :name=\"props.group.icon\"\n :class=\"groupIconClass\"\n aria-hidden=\"true\"\n />\n <span class=\"flex flex-col items-start\">\n <span class=\"font-medium\">{{ props.group.title }}</span>\n <span\n v-if=\"props.group.description\"\n class=\"text-muted-foreground text-xs font-normal\"\n >{{ props.group.description }}</span\n >\n </span>\n </button>\n <span\n v-else-if=\"props.group.icon\"\n data-slot=\"table-group-title\"\n class=\"flex items-center gap-2\"\n >\n <Icon :name=\"props.group.icon\" :class=\"groupIconClass\" aria-hidden=\"true\" />\n <span class=\"flex flex-col items-start\">\n <span class=\"font-medium\">{{ props.group.title }}</span>\n <span\n v-if=\"props.group.description\"\n class=\"text-muted-foreground text-xs font-normal\"\n >{{ props.group.description }}</span\n >\n </span>\n </span>\n <span v-else class=\"flex flex-col items-start\">\n <span class=\"font-medium\">{{ props.group.title }}</span>\n <span v-if=\"props.group.description\" class=\"text-muted-foreground text-xs font-normal\">{{\n props.group.description\n }}</span>\n </span>\n </span>\n </TableCell>\n </TableRow>\n</template>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"SelectCell.js","names":["_sfc_main","SelectCell_vue_vue_type_script_setup_true_lang_default","SelectCell_default"],"sources":["../../../src/components/table/SelectCell.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { SelectColumnSchema } from '@alfakit/core'\nimport { isOptionGroup } from '@alfakit/core'\nimport { computed, ref } from 'vue'\nimport { cn } from '../../lib/utils'\nimport { useCellUpdate, type CellProps } from './cell-update'\n\nconst props = defineProps<CellProps>()\nconst schema = computed(() => props.column as SelectColumnSchema)\nconst { update, saving, error } = useCellUpdate(props)\nconst value = ref(\n props.cell.state === null || props.cell.state === undefined ? '' : String(props.cell.state),\n)\n// `optionsRelationship(ignoreRecord: true)`: the record itself is not an option.\nconst options = computed(() =>\n schema.value.options\n .flatMap((option) => (isOptionGroup(option) ? option.options : [option]))\n .filter((option) => !(schema.value.ignoreRecord && option.value === String(props.recordKey))),\n)\n\nconst onChange = (event: Event) => {\n value.value = (event.target as HTMLSelectElement).value\n void update(value.value === '' ? null : value.value)\n}\n</script>\n\n<template>\n <span @click.stop>\n <select\n :value=\"value\"\n :disabled=\"Boolean(props.cell.disabled) || saving\"\n :aria-invalid=\"error ? true : undefined\"\n :class=\"\n cn(\n 'border-input dark:bg-input/30 focus-visible:ring-ring/50 h-8 min-w-32 rounded-md border bg-transparent px-2 text-sm shadow-xs outline-none focus-visible:ring-[3px]',\n error && 'border-destructive',\n )\n \"\n @change=\"onChange\"\n >\n <option v-if=\"schema.selectablePlaceholder\" value=\"\">{{ schema.placeholder ?? '' }}</option>\n <option\n v-for=\"option in options\"\n :key=\"option.value\"\n :value=\"option.value\"\n :disabled=\"option.disabled\"\n >\n {{ option.label }}\n </option>\n </select>\n <span v-if=\"error\" class=\"text-destructive block text-xs\">{{ error }}</span>\n </span>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"SelectCell.js","names":["_sfc_main","SelectCell_vue_vue_type_script_setup_true_lang_default","SelectCell_default"],"sources":["../../../src/components/table/SelectCell.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { SelectColumnSchema } from '@alfakit/core'\nimport { isOptionGroup } from '@alfakit/core'\nimport { computed, ref, useId } from 'vue'\nimport { cn } from '../../lib/utils'\nimport { useCellUpdate, type CellProps } from './cell-update'\n\nconst props = defineProps<CellProps>()\nconst schema = computed(() => props.column as SelectColumnSchema)\nconst { update, saving, error } = useCellUpdate(props)\nconst errorId = useId()\nconst value = ref(\n props.cell.state === null || props.cell.state === undefined ? '' : String(props.cell.state),\n)\n// `optionsRelationship(ignoreRecord: true)`: the record itself is not an option.\nconst options = computed(() =>\n schema.value.options\n .flatMap((option) => (isOptionGroup(option) ? option.options : [option]))\n .filter((option) => !(schema.value.ignoreRecord && option.value === String(props.recordKey))),\n)\n\nconst onChange = (event: Event) => {\n value.value = (event.target as HTMLSelectElement).value\n void update(value.value === '' ? null : value.value)\n}\n</script>\n\n<template>\n <span @click.stop>\n <select\n :value=\"value\"\n :disabled=\"Boolean(props.cell.disabled) || saving\"\n :aria-label=\"props.column.label || props.column.name\"\n :aria-invalid=\"error ? true : undefined\"\n :aria-describedby=\"error ? errorId : undefined\"\n :class=\"\n cn(\n 'border-input dark:bg-input/30 focus-visible:ring-ring/50 h-8 min-w-32 rounded-md border bg-transparent px-2 text-sm shadow-xs outline-none focus-visible:ring-[3px]',\n error && 'border-destructive',\n )\n \"\n @change=\"onChange\"\n >\n <option v-if=\"schema.selectablePlaceholder\" value=\"\">{{ schema.placeholder ?? '' }}</option>\n <option\n v-for=\"option in options\"\n :key=\"option.value\"\n :value=\"option.value\"\n :disabled=\"option.disabled\"\n >\n {{ option.label }}\n </option>\n </select>\n <span v-if=\"error\" :id=\"errorId\" class=\"text-destructive block text-xs\">{{ error }}</span>\n </span>\n</template>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"SelectCell.vue.d.ts","sourceRoot":"","sources":["../../../src/components/table/SelectCell.vue"],"names":[],"mappings":"AA2DA,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,eAAe,CAAA;;AA6F7D,wBAMG"}
1
+ {"version":3,"file":"SelectCell.vue.d.ts","sourceRoot":"","sources":["../../../src/components/table/SelectCell.vue"],"names":[],"mappings":"AA8DA,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,eAAe,CAAA;;AAkG7D,wBAMG"}