@alfakit/vue 0.1.8 → 0.1.10

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 (168) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/app/components.d.ts.map +1 -1
  3. package/dist/app/components.js +1 -0
  4. package/dist/app/components.js.map +1 -1
  5. package/dist/components/actions/ActionModal.js.map +1 -1
  6. package/dist/components/actions/ActionModal.vue.d.ts.map +1 -1
  7. package/dist/components/actions/ActionModal.vue_vue_type_script_setup_true_lang.js +1 -1
  8. package/dist/components/actions/ActionModal.vue_vue_type_script_setup_true_lang.js.map +1 -1
  9. package/dist/components/dev-tools/DevToolsInspector.js.map +1 -1
  10. package/dist/components/dev-tools/DevToolsInspector.vue.d.ts.map +1 -1
  11. package/dist/components/dev-tools/DevToolsInspector.vue_vue_type_script_setup_true_lang.js +1 -1
  12. package/dist/components/dev-tools/DevToolsInspector.vue_vue_type_script_setup_true_lang.js.map +1 -1
  13. package/dist/components/fields/CheckboxListField.js.map +1 -1
  14. package/dist/components/fields/CheckboxListField.vue.d.ts.map +1 -1
  15. package/dist/components/fields/CheckboxListField.vue_vue_type_script_setup_true_lang.js +2 -2
  16. package/dist/components/fields/CheckboxListField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  17. package/dist/components/fields/DatePickerField.js.map +1 -1
  18. package/dist/components/fields/DatePickerField.vue.d.ts.map +1 -1
  19. package/dist/components/fields/DatePickerField.vue_vue_type_script_setup_true_lang.js +34 -32
  20. package/dist/components/fields/DatePickerField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  21. package/dist/components/fields/RichEditorSuggestions.js.map +1 -1
  22. package/dist/components/fields/RichEditorSuggestions.vue.d.ts +1 -1
  23. package/dist/components/fields/RichEditorSuggestions.vue.d.ts.map +1 -1
  24. package/dist/components/fields/RichEditorSuggestions.vue_vue_type_script_setup_true_lang.js +29 -23
  25. package/dist/components/fields/RichEditorSuggestions.vue_vue_type_script_setup_true_lang.js.map +1 -1
  26. package/dist/components/fields/RichEditorToolbarGroup.js.map +1 -1
  27. package/dist/components/fields/RichEditorToolbarGroup.vue.d.ts.map +1 -1
  28. package/dist/components/fields/RichEditorToolbarGroup.vue_vue_type_script_setup_true_lang.js +9 -4
  29. package/dist/components/fields/RichEditorToolbarGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  30. package/dist/components/file-manager/FileManagerView.js.map +1 -1
  31. package/dist/components/file-manager/FileManagerView.vue.d.ts.map +1 -1
  32. package/dist/components/file-manager/FileManagerView.vue_vue_type_script_setup_true_lang.js +5 -1
  33. package/dist/components/file-manager/FileManagerView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  34. package/dist/components/form/FormBlock.js.map +1 -1
  35. package/dist/components/form/FormBlock.vue.d.ts.map +1 -1
  36. package/dist/components/form/FormBlock.vue_vue_type_script_setup_true_lang.js +79 -78
  37. package/dist/components/form/FormBlock.vue_vue_type_script_setup_true_lang.js.map +1 -1
  38. package/dist/components/layout/CalloutComponent.js.map +1 -1
  39. package/dist/components/layout/CalloutComponent.vue.d.ts.map +1 -1
  40. package/dist/components/layout/CalloutComponent.vue_vue_type_script_setup_true_lang.js +43 -39
  41. package/dist/components/layout/CalloutComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  42. package/dist/components/layout/EmptyStateComponent.js.map +1 -1
  43. package/dist/components/layout/EmptyStateComponent.vue.d.ts.map +1 -1
  44. package/dist/components/layout/EmptyStateComponent.vue_vue_type_script_setup_true_lang.js +29 -26
  45. package/dist/components/layout/EmptyStateComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  46. package/dist/components/layout/MixedContent.js.map +1 -1
  47. package/dist/components/layout/MixedContent.vue.d.ts +5 -3
  48. package/dist/components/layout/MixedContent.vue.d.ts.map +1 -1
  49. package/dist/components/layout/MixedContent.vue_vue_type_script_setup_true_lang.js +5 -4
  50. package/dist/components/layout/MixedContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  51. package/dist/components/layout/SectionComponent.js.map +1 -1
  52. package/dist/components/layout/SectionComponent.vue.d.ts.map +1 -1
  53. package/dist/components/layout/SectionComponent.vue_vue_type_script_setup_true_lang.js +12 -8
  54. package/dist/components/layout/SectionComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  55. package/dist/components/notifications/NotificationsMenu.js.map +1 -1
  56. package/dist/components/notifications/NotificationsMenu.vue.d.ts.map +1 -1
  57. package/dist/components/notifications/NotificationsMenu.vue_vue_type_script_setup_true_lang.js +133 -104
  58. package/dist/components/notifications/NotificationsMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  59. package/dist/components/panel/BottomNav.js.map +1 -1
  60. package/dist/components/panel/BottomNav.vue_vue_type_script_setup_true_lang.js +2 -2
  61. package/dist/components/panel/BottomNav.vue_vue_type_script_setup_true_lang.js.map +1 -1
  62. package/dist/components/panel/KeyboardShortcuts.js.map +1 -1
  63. package/dist/components/panel/KeyboardShortcuts.vue_vue_type_script_setup_true_lang.js +1 -1
  64. package/dist/components/panel/KeyboardShortcuts.vue_vue_type_script_setup_true_lang.js.map +1 -1
  65. package/dist/components/panel/NavGroup.js.map +1 -1
  66. package/dist/components/panel/NavGroup.vue_vue_type_script_setup_true_lang.js +3 -3
  67. package/dist/components/panel/NavGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  68. package/dist/components/panel/NavItem.js.map +1 -1
  69. package/dist/components/panel/NavItem.vue.d.ts.map +1 -1
  70. package/dist/components/panel/NavItem.vue_vue_type_script_setup_true_lang.js +1 -1
  71. package/dist/components/panel/NavItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  72. package/dist/components/panel/NavSubItem.js.map +1 -1
  73. package/dist/components/panel/NavSubItem.vue.d.ts.map +1 -1
  74. package/dist/components/panel/NavSubItem.vue_vue_type_script_setup_true_lang.js +1 -1
  75. package/dist/components/panel/NavSubItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  76. package/dist/components/panel/ShortcutsOverlay.js.map +1 -1
  77. package/dist/components/panel/ShortcutsOverlay.vue.d.ts.map +1 -1
  78. package/dist/components/panel/ShortcutsOverlay.vue_vue_type_script_setup_true_lang.js +20 -19
  79. package/dist/components/panel/ShortcutsOverlay.vue_vue_type_script_setup_true_lang.js.map +1 -1
  80. package/dist/components/table/ColumnManager.js.map +1 -1
  81. package/dist/components/table/ColumnManager.vue.d.ts.map +1 -1
  82. package/dist/components/table/ColumnManager.vue_vue_type_script_setup_true_lang.js +6 -6
  83. package/dist/components/table/ColumnManager.vue_vue_type_script_setup_true_lang.js.map +1 -1
  84. package/dist/components/table/Spreadsheet.js.map +1 -1
  85. package/dist/components/table/Spreadsheet.vue.d.ts.map +1 -1
  86. package/dist/components/table/Spreadsheet.vue_vue_type_script_setup_true_lang.js +37 -33
  87. package/dist/components/table/Spreadsheet.vue_vue_type_script_setup_true_lang.js.map +1 -1
  88. package/dist/components/translation-manager/TranslationManagerView.js.map +1 -1
  89. package/dist/components/translation-manager/TranslationManagerView.vue.d.ts.map +1 -1
  90. package/dist/components/translation-manager/TranslationManagerView.vue_vue_type_script_setup_true_lang.js +1 -1
  91. package/dist/components/translation-manager/TranslationManagerView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  92. package/dist/components/ui/SidebarMenuButton.js.map +1 -1
  93. package/dist/components/ui/SidebarMenuButton.vue.d.ts.map +1 -1
  94. package/dist/components/ui/SidebarMenuButton.vue_vue_type_script_setup_true_lang.js +12 -12
  95. package/dist/components/ui/SidebarMenuButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  96. package/dist/components/ui/TooltipTrigger.js.map +1 -1
  97. package/dist/components/ui/TooltipTrigger.vue.d.ts +2 -2
  98. package/dist/components/ui/TooltipTrigger.vue.d.ts.map +1 -1
  99. package/dist/components/ui/TooltipTrigger.vue_vue_type_script_setup_true_lang.js +10 -7
  100. package/dist/components/ui/TooltipTrigger.vue_vue_type_script_setup_true_lang.js.map +1 -1
  101. package/dist/components/widgets/StatCard.js.map +1 -1
  102. package/dist/components/widgets/StatCard.vue.d.ts.map +1 -1
  103. package/dist/components/widgets/StatCard.vue_vue_type_script_setup_true_lang.js +30 -30
  104. package/dist/components/widgets/StatCard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  105. package/dist/eject-manifest.json +2 -2
  106. package/dist/layouts/TopNavLayout.js.map +1 -1
  107. package/dist/layouts/TopNavLayout.vue_vue_type_script_setup_true_lang.js +2 -2
  108. package/dist/layouts/TopNavLayout.vue_vue_type_script_setup_true_lang.js.map +1 -1
  109. package/dist/layouts/TopNavMenu.js.map +1 -1
  110. package/dist/layouts/TopNavMenu.vue_vue_type_script_setup_true_lang.js +1 -1
  111. package/dist/layouts/TopNavMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  112. package/dist/pages/AlfakitPage.js.map +1 -1
  113. package/dist/pages/AlfakitPage.vue.d.ts.map +1 -1
  114. package/dist/pages/AlfakitPage.vue_vue_type_script_setup_true_lang.js +16 -19
  115. package/dist/pages/AlfakitPage.vue_vue_type_script_setup_true_lang.js.map +1 -1
  116. package/dist/standalone/AlfakitComponent.js.map +1 -1
  117. package/dist/standalone/AlfakitComponent.vue.d.ts.map +1 -1
  118. package/dist/standalone/AlfakitComponent.vue_vue_type_script_setup_true_lang.js +29 -24
  119. package/dist/standalone/AlfakitComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  120. package/dist/standalone/runtime.d.ts.map +1 -1
  121. package/dist/standalone/runtime.js +25 -25
  122. package/dist/standalone/runtime.js.map +1 -1
  123. package/dist/standalone.css +12 -7
  124. package/dist/starter-kit/AlfakitStarterKitRoot.js.map +1 -1
  125. package/dist/starter-kit/AlfakitStarterKitRoot.vue.d.ts.map +1 -1
  126. package/dist/starter-kit/AlfakitStarterKitRoot.vue_vue_type_script_setup_true_lang.js +25 -21
  127. package/dist/starter-kit/AlfakitStarterKitRoot.vue_vue_type_script_setup_true_lang.js.map +1 -1
  128. package/dist/starter-kit/navigation.d.ts +6 -1
  129. package/dist/starter-kit/navigation.d.ts.map +1 -1
  130. package/dist/starter-kit/navigation.js +11 -10
  131. package/dist/starter-kit/navigation.js.map +1 -1
  132. package/dist/styles.css +2 -1
  133. package/dist/themes.css +4 -0
  134. package/package.json +2 -2
  135. package/src/app/components.ts +3 -0
  136. package/src/components/actions/ActionModal.vue +2 -0
  137. package/src/components/dev-tools/DevToolsInspector.vue +1 -1
  138. package/src/components/fields/CheckboxListField.vue +2 -2
  139. package/src/components/fields/DatePickerField.vue +1 -0
  140. package/src/components/fields/RichEditorSuggestions.vue +13 -6
  141. package/src/components/fields/RichEditorToolbarGroup.vue +16 -1
  142. package/src/components/file-manager/FileManagerView.vue +3 -1
  143. package/src/components/form/FormBlock.vue +15 -2
  144. package/src/components/layout/CalloutComponent.vue +15 -2
  145. package/src/components/layout/EmptyStateComponent.vue +10 -1
  146. package/src/components/layout/MixedContent.vue +12 -4
  147. package/src/components/layout/SectionComponent.vue +20 -4
  148. package/src/components/notifications/NotificationsMenu.vue +45 -1
  149. package/src/components/panel/BottomNav.vue +2 -2
  150. package/src/components/panel/KeyboardShortcuts.vue +1 -1
  151. package/src/components/panel/NavGroup.vue +3 -3
  152. package/src/components/panel/NavItem.vue +5 -1
  153. package/src/components/panel/NavSubItem.vue +5 -1
  154. package/src/components/panel/ShortcutsOverlay.vue +27 -22
  155. package/src/components/table/ColumnManager.vue +6 -4
  156. package/src/components/table/Spreadsheet.vue +9 -4
  157. package/src/components/translation-manager/TranslationManagerView.vue +1 -1
  158. package/src/components/ui/SidebarMenuButton.vue +6 -0
  159. package/src/components/ui/TooltipTrigger.vue +4 -1
  160. package/src/components/widgets/StatCard.vue +6 -3
  161. package/src/layouts/TopNavLayout.vue +2 -2
  162. package/src/layouts/TopNavMenu.vue +1 -1
  163. package/src/pages/AlfakitPage.vue +13 -3
  164. package/src/standalone/AlfakitComponent.vue +16 -5
  165. package/src/standalone/runtime.ts +3 -0
  166. package/src/starter-kit/AlfakitStarterKitRoot.vue +7 -0
  167. package/src/starter-kit/navigation.ts +12 -1
  168. package/src/styles.css +2 -1
@@ -5,63 +5,63 @@ import o from "../../lib/NewTabHint.js";
5
5
  import s from "../ui/Card.js";
6
6
  import c from "./Sparkline.js";
7
7
  import { Link as l } from "@inertiajs/vue3";
8
- import { createBlock as u, createCommentVNode as d, createElementBlock as f, createElementVNode as p, createTextVNode as m, createVNode as h, defineComponent as g, mergeProps as _, normalizeClass as v, openBlock as y, resolveDynamicComponent as b, toDisplayString as x, unref as S, withCtx as C } from "vue";
8
+ import { createBlock as u, createCommentVNode as d, createElementBlock as f, createElementVNode as p, createVNode as m, defineComponent as h, mergeProps as g, normalizeClass as _, openBlock as v, resolveDynamicComponent as y, toDisplayString as b, unref as x, withCtx as S } from "vue";
9
9
  //#region src/components/widgets/StatCard.vue?vue&type=script&setup=true&lang.ts
10
- var w = { class: "flex items-start justify-between gap-3" }, T = { class: "flex flex-col gap-1" }, E = { class: "text-muted-foreground text-sm font-medium" }, D = {
10
+ var C = { class: "flex items-start justify-between gap-3" }, w = { class: "flex flex-col gap-1" }, T = { class: "text-muted-foreground text-sm font-medium" }, E = {
11
11
  key: 0,
12
12
  class: "text-muted-foreground text-2xl font-semibold tracking-tight",
13
13
  "data-slot": "stat-placeholder"
14
- }, O = /*@__PURE__*/ g({
14
+ }, D = /*@__PURE__*/ h({
15
15
  __name: "StatCard",
16
16
  props: { stat: {} },
17
- setup(g) {
18
- let O = g;
19
- return (g, k) => (y(), u(b(O.stat.url ? O.stat.openUrlInNewTab ? "a" : S(l) : "div"), _(O.stat.url ? O.stat.openUrlInNewTab ? {
20
- href: O.stat.url,
17
+ setup(h) {
18
+ let D = h;
19
+ return (h, O) => (v(), u(y(D.stat.url ? D.stat.openUrlInNewTab ? "a" : x(l) : "div"), g(D.stat.url ? D.stat.openUrlInNewTab ? {
20
+ href: D.stat.url,
21
21
  target: "_blank",
22
22
  rel: "noopener noreferrer"
23
- } : { href: O.stat.url } : {}, { class: "contents" }), {
24
- default: C(() => [h(s, _({ class: S(e)("relative gap-2 overflow-hidden px-5 py-4", O.stat.url && "hover:bg-accent/40 transition-colors") }, O.stat.extraAttributes), {
25
- default: C(() => [p("div", w, [p("div", T, [
26
- p("span", E, x(O.stat.label), 1),
27
- (O.stat.value === null || O.stat.value === "") && O.stat.placeholder ? (y(), f("span", D, x(O.stat.placeholder), 1)) : (y(), f("span", {
23
+ } : { href: D.stat.url } : {}, { class: "contents" }), {
24
+ default: S(() => [m(s, g({ class: x(e)("relative gap-2 overflow-hidden px-5 py-4", D.stat.url && "hover:bg-accent/40 transition-colors") }, D.stat.extraAttributes), {
25
+ default: S(() => [p("div", C, [p("div", w, [
26
+ p("span", T, [p("bdi", null, b(D.stat.label), 1)]),
27
+ (D.stat.value === null || D.stat.value === "") && D.stat.placeholder ? (v(), f("span", E, b(D.stat.placeholder), 1)) : (v(), f("span", {
28
28
  key: 1,
29
- class: v(S(e)("text-2xl font-semibold tracking-tight", O.stat.color && S(i)[O.stat.color]))
30
- }, x(O.stat.value), 3)),
31
- O.stat.description ? (y(), f("span", {
29
+ class: _(x(e)("text-2xl font-semibold tracking-tight", D.stat.color && x(i)[D.stat.color]))
30
+ }, [p("bdi", null, b(D.stat.value), 1)], 2)),
31
+ D.stat.description ? (v(), f("span", {
32
32
  key: 2,
33
- class: v(S(e)("inline-flex items-center gap-1 text-xs", O.stat.descriptionColor ? S(i)[O.stat.descriptionColor] : "text-muted-foreground"))
33
+ class: _(x(e)("inline-flex items-center gap-1 text-xs", D.stat.descriptionColor ? x(i)[D.stat.descriptionColor] : "text-muted-foreground"))
34
34
  }, [
35
- O.stat.descriptionIcon && O.stat.descriptionIconPosition !== "after" ? (y(), u(S(a), {
35
+ D.stat.descriptionIcon && D.stat.descriptionIconPosition !== "after" ? (v(), u(x(a), {
36
36
  key: 0,
37
- name: O.stat.descriptionIcon,
37
+ name: D.stat.descriptionIcon,
38
38
  class: "size-3.5"
39
39
  }, null, 8, ["name"])) : d("", !0),
40
- m(" " + x(O.stat.description) + " ", 1),
41
- O.stat.descriptionIcon && O.stat.descriptionIconPosition === "after" ? (y(), u(S(a), {
40
+ p("bdi", null, b(D.stat.description), 1),
41
+ D.stat.descriptionIcon && D.stat.descriptionIconPosition === "after" ? (v(), u(x(a), {
42
42
  key: 1,
43
- name: O.stat.descriptionIcon,
43
+ name: D.stat.descriptionIcon,
44
44
  class: "size-3.5"
45
45
  }, null, 8, ["name"])) : d("", !0)
46
46
  ], 2)) : d("", !0)
47
- ]), O.stat.icon ? (y(), f("span", {
47
+ ]), D.stat.icon ? (v(), f("span", {
48
48
  key: 0,
49
- class: v(S(e)("flex size-9 shrink-0 items-center justify-center rounded-md", S(t)(S(r), O.stat.color, "gray")))
50
- }, [h(S(a), {
51
- name: O.stat.icon,
49
+ class: _(x(e)("flex size-9 shrink-0 items-center justify-center rounded-md", x(t)(x(r), D.stat.color, "gray")))
50
+ }, [m(x(a), {
51
+ name: D.stat.icon,
52
52
  class: "size-5"
53
- }, null, 8, ["name"])], 2)) : d("", !0)]), O.stat.chart && O.stat.chart.length > 1 ? (y(), u(c, {
53
+ }, null, 8, ["name"])], 2)) : d("", !0)]), D.stat.chart && D.stat.chart.length > 1 ? (v(), u(c, {
54
54
  key: 0,
55
- data: O.stat.chart,
56
- color: S(n)(O.stat.chartColor ?? O.stat.color)
55
+ data: D.stat.chart,
56
+ color: x(n)(D.stat.chartColor ?? D.stat.color)
57
57
  }, null, 8, ["data", "color"])) : d("", !0)]),
58
58
  _: 1
59
- }, 16, ["class"]), O.stat.url && O.stat.openUrlInNewTab ? (y(), u(o, { key: 0 })) : d("", !0)]),
59
+ }, 16, ["class"]), D.stat.url && D.stat.openUrlInNewTab ? (v(), u(o, { key: 0 })) : d("", !0)]),
60
60
  _: 1
61
61
  }, 16));
62
62
  }
63
63
  });
64
64
  //#endregion
65
- export { O as default };
65
+ export { D as default };
66
66
 
67
67
  //# sourceMappingURL=StatCard.vue_vue_type_script_setup_true_lang.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"StatCard.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_resolveDynamicComponent","_unref","_mergeProps","_withCtx","_createVNode","Card","_createElementVNode","_toDisplayString","_createElementBlock","_normalizeClass","Icon","_createCommentVNode","_createTextVNode","Sparkline","NewTabHint","Icon_default","NewTabHint_default","Card_default","Sparkline_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","StatCard_vue_vue_type_script_setup_true_lang_default","props","__props","openBlock","createBlock","resolveDynamicComponent","unref","Link","mergeProps","withCtx","createVNode","cn","createElementVNode","toDisplayString","createElementBlock","normalizeClass","textColorClasses","createCommentVNode","createTextVNode","colorClass","iconBackgroundColorClasses","cssColor"],"sources":["../../../src/components/widgets/StatCard.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { StatSchema } from '@alfakit/core'\nimport { Link } from '@inertiajs/vue3'\nimport {\n colorClass,\n cssColor,\n iconBackgroundColorClasses,\n textColorClasses,\n} from '../../lib/colors'\nimport { Icon } from '../../lib/icons'\nimport { cn } from '../../lib/utils'\nimport Card from '../ui/Card.vue'\nimport Sparkline from './Sparkline.vue'\nimport NewTabHint from '../../lib/NewTabHint.vue'\n\nconst props = defineProps<{ stat: StatSchema }>()\n</script>\n\n<template>\n <component\n :is=\"props.stat.url ? (props.stat.openUrlInNewTab ? 'a' : Link) : 'div'\"\n v-bind=\"\n props.stat.url\n ? props.stat.openUrlInNewTab\n ? { href: props.stat.url, target: '_blank', rel: 'noopener noreferrer' }\n : { href: props.stat.url }\n : {}\n \"\n class=\"contents\"\n >\n <Card\n :class=\"\n cn(\n 'relative gap-2 overflow-hidden px-5 py-4',\n props.stat.url && 'hover:bg-accent/40 transition-colors',\n )\n \"\n v-bind=\"props.stat.extraAttributes\"\n >\n <div class=\"flex items-start justify-between gap-3\">\n <div class=\"flex flex-col gap-1\">\n <span class=\"text-muted-foreground text-sm font-medium\">{{ props.stat.label }}</span>\n <span\n v-if=\"(props.stat.value === null || props.stat.value === '') && props.stat.placeholder\"\n class=\"text-muted-foreground text-2xl font-semibold tracking-tight\"\n data-slot=\"stat-placeholder\"\n >{{ props.stat.placeholder }}</span\n >\n <span\n v-else\n :class=\"\n cn(\n 'text-2xl font-semibold tracking-tight',\n props.stat.color && textColorClasses[props.stat.color],\n )\n \"\n >{{ props.stat.value }}</span\n >\n <span\n v-if=\"props.stat.description\"\n :class=\"\n cn(\n 'inline-flex items-center gap-1 text-xs',\n props.stat.descriptionColor\n ? textColorClasses[props.stat.descriptionColor]\n : 'text-muted-foreground',\n )\n \"\n >\n <Icon\n v-if=\"props.stat.descriptionIcon && props.stat.descriptionIconPosition !== 'after'\"\n :name=\"props.stat.descriptionIcon\"\n class=\"size-3.5\"\n />\n {{ props.stat.description }}\n <Icon\n v-if=\"props.stat.descriptionIcon && props.stat.descriptionIconPosition === 'after'\"\n :name=\"props.stat.descriptionIcon\"\n class=\"size-3.5\"\n />\n </span>\n </div>\n <span\n v-if=\"props.stat.icon\"\n :class=\"\n cn(\n 'flex size-9 shrink-0 items-center justify-center rounded-md',\n colorClass(iconBackgroundColorClasses, props.stat.color, 'gray'),\n )\n \"\n >\n <Icon :name=\"props.stat.icon\" class=\"size-5\" />\n </span>\n </div>\n <Sparkline\n v-if=\"props.stat.chart && props.stat.chart.length > 1\"\n :data=\"props.stat.chart\"\n :color=\"cssColor(props.stat.chartColor ?? props.stat.color)\"\n />\n </Card>\n <NewTabHint v-if=\"props.stat.url && props.stat.openUrlInNewTab\" />\n </component>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;EAeA,IAAM0B,IAAQC;oBAIZ3B,EAAA,GAAAC,EAkFYC,EAjFLwB,EAAM,KAAK,MAAOA,EAAM,KAAK,kBAAe,MAASvB,EAAA6B,CAAA,IAAI,KAAA,GADhE5B,EAEiBsB,EAAM,KAAK,MAAcA,EAAM,KAAK,kBAAoC;GAAA,MAAAA,EAAM,KAAK;GAAG,QAAA;GAAA,KAAA;EAAA,IAAqE,EAAA,MAAAA,EAAM,KAAK,IAAG,IAAA,CAAA,GAOxL,EAAA,OAAM,WAAU,CAAA,GAAA;GAEhB,SAAArB,QAqEO,CArEPC,EAqEOC,GArEPH,EAqEO,EApEJ,OAAgBD,EAAAiC,CAAA,CAAE,CAAA,4CAAkEV,EAAM,KAAK,OAAG,sCAAA,EAM3F,GAAAA,EAAM,KAAK,eAAe,GAAA;IAElC,SAAArB,QAsDM,CAtDNG,EAsDM,OAtDNa,GAsDM,CArDJb,EAyCM,OAzCNc,GAyCM;KAxCJd,EAAqF,QAArFe,GAAqFd,EAA1BiB,EAAM,KAAK,KAAK,GAAA,CAAA;MAElEA,EAAM,KAAK,UAAK,QAAaA,EAAM,KAAK,UAAK,OAAYA,EAAM,KAAK,eAD7E1B,EAAA,GAAAU,EAKC,QALDc,GAKCf,EADKiB,EAAM,KAAK,WAAW,GAAA,CAAA,MAE5B1B,EAAA,GAAAU,EASC,QAAA;;MAPE,OAAKC,EAAiBR,EAAAiC,CAAA,CAAE,CAAA,yCAA2EV,EAAM,KAAK,SAASvB,EAAAsC,CAAA,CAAgB,CAACf,EAAM,KAAK,MAAA,CAAA;KAMhJ,GAAAjB,EAAAiB,EAAM,KAAK,KAAK,GAAA,CAAA;KAGdA,EAAM,KAAK,eADnB1B,EAAA,GAAAU,EAsBO,QAAA;;MApBJ,OAAKC,EAAiBR,EAAAiC,CAAA,CAAE,CAAA,0CAA4EV,EAAM,KAAK,mBAAqCvB,EAAAsC,CAAA,CAAgB,CAACf,EAAM,KAAK,oBAAA,uBAAA,CAAA;;MAUzKA,EAAM,KAAK,mBAAmBA,EAAM,KAAK,4BAAuB,WADxE1B,EAAA,GAAAC,EAIEE,EAAAS,CAAA,GAAA;;OAFC,MAAMc,EAAM,KAAK;OAClB,OAAM;;MACNZ,EAAA,MACFL,EAAGiB,EAAM,KAAK,WAAW,IAAG,KAC5B,CAAA;MACQA,EAAM,KAAK,mBAAmBA,EAAM,KAAK,4BAAuB,WADxE1B,EAAA,GAAAC,EAIEE,EAAAS,CAAA,GAAA;;OAFC,MAAMc,EAAM,KAAK;OAClB,OAAM;;;IAKJ,CAAA,GAAAA,EAAM,KAAK,QADnB1B,EAAA,GAAAU,EAUO,QAAA;;KARJ,OAAKC,EAAeR,EAAAiC,CAAA,CAAE,CAAA,+DAA6FjC,EAAAyC,CAAA,CAAU,CAACzC,EAAA0C,CAAA,GAA4BnB,EAAM,KAAK,OAAK,MAAA,CAAA,CAAA;IAO3KpB,GAAAA,CAAAA,EAA+CH,EAAAS,CAAA,GAAA;KAAxC,MAAMc,EAAM,KAAK;KAAM,OAAM;IAIhC,GAAA,MAAA,GAAA,CAAA,MAAA,CAAA,CAAA,GAAA,CAAA,KAAAgB,EAAA,IAAA,EAAA,CAAA,CAAA,GAAAhB,EAAM,KAAK,SAASA,EAAM,KAAK,MAAM,SAAM,KADnD1B,EAAA,GAAAC,EAIEc,GAAA;;KAFC,MAAMW,EAAM,KAAK;KACjB,OAAOvB,EAAA2C,CAAA,CAAQ,CAACpB,EAAM,KAAK,cAAcA,EAAM,KAAK,KAAK;;;GAG5C,GAAA,IAAA,CAAA,OAAA,CAAA,GAAAA,EAAM,KAAK,OAAOA,EAAM,KAAK,mBAA/C1B,EAAA,GAAAC,EAAkEe,GAAA,EAAA,KAAA,EAAA,CAAA,KAAA0B,EAAA,IAAA,EAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"StatCard.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_resolveDynamicComponent","_unref","_mergeProps","_withCtx","_createVNode","Card","_createElementVNode","_toDisplayString","_createElementBlock","_normalizeClass","Icon","_createCommentVNode","Sparkline","NewTabHint","Icon_default","NewTabHint_default","Card_default","Sparkline_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","StatCard_vue_vue_type_script_setup_true_lang_default","props","__props","openBlock","createBlock","resolveDynamicComponent","unref","Link","mergeProps","withCtx","createVNode","cn","createElementVNode","toDisplayString","createElementBlock","normalizeClass","textColorClasses","createCommentVNode","colorClass","iconBackgroundColorClasses","cssColor"],"sources":["../../../src/components/widgets/StatCard.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { StatSchema } from '@alfakit/core'\nimport { Link } from '@inertiajs/vue3'\nimport {\n colorClass,\n cssColor,\n iconBackgroundColorClasses,\n textColorClasses,\n} from '../../lib/colors'\nimport { Icon } from '../../lib/icons'\nimport { cn } from '../../lib/utils'\nimport Card from '../ui/Card.vue'\nimport Sparkline from './Sparkline.vue'\nimport NewTabHint from '../../lib/NewTabHint.vue'\n\nconst props = defineProps<{ stat: StatSchema }>()\n</script>\n\n<template>\n <component\n :is=\"props.stat.url ? (props.stat.openUrlInNewTab ? 'a' : Link) : 'div'\"\n v-bind=\"\n props.stat.url\n ? props.stat.openUrlInNewTab\n ? { href: props.stat.url, target: '_blank', rel: 'noopener noreferrer' }\n : { href: props.stat.url }\n : {}\n \"\n class=\"contents\"\n >\n <Card\n :class=\"\n cn(\n 'relative gap-2 overflow-hidden px-5 py-4',\n props.stat.url && 'hover:bg-accent/40 transition-colors',\n )\n \"\n v-bind=\"props.stat.extraAttributes\"\n >\n <div class=\"flex items-start justify-between gap-3\">\n <div class=\"flex flex-col gap-1\">\n <span class=\"text-muted-foreground text-sm font-medium\"\n ><bdi>{{ props.stat.label }}</bdi></span\n >\n <span\n v-if=\"(props.stat.value === null || props.stat.value === '') && props.stat.placeholder\"\n class=\"text-muted-foreground text-2xl font-semibold tracking-tight\"\n data-slot=\"stat-placeholder\"\n >{{ props.stat.placeholder }}</span\n >\n <span\n v-else\n :class=\"\n cn(\n 'text-2xl font-semibold tracking-tight',\n props.stat.color && textColorClasses[props.stat.color],\n )\n \"\n ><bdi>{{ props.stat.value }}</bdi></span\n >\n <span\n v-if=\"props.stat.description\"\n :class=\"\n cn(\n 'inline-flex items-center gap-1 text-xs',\n props.stat.descriptionColor\n ? textColorClasses[props.stat.descriptionColor]\n : 'text-muted-foreground',\n )\n \"\n >\n <Icon\n v-if=\"props.stat.descriptionIcon && props.stat.descriptionIconPosition !== 'after'\"\n :name=\"props.stat.descriptionIcon\"\n class=\"size-3.5\"\n />\n <!-- Mixed-direction text (a Latin \"-3% this month\" in Arabic) keeps its order. -->\n <bdi>{{ props.stat.description }}</bdi>\n <Icon\n v-if=\"props.stat.descriptionIcon && props.stat.descriptionIconPosition === 'after'\"\n :name=\"props.stat.descriptionIcon\"\n class=\"size-3.5\"\n />\n </span>\n </div>\n <span\n v-if=\"props.stat.icon\"\n :class=\"\n cn(\n 'flex size-9 shrink-0 items-center justify-center rounded-md',\n colorClass(iconBackgroundColorClasses, props.stat.color, 'gray'),\n )\n \"\n >\n <Icon :name=\"props.stat.icon\" class=\"size-5\" />\n </span>\n </div>\n <Sparkline\n v-if=\"props.stat.chart && props.stat.chart.length > 1\"\n :data=\"props.stat.chart\"\n :color=\"cssColor(props.stat.chartColor ?? props.stat.color)\"\n />\n </Card>\n <NewTabHint v-if=\"props.stat.url && props.stat.openUrlInNewTab\" />\n </component>\n</template>\n"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "package": "@alfakit/vue",
3
- "version": "0.1.8",
3
+ "version": "0.1.10",
4
4
  "adapter": "vue",
5
- "generatedAt": "2026-10-22T11:23:33.540Z",
5
+ "generatedAt": "2026-10-25T11:21:46.780Z",
6
6
  "components": {
7
7
  "TextInput": {
8
8
  "file": "src/components/fields/TextInputField.vue",
@@ -1 +1 @@
1
- {"version":3,"file":"TopNavLayout.js","names":["_sfc_main","TopNavLayout_vue_vue_type_script_setup_true_lang_default","TopNavLayout_default"],"sources":["../../src/layouts/TopNavLayout.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n PREFETCH_CACHE_FOR,\n hasMobilePreset,\n type BreadcrumbSchema,\n type NavigationItemSchema,\n type Width,\n} from '@alfakit/core'\nimport { Link } from '@inertiajs/vue3'\nimport { MenuIcon } from '@lucide/vue'\nimport { computed, ref } from 'vue'\nimport NotificationsMenu from '../components/notifications/NotificationsMenu.vue'\nimport BottomNav from '../components/panel/BottomNav.vue'\nimport Brand from '../components/panel/Brand.vue'\nimport TenantMenu from '../components/panel/TenantMenu.vue'\nimport Breadcrumbs from '../components/panel/Breadcrumbs.vue'\nimport GlobalSearch from '../components/panel/GlobalSearch.vue'\nimport NavLabel from '../components/panel/NavLabel.vue'\nimport Slot from '../components/panel/Slot.vue'\nimport DebugPanelSlot from '../components/panel/DebugPanelSlot.vue'\nimport ThemeToggle from '../components/panel/ThemeToggle.vue'\nimport TopbarLocaleSwitcher from '../components/panel/TopbarLocaleSwitcher.vue'\nimport UserMenu from '../components/panel/UserMenu.vue'\nimport Button from '../components/ui/Button.vue'\nimport Sheet from '../components/ui/Sheet.vue'\nimport SheetContent from '../components/ui/SheetContent.vue'\nimport SheetHeader from '../components/ui/SheetHeader.vue'\nimport SheetTitle from '../components/ui/SheetTitle.vue'\nimport SheetTrigger from '../components/ui/SheetTrigger.vue'\nimport { useDirection, usePanel, useRegistry, useT } from '../context'\nimport { Icon } from '../lib/icons'\nimport { cn } from '../lib/utils'\nimport { MAX_WIDTHS } from './max-widths'\nimport TopNavGroupWrapper from './TopNavGroupWrapper.vue'\nimport TopNavMenu from './TopNavMenu.vue'\nimport NewTabHint from '../lib/NewTabHint.vue'\n\n/**\n * Navigation across the top instead of a sidebar (`layout: 'topbar'`). Ungrouped items are\n * links; labelled groups and items with children open as dropdowns.\n */\nconst props = defineProps<{ breadcrumbs?: BreadcrumbSchema[]; maxContentWidth?: Width | string }>()\nconst panel = usePanel()\nconst t = useT()\nconst direction = useDirection()\nconst registry = useRegistry()\nconst open = ref(false)\nconst Bottom = computed(() => registry.resolve('panel:bottom-nav') ?? BottomNav)\nconst mobilePreset = computed(() => hasMobilePreset(panel.value))\nconst width = computed(\n () => MAX_WIDTHS[props.maxContentWidth ?? panel.value.maxContentWidth ?? '7xl'] ?? 'max-w-7xl',\n)\n\nconst isActive = (item: NavigationItemSchema): boolean =>\n Boolean(item.active || item.children?.some(isActive))\n\nconst linkClass =\n 'text-muted-foreground hover:text-foreground hover:bg-accent data-[active=true]:bg-accent data-[active=true]:text-foreground inline-flex h-9 shrink-0 items-center gap-2 rounded-md px-3 text-sm font-medium transition-colors [&_svg]:size-4'\n</script>\n\n<template>\n <div data-slot=\"topnav-layout\" class=\"bg-background flex min-h-svh flex-col\">\n <Slot name=\"body.start\" />\n <Slot name=\"layout.start\" />\n <Slot name=\"topbar.before\" />\n <header\n data-slot=\"topbar\"\n class=\"bg-background/90 supports-[backdrop-filter]:bg-background/70 sticky top-0 z-30 border-b backdrop-blur\"\n >\n <div :class=\"cn('mx-auto flex h-14 w-full items-center gap-3 px-4 md:px-6', width)\">\n <Sheet :open=\"open\" @update:open=\"open = $event\">\n <SheetTrigger as-child>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n class=\"md:hidden\"\n :aria-label=\"t('toggle_sidebar', {}, 'Toggle sidebar')\"\n >\n <Icon name=\"alfakit::panels.topbar.open-sidebar-button\" :fallback=\"MenuIcon\" />\n </Button>\n </SheetTrigger>\n <SheetContent :side=\"direction === 'rtl' ? 'right' : 'left'\" class=\"w-72 p-0\">\n <SheetHeader class=\"border-b\">\n <SheetTitle as-child>\n <div><Brand /></div>\n </SheetTitle>\n </SheetHeader>\n <nav class=\"flex flex-col gap-4 overflow-y-auto p-4 text-sm\">\n <div\n v-for=\"(group, index) in panel.navigation\"\n :key=\"group.label ?? index\"\n class=\"flex flex-col gap-1\"\n >\n <p v-if=\"group.label\" class=\"text-muted-foreground px-2 text-xs font-medium\">\n {{ group.label }}\n </p>\n <Link\n v-for=\"item in group.items.flatMap((entry) => [entry, ...(entry.children ?? [])])\"\n :key=\"item.label\"\n :href=\"item.url ?? '#'\"\n :data-active=\"item.active ? 'true' : undefined\"\n class=\"hover:bg-accent data-[active=true]:bg-accent flex items-center gap-2 rounded-md px-2 py-2 font-medium [&_svg]:size-4\"\n @click=\"open = false\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" />\n <NavLabel :text=\"item.label\" :html=\"item.labelHtml\" />\n </Link>\n </div>\n </nav>\n </SheetContent>\n </Sheet>\n <Slot name=\"topbar.logo.before\" />\n <Brand class=\"me-2 shrink-0\" />\n <Slot name=\"topbar.logo.after\" />\n <Slot v-if=\"panel.tenancy?.current\" name=\"tenant-menu.before\" />\n <TenantMenu variant=\"topbar\" />\n <Slot v-if=\"panel.tenancy?.current\" name=\"tenant-menu.after\" />\n <nav\n data-slot=\"topnav\"\n :aria-label=\"t('navigation', {}, 'Navigation')\"\n class=\"hidden min-w-0 flex-1 items-center gap-1 self-stretch overflow-x-auto md:flex\"\n >\n <TopNavGroupWrapper\n v-for=\"(group, index) in panel.navigation\"\n :key=\"group.label ?? `group-${index}`\"\n :attributes=\"group.extraTopbarAttributes\"\n >\n <TopNavMenu\n v-if=\"group.label\"\n :label=\"group.label\"\n :icon=\"group.icon\"\n :items=\"group.items\"\n :active=\"group.items.some(isActive)\"\n />\n <template v-for=\"item in group.items\" v-else :key=\"item.label\">\n <TopNavMenu\n v-if=\"item.children && item.children.length > 0\"\n :label=\"item.label\"\n :label-html=\"item.labelHtml\"\n :icon=\"item.icon\"\n :items=\"item.children\"\n :active=\"isActive(item)\"\n :attributes=\"item.extraAttributes\"\n />\n <a\n v-else-if=\"item.openInNewTab\"\n v-bind=\"item.extraAttributes ?? {}\"\n :href=\"item.url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n data-slot=\"topnav-link\"\n :class=\"linkClass\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" />\n <NavLabel :text=\"item.label\" :html=\"item.labelHtml\" />\n <NewTabHint />\n </a>\n <Link\n v-else\n v-bind=\"item.extraAttributes ?? {}\"\n :href=\"item.url ?? '#'\"\n prefetch\n :cache-for=\"PREFETCH_CACHE_FOR\"\n data-slot=\"topnav-link\"\n :data-active=\"item.active ? 'true' : undefined\"\n :class=\"linkClass\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" />\n <NavLabel :text=\"item.label\" :html=\"item.labelHtml\" />\n </Link>\n </template>\n </TopNavGroupWrapper>\n </nav>\n <Slot name=\"topbar.start\" />\n <div class=\"ms-auto flex shrink-0 items-center gap-1\">\n <Slot name=\"topbar.end\" />\n <GlobalSearch />\n <NotificationsMenu />\n <TopbarLocaleSwitcher />\n <ThemeToggle />\n <DebugPanelSlot />\n <UserMenu variant=\"topbar\" />\n </div>\n </div>\n </header>\n <Slot name=\"topbar.after\" />\n <Slot name=\"content.before\" />\n <main\n data-slot=\"content\"\n :class=\"cn('mx-auto flex w-full min-w-0 flex-1 flex-col gap-6 p-4 md:p-6', width)\"\n >\n <Breadcrumbs\n v-if=\"panel.breadcrumbs && props.breadcrumbs && props.breadcrumbs.length > 0\"\n :items=\"props.breadcrumbs\"\n />\n <Slot name=\"content.start\" />\n <slot />\n <Slot name=\"content.end\" />\n </main>\n <Slot name=\"content.after\" />\n <Slot name=\"footer\" />\n <component :is=\"Bottom\" v-if=\"mobilePreset\" />\n <Slot name=\"layout.end\" />\n <Slot name=\"body.end\" />\n </div>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"TopNavLayout.js","names":["_sfc_main","TopNavLayout_vue_vue_type_script_setup_true_lang_default","TopNavLayout_default"],"sources":["../../src/layouts/TopNavLayout.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n PREFETCH_CACHE_FOR,\n hasMobilePreset,\n type BreadcrumbSchema,\n type NavigationItemSchema,\n type Width,\n} from '@alfakit/core'\nimport { Link } from '@inertiajs/vue3'\nimport { MenuIcon } from '@lucide/vue'\nimport { computed, ref } from 'vue'\nimport NotificationsMenu from '../components/notifications/NotificationsMenu.vue'\nimport BottomNav from '../components/panel/BottomNav.vue'\nimport Brand from '../components/panel/Brand.vue'\nimport TenantMenu from '../components/panel/TenantMenu.vue'\nimport Breadcrumbs from '../components/panel/Breadcrumbs.vue'\nimport GlobalSearch from '../components/panel/GlobalSearch.vue'\nimport NavLabel from '../components/panel/NavLabel.vue'\nimport Slot from '../components/panel/Slot.vue'\nimport DebugPanelSlot from '../components/panel/DebugPanelSlot.vue'\nimport ThemeToggle from '../components/panel/ThemeToggle.vue'\nimport TopbarLocaleSwitcher from '../components/panel/TopbarLocaleSwitcher.vue'\nimport UserMenu from '../components/panel/UserMenu.vue'\nimport Button from '../components/ui/Button.vue'\nimport Sheet from '../components/ui/Sheet.vue'\nimport SheetContent from '../components/ui/SheetContent.vue'\nimport SheetHeader from '../components/ui/SheetHeader.vue'\nimport SheetTitle from '../components/ui/SheetTitle.vue'\nimport SheetTrigger from '../components/ui/SheetTrigger.vue'\nimport { useDirection, usePanel, useRegistry, useT } from '../context'\nimport { Icon } from '../lib/icons'\nimport { cn } from '../lib/utils'\nimport { MAX_WIDTHS } from './max-widths'\nimport TopNavGroupWrapper from './TopNavGroupWrapper.vue'\nimport TopNavMenu from './TopNavMenu.vue'\nimport NewTabHint from '../lib/NewTabHint.vue'\n\n/**\n * Navigation across the top instead of a sidebar (`layout: 'topbar'`). Ungrouped items are\n * links; labelled groups and items with children open as dropdowns.\n */\nconst props = defineProps<{ breadcrumbs?: BreadcrumbSchema[]; maxContentWidth?: Width | string }>()\nconst panel = usePanel()\nconst t = useT()\nconst direction = useDirection()\nconst registry = useRegistry()\nconst open = ref(false)\nconst Bottom = computed(() => registry.resolve('panel:bottom-nav') ?? BottomNav)\nconst mobilePreset = computed(() => hasMobilePreset(panel.value))\nconst width = computed(\n () => MAX_WIDTHS[props.maxContentWidth ?? panel.value.maxContentWidth ?? '7xl'] ?? 'max-w-7xl',\n)\n\nconst isActive = (item: NavigationItemSchema): boolean =>\n Boolean(item.active || item.children?.some(isActive))\n\nconst linkClass =\n 'text-muted-foreground hover:text-foreground hover:bg-accent data-[active=true]:bg-accent data-[active=true]:text-foreground inline-flex h-9 shrink-0 items-center gap-2 rounded-md px-3 text-sm font-medium transition-colors [&_svg]:size-4'\n</script>\n\n<template>\n <div data-slot=\"topnav-layout\" class=\"bg-background flex min-h-svh flex-col\">\n <Slot name=\"body.start\" />\n <Slot name=\"layout.start\" />\n <Slot name=\"topbar.before\" />\n <header\n data-slot=\"topbar\"\n class=\"bg-background/90 supports-[backdrop-filter]:bg-background/70 sticky top-0 z-30 border-b backdrop-blur\"\n >\n <div :class=\"cn('mx-auto flex h-14 w-full items-center gap-3 px-4 md:px-6', width)\">\n <Sheet :open=\"open\" @update:open=\"open = $event\">\n <SheetTrigger as-child>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n class=\"md:hidden\"\n :aria-label=\"t('toggle_sidebar', {}, 'Toggle sidebar')\"\n >\n <Icon name=\"alfakit::panels.topbar.open-sidebar-button\" :fallback=\"MenuIcon\" />\n </Button>\n </SheetTrigger>\n <SheetContent :side=\"direction === 'rtl' ? 'right' : 'left'\" class=\"w-72 p-0\">\n <SheetHeader class=\"border-b\">\n <SheetTitle as-child>\n <div><Brand /></div>\n </SheetTitle>\n </SheetHeader>\n <nav class=\"flex flex-col gap-4 overflow-y-auto p-4 text-sm\">\n <div\n v-for=\"(group, index) in panel.navigation\"\n :key=\"group.label ?? index\"\n class=\"flex flex-col gap-1\"\n >\n <p v-if=\"group.label\" class=\"text-muted-foreground px-2 text-xs font-medium\">\n {{ group.label }}\n </p>\n <Link\n v-for=\"item in group.items.flatMap((entry) => [entry, ...(entry.children ?? [])])\"\n :key=\"item.url ?? item.label\"\n :href=\"item.url ?? '#'\"\n :data-active=\"item.active ? 'true' : undefined\"\n class=\"hover:bg-accent data-[active=true]:bg-accent flex items-center gap-2 rounded-md px-2 py-2 font-medium [&_svg]:size-4\"\n @click=\"open = false\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" />\n <NavLabel :text=\"item.label\" :html=\"item.labelHtml\" />\n </Link>\n </div>\n </nav>\n </SheetContent>\n </Sheet>\n <Slot name=\"topbar.logo.before\" />\n <Brand class=\"me-2 shrink-0\" />\n <Slot name=\"topbar.logo.after\" />\n <Slot v-if=\"panel.tenancy?.current\" name=\"tenant-menu.before\" />\n <TenantMenu variant=\"topbar\" />\n <Slot v-if=\"panel.tenancy?.current\" name=\"tenant-menu.after\" />\n <nav\n data-slot=\"topnav\"\n :aria-label=\"t('navigation', {}, 'Navigation')\"\n class=\"hidden min-w-0 flex-1 items-center gap-1 self-stretch overflow-x-auto md:flex\"\n >\n <TopNavGroupWrapper\n v-for=\"(group, index) in panel.navigation\"\n :key=\"group.label ?? `group-${index}`\"\n :attributes=\"group.extraTopbarAttributes\"\n >\n <TopNavMenu\n v-if=\"group.label\"\n :label=\"group.label\"\n :icon=\"group.icon\"\n :items=\"group.items\"\n :active=\"group.items.some(isActive)\"\n />\n <template v-for=\"item in group.items\" v-else :key=\"item.url ?? item.label\">\n <TopNavMenu\n v-if=\"item.children && item.children.length > 0\"\n :label=\"item.label\"\n :label-html=\"item.labelHtml\"\n :icon=\"item.icon\"\n :items=\"item.children\"\n :active=\"isActive(item)\"\n :attributes=\"item.extraAttributes\"\n />\n <a\n v-else-if=\"item.openInNewTab\"\n v-bind=\"item.extraAttributes ?? {}\"\n :href=\"item.url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n data-slot=\"topnav-link\"\n :class=\"linkClass\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" />\n <NavLabel :text=\"item.label\" :html=\"item.labelHtml\" />\n <NewTabHint />\n </a>\n <Link\n v-else\n v-bind=\"item.extraAttributes ?? {}\"\n :href=\"item.url ?? '#'\"\n prefetch\n :cache-for=\"PREFETCH_CACHE_FOR\"\n data-slot=\"topnav-link\"\n :data-active=\"item.active ? 'true' : undefined\"\n :class=\"linkClass\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" />\n <NavLabel :text=\"item.label\" :html=\"item.labelHtml\" />\n </Link>\n </template>\n </TopNavGroupWrapper>\n </nav>\n <Slot name=\"topbar.start\" />\n <div class=\"ms-auto flex shrink-0 items-center gap-1\">\n <Slot name=\"topbar.end\" />\n <GlobalSearch />\n <NotificationsMenu />\n <TopbarLocaleSwitcher />\n <ThemeToggle />\n <DebugPanelSlot />\n <UserMenu variant=\"topbar\" />\n </div>\n </div>\n </header>\n <Slot name=\"topbar.after\" />\n <Slot name=\"content.before\" />\n <main\n data-slot=\"content\"\n :class=\"cn('mx-auto flex w-full min-w-0 flex-1 flex-col gap-6 p-4 md:p-6', width)\"\n >\n <Breadcrumbs\n v-if=\"panel.breadcrumbs && props.breadcrumbs && props.breadcrumbs.length > 0\"\n :items=\"props.breadcrumbs\"\n />\n <Slot name=\"content.start\" />\n <slot />\n <Slot name=\"content.end\" />\n </main>\n <Slot name=\"content.after\" />\n <Slot name=\"footer\" />\n <component :is=\"Bottom\" v-if=\"mobilePreset\" />\n <Slot name=\"layout.end\" />\n <Slot name=\"body.end\" />\n </div>\n</template>\n"],"mappings":""}
@@ -83,7 +83,7 @@ var H = {
83
83
  key: e.label ?? n,
84
84
  class: "flex flex-col gap-1"
85
85
  }, [e.label ? (N(), D("p", G, R(e.label), 1)) : E("", !0), (N(!0), D(C, null, F(e.items.flatMap((e) => [e, ...e.children ?? []]), (e) => (N(), T(z(S), {
86
- key: e.label,
86
+ key: e.url ?? e.label,
87
87
  href: e.url ?? "#",
88
88
  "data-active": e.active ? "true" : void 0,
89
89
  class: "hover:bg-accent data-[active=true]:bg-accent flex items-center gap-2 rounded-md px-2 py-2 font-medium [&_svg]:size-4",
@@ -133,7 +133,7 @@ var H = {
133
133
  "icon",
134
134
  "items",
135
135
  "active"
136
- ])) : (N(!0), D(C, { key: 1 }, F(e.items, (e) => (N(), D(C, { key: e.label }, [e.children && e.children.length > 0 ? (N(), T(x, {
136
+ ])) : (N(!0), D(C, { key: 1 }, F(e.items, (e) => (N(), D(C, { key: e.url ?? e.label }, [e.children && e.children.length > 0 ? (N(), T(x, {
137
137
  key: 0,
138
138
  label: e.label,
139
139
  "label-html": e.labelHtml,
@@ -1 +1 @@
1
- {"version":3,"file":"TopNavLayout.vue_vue_type_script_setup_true_lang.js","names":["BottomNav","_openBlock","_createElementBlock","_createVNode","Slot","_createElementVNode","_normalizeClass","_unref","Sheet","_withCtx","SheetTrigger","Button","Icon","SheetContent","SheetHeader","SheetTitle","Brand","_Fragment","_renderList","_toDisplayString","_createCommentVNode","_createBlock","NavLabel","TenantMenu","TopNavGroupWrapper","TopNavMenu","_mergeProps","NewTabHint","GlobalSearch","NotificationsMenu","TopbarLocaleSwitcher","ThemeToggle","DebugPanelSlot","UserMenu","Breadcrumbs","_renderSlot","_resolveDynamicComponent","Icon_default","Button_default","Slot_default","Sheet_default","SheetContent_default","SheetHeader_default","SheetTitle_default","SheetTrigger_default","NewTabHint_default","NavLabel_default","NotificationsMenu_default","Brand_default","GlobalSearch_default","TenantMenu_default","UserMenu_default","BottomNav_default","Breadcrumbs_default","DebugPanelSlot_default","ThemeToggle_default","TopbarLocaleSwitcher_default","TopNavGroupWrapper_default","TopNavMenu_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","linkClass","TopNavLayout_vue_vue_type_script_setup_true_lang_default","props","__props","panel","usePanel","t","useT","direction","useDirection","registry","useRegistry","open","ref","Bottom","computed","mobilePreset","hasMobilePreset","width","MAX_WIDTHS","isActive","item","openBlock","createElementBlock","createVNode","createElementVNode","normalizeClass","unref","cn","_cache","$event","withCtx","MenuIcon","Fragment","renderList","group","index","toDisplayString","createCommentVNode","entry","createBlock","Link","mergeProps","PREFETCH_CACHE_FOR","renderSlot","_ctx","resolveDynamicComponent"],"sources":["../../src/layouts/TopNavLayout.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n PREFETCH_CACHE_FOR,\n hasMobilePreset,\n type BreadcrumbSchema,\n type NavigationItemSchema,\n type Width,\n} from '@alfakit/core'\nimport { Link } from '@inertiajs/vue3'\nimport { MenuIcon } from '@lucide/vue'\nimport { computed, ref } from 'vue'\nimport NotificationsMenu from '../components/notifications/NotificationsMenu.vue'\nimport BottomNav from '../components/panel/BottomNav.vue'\nimport Brand from '../components/panel/Brand.vue'\nimport TenantMenu from '../components/panel/TenantMenu.vue'\nimport Breadcrumbs from '../components/panel/Breadcrumbs.vue'\nimport GlobalSearch from '../components/panel/GlobalSearch.vue'\nimport NavLabel from '../components/panel/NavLabel.vue'\nimport Slot from '../components/panel/Slot.vue'\nimport DebugPanelSlot from '../components/panel/DebugPanelSlot.vue'\nimport ThemeToggle from '../components/panel/ThemeToggle.vue'\nimport TopbarLocaleSwitcher from '../components/panel/TopbarLocaleSwitcher.vue'\nimport UserMenu from '../components/panel/UserMenu.vue'\nimport Button from '../components/ui/Button.vue'\nimport Sheet from '../components/ui/Sheet.vue'\nimport SheetContent from '../components/ui/SheetContent.vue'\nimport SheetHeader from '../components/ui/SheetHeader.vue'\nimport SheetTitle from '../components/ui/SheetTitle.vue'\nimport SheetTrigger from '../components/ui/SheetTrigger.vue'\nimport { useDirection, usePanel, useRegistry, useT } from '../context'\nimport { Icon } from '../lib/icons'\nimport { cn } from '../lib/utils'\nimport { MAX_WIDTHS } from './max-widths'\nimport TopNavGroupWrapper from './TopNavGroupWrapper.vue'\nimport TopNavMenu from './TopNavMenu.vue'\nimport NewTabHint from '../lib/NewTabHint.vue'\n\n/**\n * Navigation across the top instead of a sidebar (`layout: 'topbar'`). Ungrouped items are\n * links; labelled groups and items with children open as dropdowns.\n */\nconst props = defineProps<{ breadcrumbs?: BreadcrumbSchema[]; maxContentWidth?: Width | string }>()\nconst panel = usePanel()\nconst t = useT()\nconst direction = useDirection()\nconst registry = useRegistry()\nconst open = ref(false)\nconst Bottom = computed(() => registry.resolve('panel:bottom-nav') ?? BottomNav)\nconst mobilePreset = computed(() => hasMobilePreset(panel.value))\nconst width = computed(\n () => MAX_WIDTHS[props.maxContentWidth ?? panel.value.maxContentWidth ?? '7xl'] ?? 'max-w-7xl',\n)\n\nconst isActive = (item: NavigationItemSchema): boolean =>\n Boolean(item.active || item.children?.some(isActive))\n\nconst linkClass =\n 'text-muted-foreground hover:text-foreground hover:bg-accent data-[active=true]:bg-accent data-[active=true]:text-foreground inline-flex h-9 shrink-0 items-center gap-2 rounded-md px-3 text-sm font-medium transition-colors [&_svg]:size-4'\n</script>\n\n<template>\n <div data-slot=\"topnav-layout\" class=\"bg-background flex min-h-svh flex-col\">\n <Slot name=\"body.start\" />\n <Slot name=\"layout.start\" />\n <Slot name=\"topbar.before\" />\n <header\n data-slot=\"topbar\"\n class=\"bg-background/90 supports-[backdrop-filter]:bg-background/70 sticky top-0 z-30 border-b backdrop-blur\"\n >\n <div :class=\"cn('mx-auto flex h-14 w-full items-center gap-3 px-4 md:px-6', width)\">\n <Sheet :open=\"open\" @update:open=\"open = $event\">\n <SheetTrigger as-child>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n class=\"md:hidden\"\n :aria-label=\"t('toggle_sidebar', {}, 'Toggle sidebar')\"\n >\n <Icon name=\"alfakit::panels.topbar.open-sidebar-button\" :fallback=\"MenuIcon\" />\n </Button>\n </SheetTrigger>\n <SheetContent :side=\"direction === 'rtl' ? 'right' : 'left'\" class=\"w-72 p-0\">\n <SheetHeader class=\"border-b\">\n <SheetTitle as-child>\n <div><Brand /></div>\n </SheetTitle>\n </SheetHeader>\n <nav class=\"flex flex-col gap-4 overflow-y-auto p-4 text-sm\">\n <div\n v-for=\"(group, index) in panel.navigation\"\n :key=\"group.label ?? index\"\n class=\"flex flex-col gap-1\"\n >\n <p v-if=\"group.label\" class=\"text-muted-foreground px-2 text-xs font-medium\">\n {{ group.label }}\n </p>\n <Link\n v-for=\"item in group.items.flatMap((entry) => [entry, ...(entry.children ?? [])])\"\n :key=\"item.label\"\n :href=\"item.url ?? '#'\"\n :data-active=\"item.active ? 'true' : undefined\"\n class=\"hover:bg-accent data-[active=true]:bg-accent flex items-center gap-2 rounded-md px-2 py-2 font-medium [&_svg]:size-4\"\n @click=\"open = false\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" />\n <NavLabel :text=\"item.label\" :html=\"item.labelHtml\" />\n </Link>\n </div>\n </nav>\n </SheetContent>\n </Sheet>\n <Slot name=\"topbar.logo.before\" />\n <Brand class=\"me-2 shrink-0\" />\n <Slot name=\"topbar.logo.after\" />\n <Slot v-if=\"panel.tenancy?.current\" name=\"tenant-menu.before\" />\n <TenantMenu variant=\"topbar\" />\n <Slot v-if=\"panel.tenancy?.current\" name=\"tenant-menu.after\" />\n <nav\n data-slot=\"topnav\"\n :aria-label=\"t('navigation', {}, 'Navigation')\"\n class=\"hidden min-w-0 flex-1 items-center gap-1 self-stretch overflow-x-auto md:flex\"\n >\n <TopNavGroupWrapper\n v-for=\"(group, index) in panel.navigation\"\n :key=\"group.label ?? `group-${index}`\"\n :attributes=\"group.extraTopbarAttributes\"\n >\n <TopNavMenu\n v-if=\"group.label\"\n :label=\"group.label\"\n :icon=\"group.icon\"\n :items=\"group.items\"\n :active=\"group.items.some(isActive)\"\n />\n <template v-for=\"item in group.items\" v-else :key=\"item.label\">\n <TopNavMenu\n v-if=\"item.children && item.children.length > 0\"\n :label=\"item.label\"\n :label-html=\"item.labelHtml\"\n :icon=\"item.icon\"\n :items=\"item.children\"\n :active=\"isActive(item)\"\n :attributes=\"item.extraAttributes\"\n />\n <a\n v-else-if=\"item.openInNewTab\"\n v-bind=\"item.extraAttributes ?? {}\"\n :href=\"item.url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n data-slot=\"topnav-link\"\n :class=\"linkClass\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" />\n <NavLabel :text=\"item.label\" :html=\"item.labelHtml\" />\n <NewTabHint />\n </a>\n <Link\n v-else\n v-bind=\"item.extraAttributes ?? {}\"\n :href=\"item.url ?? '#'\"\n prefetch\n :cache-for=\"PREFETCH_CACHE_FOR\"\n data-slot=\"topnav-link\"\n :data-active=\"item.active ? 'true' : undefined\"\n :class=\"linkClass\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" />\n <NavLabel :text=\"item.label\" :html=\"item.labelHtml\" />\n </Link>\n </template>\n </TopNavGroupWrapper>\n </nav>\n <Slot name=\"topbar.start\" />\n <div class=\"ms-auto flex shrink-0 items-center gap-1\">\n <Slot name=\"topbar.end\" />\n <GlobalSearch />\n <NotificationsMenu />\n <TopbarLocaleSwitcher />\n <ThemeToggle />\n <DebugPanelSlot />\n <UserMenu variant=\"topbar\" />\n </div>\n </div>\n </header>\n <Slot name=\"topbar.after\" />\n <Slot name=\"content.before\" />\n <main\n data-slot=\"content\"\n :class=\"cn('mx-auto flex w-full min-w-0 flex-1 flex-col gap-6 p-4 md:p-6', width)\"\n >\n <Breadcrumbs\n v-if=\"panel.breadcrumbs && props.breadcrumbs && props.breadcrumbs.length > 0\"\n :items=\"props.breadcrumbs\"\n />\n <Slot name=\"content.start\" />\n <slot />\n <Slot name=\"content.end\" />\n </main>\n <Slot name=\"content.after\" />\n <Slot name=\"footer\" />\n <component :is=\"Bottom\" v-if=\"mobilePreset\" />\n <Slot name=\"layout.end\" />\n <Slot name=\"body.end\" />\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kGAwDMkE,IACJ;;;;;;;EAhBF,IAAME,IAAQC,GACRC,IAAQC,EAAS,GACjBC,IAAIC,EAAK,GACTC,KAAYC,EAAa,GACzBC,KAAWC,EAAY,GACvBC,IAAOC,EAAI,EAAK,GAChBC,KAASC,QAAeL,GAAS,QAAQ,kBAAkB,KAAK5E,EAAS,GACzEkF,KAAeD,QAAeE,GAAgBb,EAAM,KAAK,CAAC,GAC1Dc,IAAQH,QACNI,EAAWjB,EAAM,mBAAmBE,EAAM,MAAM,mBAAmB,UAAU,WACrF,GAEMgB,KAAY,MAChB,GAAQC,EAAK,UAAUA,EAAK,UAAU,KAAKD,CAAQ;oBAOnDrF,EAAA,GAAAC,EAgJM,OAhJNyD,GAgJM;GA/IJxD,EAA0BC,GAAA,EAApB,MAAK,aAAY,CAAA;GACvBD,EAA4BC,GAAA,EAAtB,MAAK,eAAc,CAAA;GACzBD,EAA6BC,GAAA,EAAvB,MAAK,gBAAe,CAAA;GAC1BC,EAwHS,UAxHTuD,GAwHS,CApHPvD,EAmHM,OAAA,EAnHA,OAAKC,EAAEC,EAAAuF,CAAA,CAAE,CAAA,4DAA6DV,EAAA,KAAK,CAAA,EAAA,GAAA;IAC/EjF,EAyCQK,GAAA;KAzCA,MAAMsE,EAAA;KAAO,iBAAW,AAAAiB,EAAA,QAAA,MAAE,EAAA,QAAOC;;KACvC,SAAAvF,QAUe,CAVfN,EAUeO,GAAA,EAVD,YAAA,GAAQ,GAAA;MACpB,SAAAD,QAQS,CARTN,EAQSQ,GAAA;OAPP,MAAK;OACL,SAAQ;OACR,MAAK;OACL,OAAM;OACL,cAAYJ,EAAAiE,CAAA,CAAC,CAAA,kBAAA,CAAA,GAAA,gBAAA;;OAEd,SAAA/D,QAA+E,CAA/EN,EAA+EI,EAAAK,CAAA,GAAA;QAAzE,MAAK;QAA8C,UAAUL,EAAA2F,CAAA;;;;;KAGvE/F,CAAAA,GAAAA,EA4BeU,GAAA;MA5BA,MAAMN,EAAAmE,EAAA,MAAS,QAAA,UAAA;MAA+B,OAAM;;MACjE,SAAAjE,QAIc,CAJdN,EAIcW,GAAA,EAJD,OAAM,WAAU,GAAA;OAC3B,SAAAL,QAEa,CAFbN,EAEaY,GAAA,EAFD,YAAA,GAAQ,GAAA;QAClB,SAAAN,QAAoB,CAApBJ,EAAoB,OAAA,MAAA,CAAfF,EAASa,CAAA,CAAA,CAAA,CAAA,CAAA;;;;MAGlBX,CAAAA,GAAAA,EAqBM,OArBNwD,GAqBM,EApBJ5D,EAAA,EAAA,GAAAC,EAmBMe,GAAA,MAAAC,EAlBqBX,EAAA+D,CAAA,CAAK,CAAC,aAAvB,GAAO,OADjBrE,EAAA,GAAAC,EAmBM,OAAA;OAjBH,KAAKmG,EAAM,SAASC;OACrB,OAAM;MAEG,GAAA,CAAAD,EAAM,SAAfpG,EAAA,GAAAC,EAEI,KAFJ4D,GAEI3C,EADCkF,EAAM,KAAK,GAAA,CAAA,KAAAG,EAAA,IAAA,EAAA,IAEhBvG,EAAA,EAAA,GAAAC,EAUOe,GAAA,MAAAC,EATUmF,EAAM,MAAM,SAAS,MAAK,CAAMI,GAAK,GAAMA,EAAM,YAAQ,CAAA,CAAA,CAAA,IAAjE,OADTxG,EAAA,GAAAoB,EAUOd,EAAAoG,CAAA,GAAA;OARJ,KAAKpB,EAAK;OACV,MAAMA,EAAK,OAAG;OACd,eAAaA,EAAK,SAAM,SAAY,KAAA;OACrC,OAAM;OACL,SAAK,AAAAQ,EAAA,QAAA,MAAE,EAAA,QAAI;;OAEZ,SAAAtF,QAA2C,CAA/B8E,EAAK,QAAjBtF,EAAA,GAAAoB,EAA2Cd,EAAAK,CAAA,GAAA;;QAAnB,MAAM2E,EAAK;OACnCpF,GAAAA,MAAAA,GAAAA,CAAAA,MAAAA,CAAAA,KAAAA,EAAAA,IAAAA,EAAAA,GAAAA,EAAsDmB,GAAA;QAA3C,MAAMiE,EAAK;QAAQ,MAAMA,EAAK;;;;;;;;IAMnDpF,EAAkCC,GAAA,EAA5B,MAAK,qBAAoB,CAAA;IAC/BD,EAA+Ba,GAAA,EAAxB,OAAM,gBAAe,CAAA;IAC5Bb,EAAiCC,GAAA,EAA3B,MAAK,oBAAmB,CAAA;IAClBG,EAAA+D,CAAA,CAAK,CAAC,SAAS,WAA3BrE,EAAA,GAAAoB,EAAgEjB,GAAA;;KAA5B,MAAK;;IACzCD,EAA+BoB,GAAA,EAAnB,SAAQ,SAAQ,CAAA;IAChBhB,EAAA+D,CAAA,CAAK,CAAC,SAAS,WAA3BrE,EAAA,GAAAoB,EAA+DjB,GAAA;;KAA3B,MAAK;;IACzCC,EAuDM,OAAA;KAtDJ,aAAU;KACT,cAAYE,EAAAiE,CAAA,CAAC,CAAA,cAAA,CAAA,GAAA,YAAA;KACd,OAAM;IAENvE,GAAAA,EAAAA,EAAA,EAAA,GAAAC,EAiDqBe,GAAA,MAAAC,EAhDMX,EAAA+D,CAAA,CAAK,CAAC,aAAvB,GAAO,OADjBrE,EAAA,GAAAoB,EAiDqBG,IAAA;KA/ClB,KAAK6E,EAAM,SAAK,SAAaC;KAC7B,YAAYD,EAAM;;KAEnB,SAAA5F,QAME,CALM4F,EAAM,SADdpG,EAAA,GAAAoB,EAMEI,GAAA;;MAJC,OAAO4E,EAAM;MACb,MAAMA,EAAM;MACZ,OAAOA,EAAM;MACb,QAAQA,EAAM,MAAM,KAAKf,CAAQ;;;;;;KAEpCrF,CAAAA,MAAAA,EAAA,EAAA,GAAAC,EAoCWe,GAAA,EAAA,KAAA,EAAA,GAAAC,EApCcmF,EAAM,QAAd,OAAkCb,EAAA,GAAAC,EAAAU,GAAA,EAAA,KAAAZ,EAAK,MAAA,GAAA,CAE9CA,EAAK,YAAYA,EAAK,SAAS,SAAM,KAD7CtF,EAAA,GAAAoB,EAQEI,GAAA;;MANC,OAAO8D,EAAK;MACZ,cAAYA,EAAK;MACjB,MAAMA,EAAK;MACX,OAAOA,EAAK;MACZ,QAAQD,EAASC,CAAI;MACrB,YAAYA,EAAK;;;;;;;;KAGP,CAAA,KAAAA,EAAK,gBADlBtF,EAAA,GAAAC,EAYI,KAZJwB,EAYI;;;KAVM,GAAA6D,EAAK,mBAAe,CAAA,GAAA;MAC3B,MAAMA,EAAK;MACZ,QAAO;MACP,KAAI;MACJ,aAAU;MACT,OAAOrB;;MAEIqB,EAAK,QAAjBtF,EAAA,GAAAoB,EAA2Cd,EAAAK,CAAA,GAAA;;OAAnB,MAAM2E,EAAK;;MACnCpF,EAAsDmB,GAAA;OAA3C,MAAMiE,EAAK;OAAQ,MAAMA,EAAK;;MACzCpF,EAAcwB,CAAA;KAEhB1B,GAAAA,IAAAA,EAAAA,MAAAA,EAAA,GAAAoB,EAYOd,EAAAoG,CAAA,GAZPjF,EAYO;;;KAVG,GAAA6D,EAAK,mBAAe,CAAA,GAAA;MAC3B,MAAMA,EAAK,OAAG;MACf,UAAA;MACC,aAAWhF,EAAAsG,EAAA;MACZ,aAAU;MACT,eAAatB,EAAK,SAAM,SAAY,KAAA;MACpC,OAAOrB;;MAER,SAAAzD,QAA2C,CAA/B8E,EAAK,QAAjBtF,EAAA,GAAAoB,EAA2Cd,EAAAK,CAAA,GAAA;;OAAnB,MAAM2E,EAAK;MACnCpF,GAAAA,MAAAA,GAAAA,CAAAA,MAAAA,CAAAA,KAAAA,EAAAA,IAAAA,EAAAA,GAAAA,EAAsDmB,GAAA;OAA3C,MAAMiE,EAAK;OAAQ,MAAMA,EAAK;;;;;;;;;;IAKjDpF,EAA4BC,GAAA,EAAtB,MAAK,eAAc,CAAA;IACzBC,EAQM,OARN4D,IAQM;KAPJ9D,EAA0BC,GAAA,EAApB,MAAK,aAAY,CAAA;KACvBD,EAAgByB,CAAA;KAChBzB,EAAqB0B,EAAA;KACrB1B,EAAwB2B,CAAA;KACxB3B,EAAe4B,CAAA;KACf5B,EAAkB6B,EAAA;KAClB7B,EAA6B8B,IAAA,EAAnB,SAAQ,SAAQ,CAAA;;;GAIhC9B,EAA4BC,GAAA,EAAtB,MAAK,eAAc,CAAA;GACzBD,EAA8BC,GAAA,EAAxB,MAAK,iBAAgB,CAAA;GAC3BC,EAWO,QAAA;IAVL,aAAU;IACT,OAAKC,EAAEC,EAAAuF,CAAA,CAAE,CAAA,gEAAiEV,EAAA,KAAK,CAAA;;IAGxE7E,EAAA+D,CAAA,CAAK,CAAC,eAAeF,EAAM,eAAeA,EAAM,YAAY,SAAM,KAD1EnE,EAAA,GAAAoB,EAGEa,IAAA;;KADC,OAAOkC,EAAM;;IAEhBjE,EAA6BC,GAAA,EAAvB,MAAK,gBAAe,CAAA;IAC1B+B,EAAQ4E,EAAA,QAAA,SAAA;IACR5G,EAA2BC,GAAA,EAArB,MAAK,cAAa,CAAA;;GAE1BD,EAA6BC,GAAA,EAAvB,MAAK,gBAAe,CAAA;GAC1BD,EAAsBC,GAAA,EAAhB,MAAK,SAAQ,CAAA;GACW8E,GAAA,SAA9BjF,EAAA,GAAAoB,EAA8Ce,EAA9B4C,GAAA,KAAM,GAAA,EAAA,KAAA,EAAA,CAAA,KAAAwB,EAAA,IAAA,EAAA;GACtBrG,EAA0BC,GAAA,EAApB,MAAK,aAAY,CAAA;GACvBD,EAAwBC,GAAA,EAAlB,MAAK,WAAU,CAAA"}
1
+ {"version":3,"file":"TopNavLayout.vue_vue_type_script_setup_true_lang.js","names":["BottomNav","_openBlock","_createElementBlock","_createVNode","Slot","_createElementVNode","_normalizeClass","_unref","Sheet","_withCtx","SheetTrigger","Button","Icon","SheetContent","SheetHeader","SheetTitle","Brand","_Fragment","_renderList","_toDisplayString","_createCommentVNode","_createBlock","NavLabel","TenantMenu","TopNavGroupWrapper","TopNavMenu","_mergeProps","NewTabHint","GlobalSearch","NotificationsMenu","TopbarLocaleSwitcher","ThemeToggle","DebugPanelSlot","UserMenu","Breadcrumbs","_renderSlot","_resolveDynamicComponent","Icon_default","Button_default","Slot_default","Sheet_default","SheetContent_default","SheetHeader_default","SheetTitle_default","SheetTrigger_default","NewTabHint_default","NavLabel_default","NotificationsMenu_default","Brand_default","GlobalSearch_default","TenantMenu_default","UserMenu_default","BottomNav_default","Breadcrumbs_default","DebugPanelSlot_default","ThemeToggle_default","TopbarLocaleSwitcher_default","TopNavGroupWrapper_default","TopNavMenu_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","linkClass","TopNavLayout_vue_vue_type_script_setup_true_lang_default","props","__props","panel","usePanel","t","useT","direction","useDirection","registry","useRegistry","open","ref","Bottom","computed","mobilePreset","hasMobilePreset","width","MAX_WIDTHS","isActive","item","openBlock","createElementBlock","createVNode","createElementVNode","normalizeClass","unref","cn","_cache","$event","withCtx","MenuIcon","Fragment","renderList","group","index","toDisplayString","createCommentVNode","entry","createBlock","Link","mergeProps","PREFETCH_CACHE_FOR","renderSlot","_ctx","resolveDynamicComponent"],"sources":["../../src/layouts/TopNavLayout.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n PREFETCH_CACHE_FOR,\n hasMobilePreset,\n type BreadcrumbSchema,\n type NavigationItemSchema,\n type Width,\n} from '@alfakit/core'\nimport { Link } from '@inertiajs/vue3'\nimport { MenuIcon } from '@lucide/vue'\nimport { computed, ref } from 'vue'\nimport NotificationsMenu from '../components/notifications/NotificationsMenu.vue'\nimport BottomNav from '../components/panel/BottomNav.vue'\nimport Brand from '../components/panel/Brand.vue'\nimport TenantMenu from '../components/panel/TenantMenu.vue'\nimport Breadcrumbs from '../components/panel/Breadcrumbs.vue'\nimport GlobalSearch from '../components/panel/GlobalSearch.vue'\nimport NavLabel from '../components/panel/NavLabel.vue'\nimport Slot from '../components/panel/Slot.vue'\nimport DebugPanelSlot from '../components/panel/DebugPanelSlot.vue'\nimport ThemeToggle from '../components/panel/ThemeToggle.vue'\nimport TopbarLocaleSwitcher from '../components/panel/TopbarLocaleSwitcher.vue'\nimport UserMenu from '../components/panel/UserMenu.vue'\nimport Button from '../components/ui/Button.vue'\nimport Sheet from '../components/ui/Sheet.vue'\nimport SheetContent from '../components/ui/SheetContent.vue'\nimport SheetHeader from '../components/ui/SheetHeader.vue'\nimport SheetTitle from '../components/ui/SheetTitle.vue'\nimport SheetTrigger from '../components/ui/SheetTrigger.vue'\nimport { useDirection, usePanel, useRegistry, useT } from '../context'\nimport { Icon } from '../lib/icons'\nimport { cn } from '../lib/utils'\nimport { MAX_WIDTHS } from './max-widths'\nimport TopNavGroupWrapper from './TopNavGroupWrapper.vue'\nimport TopNavMenu from './TopNavMenu.vue'\nimport NewTabHint from '../lib/NewTabHint.vue'\n\n/**\n * Navigation across the top instead of a sidebar (`layout: 'topbar'`). Ungrouped items are\n * links; labelled groups and items with children open as dropdowns.\n */\nconst props = defineProps<{ breadcrumbs?: BreadcrumbSchema[]; maxContentWidth?: Width | string }>()\nconst panel = usePanel()\nconst t = useT()\nconst direction = useDirection()\nconst registry = useRegistry()\nconst open = ref(false)\nconst Bottom = computed(() => registry.resolve('panel:bottom-nav') ?? BottomNav)\nconst mobilePreset = computed(() => hasMobilePreset(panel.value))\nconst width = computed(\n () => MAX_WIDTHS[props.maxContentWidth ?? panel.value.maxContentWidth ?? '7xl'] ?? 'max-w-7xl',\n)\n\nconst isActive = (item: NavigationItemSchema): boolean =>\n Boolean(item.active || item.children?.some(isActive))\n\nconst linkClass =\n 'text-muted-foreground hover:text-foreground hover:bg-accent data-[active=true]:bg-accent data-[active=true]:text-foreground inline-flex h-9 shrink-0 items-center gap-2 rounded-md px-3 text-sm font-medium transition-colors [&_svg]:size-4'\n</script>\n\n<template>\n <div data-slot=\"topnav-layout\" class=\"bg-background flex min-h-svh flex-col\">\n <Slot name=\"body.start\" />\n <Slot name=\"layout.start\" />\n <Slot name=\"topbar.before\" />\n <header\n data-slot=\"topbar\"\n class=\"bg-background/90 supports-[backdrop-filter]:bg-background/70 sticky top-0 z-30 border-b backdrop-blur\"\n >\n <div :class=\"cn('mx-auto flex h-14 w-full items-center gap-3 px-4 md:px-6', width)\">\n <Sheet :open=\"open\" @update:open=\"open = $event\">\n <SheetTrigger as-child>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n class=\"md:hidden\"\n :aria-label=\"t('toggle_sidebar', {}, 'Toggle sidebar')\"\n >\n <Icon name=\"alfakit::panels.topbar.open-sidebar-button\" :fallback=\"MenuIcon\" />\n </Button>\n </SheetTrigger>\n <SheetContent :side=\"direction === 'rtl' ? 'right' : 'left'\" class=\"w-72 p-0\">\n <SheetHeader class=\"border-b\">\n <SheetTitle as-child>\n <div><Brand /></div>\n </SheetTitle>\n </SheetHeader>\n <nav class=\"flex flex-col gap-4 overflow-y-auto p-4 text-sm\">\n <div\n v-for=\"(group, index) in panel.navigation\"\n :key=\"group.label ?? index\"\n class=\"flex flex-col gap-1\"\n >\n <p v-if=\"group.label\" class=\"text-muted-foreground px-2 text-xs font-medium\">\n {{ group.label }}\n </p>\n <Link\n v-for=\"item in group.items.flatMap((entry) => [entry, ...(entry.children ?? [])])\"\n :key=\"item.url ?? item.label\"\n :href=\"item.url ?? '#'\"\n :data-active=\"item.active ? 'true' : undefined\"\n class=\"hover:bg-accent data-[active=true]:bg-accent flex items-center gap-2 rounded-md px-2 py-2 font-medium [&_svg]:size-4\"\n @click=\"open = false\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" />\n <NavLabel :text=\"item.label\" :html=\"item.labelHtml\" />\n </Link>\n </div>\n </nav>\n </SheetContent>\n </Sheet>\n <Slot name=\"topbar.logo.before\" />\n <Brand class=\"me-2 shrink-0\" />\n <Slot name=\"topbar.logo.after\" />\n <Slot v-if=\"panel.tenancy?.current\" name=\"tenant-menu.before\" />\n <TenantMenu variant=\"topbar\" />\n <Slot v-if=\"panel.tenancy?.current\" name=\"tenant-menu.after\" />\n <nav\n data-slot=\"topnav\"\n :aria-label=\"t('navigation', {}, 'Navigation')\"\n class=\"hidden min-w-0 flex-1 items-center gap-1 self-stretch overflow-x-auto md:flex\"\n >\n <TopNavGroupWrapper\n v-for=\"(group, index) in panel.navigation\"\n :key=\"group.label ?? `group-${index}`\"\n :attributes=\"group.extraTopbarAttributes\"\n >\n <TopNavMenu\n v-if=\"group.label\"\n :label=\"group.label\"\n :icon=\"group.icon\"\n :items=\"group.items\"\n :active=\"group.items.some(isActive)\"\n />\n <template v-for=\"item in group.items\" v-else :key=\"item.url ?? item.label\">\n <TopNavMenu\n v-if=\"item.children && item.children.length > 0\"\n :label=\"item.label\"\n :label-html=\"item.labelHtml\"\n :icon=\"item.icon\"\n :items=\"item.children\"\n :active=\"isActive(item)\"\n :attributes=\"item.extraAttributes\"\n />\n <a\n v-else-if=\"item.openInNewTab\"\n v-bind=\"item.extraAttributes ?? {}\"\n :href=\"item.url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n data-slot=\"topnav-link\"\n :class=\"linkClass\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" />\n <NavLabel :text=\"item.label\" :html=\"item.labelHtml\" />\n <NewTabHint />\n </a>\n <Link\n v-else\n v-bind=\"item.extraAttributes ?? {}\"\n :href=\"item.url ?? '#'\"\n prefetch\n :cache-for=\"PREFETCH_CACHE_FOR\"\n data-slot=\"topnav-link\"\n :data-active=\"item.active ? 'true' : undefined\"\n :class=\"linkClass\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" />\n <NavLabel :text=\"item.label\" :html=\"item.labelHtml\" />\n </Link>\n </template>\n </TopNavGroupWrapper>\n </nav>\n <Slot name=\"topbar.start\" />\n <div class=\"ms-auto flex shrink-0 items-center gap-1\">\n <Slot name=\"topbar.end\" />\n <GlobalSearch />\n <NotificationsMenu />\n <TopbarLocaleSwitcher />\n <ThemeToggle />\n <DebugPanelSlot />\n <UserMenu variant=\"topbar\" />\n </div>\n </div>\n </header>\n <Slot name=\"topbar.after\" />\n <Slot name=\"content.before\" />\n <main\n data-slot=\"content\"\n :class=\"cn('mx-auto flex w-full min-w-0 flex-1 flex-col gap-6 p-4 md:p-6', width)\"\n >\n <Breadcrumbs\n v-if=\"panel.breadcrumbs && props.breadcrumbs && props.breadcrumbs.length > 0\"\n :items=\"props.breadcrumbs\"\n />\n <Slot name=\"content.start\" />\n <slot />\n <Slot name=\"content.end\" />\n </main>\n <Slot name=\"content.after\" />\n <Slot name=\"footer\" />\n <component :is=\"Bottom\" v-if=\"mobilePreset\" />\n <Slot name=\"layout.end\" />\n <Slot name=\"body.end\" />\n </div>\n</template>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TopNavMenu.js","names":["_sfc_main","TopNavMenu_vue_vue_type_script_setup_true_lang_default","TopNavMenu_default"],"sources":["../../src/layouts/TopNavMenu.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { NavigationItemSchema } from '@alfakit/core'\nimport { Link } from '@inertiajs/vue3'\nimport { ChevronDownIcon } from '@lucide/vue'\nimport DropdownMenu from '../components/ui/DropdownMenu.vue'\nimport DropdownMenuContent from '../components/ui/DropdownMenuContent.vue'\nimport DropdownMenuItem from '../components/ui/DropdownMenuItem.vue'\nimport DropdownMenuTrigger from '../components/ui/DropdownMenuTrigger.vue'\nimport NavLabel from '../components/panel/NavLabel.vue'\nimport { Icon } from '../lib/icons'\nimport { cn } from '../lib/utils'\n\n/** A top-navigation dropdown: a labelled group or an item with children. */\nconst props = defineProps<{\n label: string\n /** `label` is sanitised HTML (an `Htmlable` navigation label). */\n labelHtml?: boolean\n icon?: string\n items: NavigationItemSchema[]\n active: boolean\n /** `NavigationItem::extraAttributes()` of an item with children. */\n attributes?: NavigationItemSchema['extraAttributes']\n}>()\n</script>\n\n<template>\n <DropdownMenu>\n <DropdownMenuTrigger\n v-bind=\"props.attributes ?? {}\"\n data-slot=\"topnav-link\"\n :data-active=\"props.active ? 'true' : undefined\"\n class=\"text-muted-foreground hover:text-foreground hover:bg-accent data-[active=true]:bg-accent data-[active=true]:text-foreground data-[state=open]:text-foreground inline-flex h-9 shrink-0 items-center gap-1.5 rounded-md px-3 text-sm font-medium transition-colors outline-none [&_svg]:size-4\"\n >\n <Icon v-if=\"props.icon\" :name=\"props.icon\" />\n <NavLabel :text=\"props.label\" :html=\"props.labelHtml\" />\n <ChevronDownIcon class=\"opacity-60\" />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" class=\"min-w-48\">\n <DropdownMenuItem v-for=\"item in props.items\" :key=\"item.label\" as-child>\n <Link\n v-bind=\"item.extraAttributes ?? {}\"\n :href=\"item.url ?? '#'\"\n :class=\"cn('w-full', item.active && 'font-medium')\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" />\n <NavLabel :text=\"item.label\" :html=\"item.labelHtml\" />\n </Link>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"TopNavMenu.js","names":["_sfc_main","TopNavMenu_vue_vue_type_script_setup_true_lang_default","TopNavMenu_default"],"sources":["../../src/layouts/TopNavMenu.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { NavigationItemSchema } from '@alfakit/core'\nimport { Link } from '@inertiajs/vue3'\nimport { ChevronDownIcon } from '@lucide/vue'\nimport DropdownMenu from '../components/ui/DropdownMenu.vue'\nimport DropdownMenuContent from '../components/ui/DropdownMenuContent.vue'\nimport DropdownMenuItem from '../components/ui/DropdownMenuItem.vue'\nimport DropdownMenuTrigger from '../components/ui/DropdownMenuTrigger.vue'\nimport NavLabel from '../components/panel/NavLabel.vue'\nimport { Icon } from '../lib/icons'\nimport { cn } from '../lib/utils'\n\n/** A top-navigation dropdown: a labelled group or an item with children. */\nconst props = defineProps<{\n label: string\n /** `label` is sanitised HTML (an `Htmlable` navigation label). */\n labelHtml?: boolean\n icon?: string\n items: NavigationItemSchema[]\n active: boolean\n /** `NavigationItem::extraAttributes()` of an item with children. */\n attributes?: NavigationItemSchema['extraAttributes']\n}>()\n</script>\n\n<template>\n <DropdownMenu>\n <DropdownMenuTrigger\n v-bind=\"props.attributes ?? {}\"\n data-slot=\"topnav-link\"\n :data-active=\"props.active ? 'true' : undefined\"\n class=\"text-muted-foreground hover:text-foreground hover:bg-accent data-[active=true]:bg-accent data-[active=true]:text-foreground data-[state=open]:text-foreground inline-flex h-9 shrink-0 items-center gap-1.5 rounded-md px-3 text-sm font-medium transition-colors outline-none [&_svg]:size-4\"\n >\n <Icon v-if=\"props.icon\" :name=\"props.icon\" />\n <NavLabel :text=\"props.label\" :html=\"props.labelHtml\" />\n <ChevronDownIcon class=\"opacity-60\" />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" class=\"min-w-48\">\n <DropdownMenuItem v-for=\"item in props.items\" :key=\"item.url ?? item.label\" as-child>\n <Link\n v-bind=\"item.extraAttributes ?? {}\"\n :href=\"item.url ?? '#'\"\n :class=\"cn('w-full', item.active && 'font-medium')\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" />\n <NavLabel :text=\"item.label\" :html=\"item.labelHtml\" />\n </Link>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n</template>\n"],"mappings":""}
@@ -44,7 +44,7 @@ var b = /*@__PURE__*/ p({
44
44
  class: "min-w-48"
45
45
  }, {
46
46
  default: v(() => [(h(!0), d(c, null, g(b.items, (n) => (h(), l(i, {
47
- key: n.label,
47
+ key: n.url ?? n.label,
48
48
  "as-child": ""
49
49
  }, {
50
50
  default: v(() => [f(_(s), m({ ref_for: !0 }, n.extraAttributes ?? {}, {
@@ -1 +1 @@
1
- {"version":3,"file":"TopNavMenu.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","DropdownMenu","_withCtx","_createVNode","DropdownMenuTrigger","_mergeProps","_unref","Icon","_createCommentVNode","NavLabel","DropdownMenuContent","_createElementBlock","_Fragment","_renderList","DropdownMenuItem","Icon_default","DropdownMenu_default","DropdownMenuContent_default","DropdownMenuItem_default","DropdownMenuTrigger_default","NavLabel_default","TopNavMenu_vue_vue_type_script_setup_true_lang_default","props","__props","openBlock","createBlock","withCtx","createVNode","mergeProps","unref","createCommentVNode","ChevronDownIcon","createElementBlock","Fragment","renderList","item","Link","cn"],"sources":["../../src/layouts/TopNavMenu.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { NavigationItemSchema } from '@alfakit/core'\nimport { Link } from '@inertiajs/vue3'\nimport { ChevronDownIcon } from '@lucide/vue'\nimport DropdownMenu from '../components/ui/DropdownMenu.vue'\nimport DropdownMenuContent from '../components/ui/DropdownMenuContent.vue'\nimport DropdownMenuItem from '../components/ui/DropdownMenuItem.vue'\nimport DropdownMenuTrigger from '../components/ui/DropdownMenuTrigger.vue'\nimport NavLabel from '../components/panel/NavLabel.vue'\nimport { Icon } from '../lib/icons'\nimport { cn } from '../lib/utils'\n\n/** A top-navigation dropdown: a labelled group or an item with children. */\nconst props = defineProps<{\n label: string\n /** `label` is sanitised HTML (an `Htmlable` navigation label). */\n labelHtml?: boolean\n icon?: string\n items: NavigationItemSchema[]\n active: boolean\n /** `NavigationItem::extraAttributes()` of an item with children. */\n attributes?: NavigationItemSchema['extraAttributes']\n}>()\n</script>\n\n<template>\n <DropdownMenu>\n <DropdownMenuTrigger\n v-bind=\"props.attributes ?? {}\"\n data-slot=\"topnav-link\"\n :data-active=\"props.active ? 'true' : undefined\"\n class=\"text-muted-foreground hover:text-foreground hover:bg-accent data-[active=true]:bg-accent data-[active=true]:text-foreground data-[state=open]:text-foreground inline-flex h-9 shrink-0 items-center gap-1.5 rounded-md px-3 text-sm font-medium transition-colors outline-none [&_svg]:size-4\"\n >\n <Icon v-if=\"props.icon\" :name=\"props.icon\" />\n <NavLabel :text=\"props.label\" :html=\"props.labelHtml\" />\n <ChevronDownIcon class=\"opacity-60\" />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" class=\"min-w-48\">\n <DropdownMenuItem v-for=\"item in props.items\" :key=\"item.label\" as-child>\n <Link\n v-bind=\"item.extraAttributes ?? {}\"\n :href=\"item.url ?? '#'\"\n :class=\"cn('w-full', item.active && 'font-medium')\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" />\n <NavLabel :text=\"item.label\" :html=\"item.labelHtml\" />\n </Link>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;EAaA,IAAMuB,IAAQC;oBAaZxB,EAAA,GAAAC,EAuBeC,GAAA,MAAA;GAtBb,SAAAC,QASsB,CATtBC,EASsBC,GATtBC,EACUiB,EAAM,cAAU,CAAA,GAAA;IACxB,aAAU;IACT,eAAaA,EAAM,SAAM,SAAY,KAAA;IACtC,OAAM;;IAEN,SAAApB,QAA6C;KAAjCoB,EAAM,QAAlBvB,EAAA,GAAAC,EAA6CM,EAAAC,CAAA,GAAA;;MAApB,MAAMe,EAAM;;KACrCnB,EAAwDM,GAAA;MAA7C,MAAMa,EAAM;MAAQ,MAAMA,EAAM;;KAC3CnB,EAAsCG,EAAAyB,CAAA,GAAA,EAArB,OAAM,aAAY,CAAA;;;GAErC5B,GAAAA,IAAAA,CAAAA,aAAAA,CAAAA,GAAAA,EAWsBO,GAAA;IAXD,OAAM;IAAQ,OAAM;;IACrB,SAAAR,QAA2B,EAA7CH,EAAA,EAAA,GAAAY,EASmBC,GAAA,MAAAC,EATcS,EAAM,QAAd,OAAzBvB,EAAA,GAAAC,EASmBc,GAAA;KAT4B,KAAKqB,EAAK;KAAO,YAAA;;KAC9D,SAAAjC,QAOO,CAPPC,EAOOG,EAAA8B,CAAA,GAPP/B,EAOO,EAAA,SAAA,GAAA,GANG8B,EAAK,mBAAe,CAAA,GAAA;MAC3B,MAAMA,EAAK,OAAG;MACd,OAAO7B,EAAA+B,CAAA,CAAE,CAAA,UAAWF,EAAK,UAAM,aAAA;;MAEhC,SAAAjC,QAA2C,CAA/BiC,EAAK,QAAjBpC,EAAA,GAAAC,EAA2CM,EAAAC,CAAA,GAAA;;OAAnB,MAAM4B,EAAK;MACnChC,GAAAA,MAAAA,GAAAA,CAAAA,MAAAA,CAAAA,KAAAA,EAAAA,IAAAA,EAAAA,GAAAA,EAAsDM,GAAA;OAA3C,MAAM0B,EAAK;OAAQ,MAAMA,EAAK"}
1
+ {"version":3,"file":"TopNavMenu.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","DropdownMenu","_withCtx","_createVNode","DropdownMenuTrigger","_mergeProps","_unref","Icon","_createCommentVNode","NavLabel","DropdownMenuContent","_createElementBlock","_Fragment","_renderList","DropdownMenuItem","Icon_default","DropdownMenu_default","DropdownMenuContent_default","DropdownMenuItem_default","DropdownMenuTrigger_default","NavLabel_default","TopNavMenu_vue_vue_type_script_setup_true_lang_default","props","__props","openBlock","createBlock","withCtx","createVNode","mergeProps","unref","createCommentVNode","ChevronDownIcon","createElementBlock","Fragment","renderList","item","Link","cn"],"sources":["../../src/layouts/TopNavMenu.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { NavigationItemSchema } from '@alfakit/core'\nimport { Link } from '@inertiajs/vue3'\nimport { ChevronDownIcon } from '@lucide/vue'\nimport DropdownMenu from '../components/ui/DropdownMenu.vue'\nimport DropdownMenuContent from '../components/ui/DropdownMenuContent.vue'\nimport DropdownMenuItem from '../components/ui/DropdownMenuItem.vue'\nimport DropdownMenuTrigger from '../components/ui/DropdownMenuTrigger.vue'\nimport NavLabel from '../components/panel/NavLabel.vue'\nimport { Icon } from '../lib/icons'\nimport { cn } from '../lib/utils'\n\n/** A top-navigation dropdown: a labelled group or an item with children. */\nconst props = defineProps<{\n label: string\n /** `label` is sanitised HTML (an `Htmlable` navigation label). */\n labelHtml?: boolean\n icon?: string\n items: NavigationItemSchema[]\n active: boolean\n /** `NavigationItem::extraAttributes()` of an item with children. */\n attributes?: NavigationItemSchema['extraAttributes']\n}>()\n</script>\n\n<template>\n <DropdownMenu>\n <DropdownMenuTrigger\n v-bind=\"props.attributes ?? {}\"\n data-slot=\"topnav-link\"\n :data-active=\"props.active ? 'true' : undefined\"\n class=\"text-muted-foreground hover:text-foreground hover:bg-accent data-[active=true]:bg-accent data-[active=true]:text-foreground data-[state=open]:text-foreground inline-flex h-9 shrink-0 items-center gap-1.5 rounded-md px-3 text-sm font-medium transition-colors outline-none [&_svg]:size-4\"\n >\n <Icon v-if=\"props.icon\" :name=\"props.icon\" />\n <NavLabel :text=\"props.label\" :html=\"props.labelHtml\" />\n <ChevronDownIcon class=\"opacity-60\" />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" class=\"min-w-48\">\n <DropdownMenuItem v-for=\"item in props.items\" :key=\"item.url ?? item.label\" as-child>\n <Link\n v-bind=\"item.extraAttributes ?? {}\"\n :href=\"item.url ?? '#'\"\n :class=\"cn('w-full', item.active && 'font-medium')\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" />\n <NavLabel :text=\"item.label\" :html=\"item.labelHtml\" />\n </Link>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;EAaA,IAAMuB,IAAQC;oBAaZxB,EAAA,GAAAC,EAuBeC,GAAA,MAAA;GAtBb,SAAAC,QASsB,CATtBC,EASsBC,GATtBC,EACUiB,EAAM,cAAU,CAAA,GAAA;IACxB,aAAU;IACT,eAAaA,EAAM,SAAM,SAAY,KAAA;IACtC,OAAM;;IAEN,SAAApB,QAA6C;KAAjCoB,EAAM,QAAlBvB,EAAA,GAAAC,EAA6CM,EAAAC,CAAA,GAAA;;MAApB,MAAMe,EAAM;;KACrCnB,EAAwDM,GAAA;MAA7C,MAAMa,EAAM;MAAQ,MAAMA,EAAM;;KAC3CnB,EAAsCG,EAAAyB,CAAA,GAAA,EAArB,OAAM,aAAY,CAAA;;;GAErC5B,GAAAA,IAAAA,CAAAA,aAAAA,CAAAA,GAAAA,EAWsBO,GAAA;IAXD,OAAM;IAAQ,OAAM;;IACrB,SAAAR,QAA2B,EAA7CH,EAAA,EAAA,GAAAY,EASmBC,GAAA,MAAAC,EATcS,EAAM,QAAd,OAAzBvB,EAAA,GAAAC,EASmBc,GAAA;KAT4B,KAAKqB,EAAK,OAAOA,EAAK;KAAO,YAAA;;KAC1E,SAAAjC,QAOO,CAPPC,EAOOG,EAAA8B,CAAA,GAPP/B,EAOO,EAAA,SAAA,GAAA,GANG8B,EAAK,mBAAe,CAAA,GAAA;MAC3B,MAAMA,EAAK,OAAG;MACd,OAAO7B,EAAA+B,CAAA,CAAE,CAAA,UAAWF,EAAK,UAAM,aAAA;;MAEhC,SAAAjC,QAA2C,CAA/BiC,EAAK,QAAjBpC,EAAA,GAAAC,EAA2CM,EAAAC,CAAA,GAAA;;OAAnB,MAAM4B,EAAK;MACnChC,GAAAA,MAAAA,GAAAA,CAAAA,MAAAA,CAAAA,KAAAA,EAAAA,IAAAA,EAAAA,GAAAA,EAAsDM,GAAA;OAA3C,MAAM0B,EAAK;OAAQ,MAAMA,EAAK"}
@@ -1 +1 @@
1
- {"version":3,"file":"AlfakitPage.js","names":["_sfc_main","AlfakitPage_vue_vue_type_script_setup_true_lang_default","AlfakitPage_default"],"sources":["../../src/pages/AlfakitPage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { openDefaultAction, resolveLazyComponents, type DefaultActionOpener } from '@alfakit/core'\nimport { Head } from '@inertiajs/vue3'\nimport { computed, onMounted, watch } from 'vue'\nimport { providePageActionContext } from '../components/actions/action-context'\nimport { useActionRunner, useAlfakit, useAlfakitProps, usePanel, useT } from '../context'\nimport PageContent from './PageContent.vue'\nimport PageShell from './PageShell.vue'\n\n/**\n * `Alfakit/Page`: renders any schema-driven page. Custom pages (`Page::$component`) are\n * resolved from the `pages` map passed to `createAlfakit()`.\n */\nconst props = useAlfakitProps()\nconst panel = usePanel()\nconst t = useT()\nconst { pages } = useAlfakit()\n// Lazy widgets and relation managers arrive in a deferred prop after the first response.\nconst page = computed(() =>\n props.value.page ? resolveLazyComponents(props.value.page, props.value.alfakitLazy) : undefined,\n)\n// Starter kit mode: the host's `title` callback adds the application name.\nconst title = computed(() =>\n page.value\n ? panel.value.starterKit\n ? page.value.title\n : `${page.value.title} - ${panel.value.brandName}`\n : panel.value.brandName,\n)\nconst custom = computed(() => (page.value?.view ? pages[page.value.view.component] : undefined))\n\n// The page's default action (`$defaultAction`, `?tableAction=`) opens once the page has\n// hydrated, and once per page: re-renders after the action ran don't open it again.\nconst runner = useActionRunner()\nconst opener: DefaultActionOpener = { opened: null }\nconst openDefault = () =>\n openDefaultAction(page.value, opener, (action, context) => runner.trigger(action, context))\n\nonMounted(() => {\n openDefault()\n watch(page, openDefault)\n})\n\nprovidePageActionContext({\n get token() {\n return page.value?.token ?? ''\n },\n component: 'page',\n})\n</script>\n\n<template>\n <template v-if=\"page\">\n <Head :title=\"title\" />\n <div v-if=\"page.view && !custom\" class=\"text-destructive p-6\">\n {{\n t(\n 'page_not_registered',\n { component: page.view.component },\n `Page component ${page.view.component} is not registered in createAlfakit({ pages }).`,\n )\n }}\n </div>\n <PageShell v-else :page=\"page\">\n <component :is=\"custom\" v-if=\"page.view && custom\" v-bind=\"page.view.props\" :page=\"page\" />\n <PageContent v-else :page=\"page\" />\n </PageShell>\n </template>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"AlfakitPage.js","names":["_sfc_main","AlfakitPage_vue_vue_type_script_setup_true_lang_default","AlfakitPage_default"],"sources":["../../src/pages/AlfakitPage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n customPageProps,\n openDefaultAction,\n resolveLazyComponents,\n type DefaultActionOpener,\n} from '@alfakit/core'\nimport { Head } from '@inertiajs/vue3'\nimport { computed, onMounted, watch } from 'vue'\nimport { providePageActionContext } from '../components/actions/action-context'\nimport { useActionRunner, useAlfakit, useAlfakitProps, usePanel, useT } from '../context'\nimport PageContent from './PageContent.vue'\nimport PageShell from './PageShell.vue'\n\n/**\n * `Alfakit/Page`: renders any schema-driven page. Custom pages (`Page::$component`) are\n * resolved from the `pages` map passed to `createAlfakit()`.\n */\nconst props = useAlfakitProps()\nconst panel = usePanel()\nconst t = useT()\nconst { pages } = useAlfakit()\n// Lazy widgets and relation managers arrive in a deferred prop after the first response.\nconst page = computed(() =>\n props.value.page ? resolveLazyComponents(props.value.page, props.value.alfakitLazy) : undefined,\n)\n// Starter kit mode: the host's `title` callback adds the application name.\nconst title = computed(() =>\n page.value\n ? panel.value.starterKit\n ? page.value.title\n : `${page.value.title} - ${panel.value.brandName}`\n : panel.value.brandName,\n)\nconst custom = computed(() => (page.value?.view ? pages[page.value.view.component] : undefined))\n// A custom component brings its own `PageShell` (as in panel mode, where it is the Inertia\n// page itself) and takes the live props, so `reloadProps()` reaches it.\nconst customProps = computed(() =>\n customPageProps(page.value?.view?.props, props.value as Record<string, unknown>),\n)\n\n// The page's default action (`$defaultAction`, `?tableAction=`) opens once the page has\n// hydrated, and once per page: re-renders after the action ran don't open it again.\nconst runner = useActionRunner()\nconst opener: DefaultActionOpener = { opened: null }\nconst openDefault = () =>\n openDefaultAction(page.value, opener, (action, context) => runner.trigger(action, context))\n\nonMounted(() => {\n openDefault()\n watch(page, openDefault)\n})\n\nprovidePageActionContext({\n get token() {\n return page.value?.token ?? ''\n },\n component: 'page',\n})\n</script>\n\n<template>\n <template v-if=\"page\">\n <Head :title=\"title\" />\n <div v-if=\"page.view && !custom\" class=\"text-destructive p-6\">\n {{\n t(\n 'page_not_registered',\n { component: page.view.component },\n `Page component ${page.view.component} is not registered in createAlfakit({ pages }).`,\n )\n }}\n </div>\n <component :is=\"custom\" v-else-if=\"page.view && custom\" v-bind=\"customProps\" :page=\"page\" />\n <PageShell v-else :page=\"page\">\n <PageContent :page=\"page\" />\n </PageShell>\n </template>\n</template>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"AlfakitPage.vue.d.ts","sourceRoot":"","sources":["../../src/pages/AlfakitPage.vue"],"names":[],"mappings":";AAmNA,wBAKG"}
1
+ {"version":3,"file":"AlfakitPage.vue.d.ts","sourceRoot":"","sources":["../../src/pages/AlfakitPage.vue"],"names":[],"mappings":";AAsOA,wBAKG"}
@@ -2,37 +2,34 @@ import { useActionRunner as e, useAlfakit as t, useAlfakitProps as n, usePanel a
2
2
  import { providePageActionContext as a } from "../components/actions/action-context.js";
3
3
  import o from "./PageShell.js";
4
4
  import s from "./PageContent.js";
5
- import { openDefaultAction as c, resolveLazyComponents as l } from "@alfakit/core";
6
- import { Head as u } from "@inertiajs/vue3";
7
- import { Fragment as d, computed as f, createBlock as p, createCommentVNode as m, createElementBlock as h, createVNode as g, defineComponent as _, mergeProps as v, onMounted as y, openBlock as b, resolveDynamicComponent as x, toDisplayString as S, unref as C, watch as w, withCtx as T } from "vue";
5
+ import { customPageProps as c, openDefaultAction as l, resolveLazyComponents as u } from "@alfakit/core";
6
+ import { Head as d } from "@inertiajs/vue3";
7
+ import { Fragment as f, computed as p, createBlock as m, createCommentVNode as h, createElementBlock as g, createVNode as _, defineComponent as v, mergeProps as y, onMounted as b, openBlock as x, resolveDynamicComponent as S, toDisplayString as C, unref as w, watch as T, withCtx as E } from "vue";
8
8
  //#region src/pages/AlfakitPage.vue?vue&type=script&setup=true&lang.ts
9
- var E = {
9
+ var D = {
10
10
  key: 0,
11
11
  class: "text-destructive p-6"
12
- }, D = /*@__PURE__*/ _({
12
+ }, O = /*@__PURE__*/ v({
13
13
  __name: "AlfakitPage",
14
- setup(_) {
15
- let D = n(), O = r(), k = i(), { pages: A } = t(), j = f(() => D.value.page ? l(D.value.page, D.value.alfakitLazy) : void 0), M = f(() => j.value ? O.value.starterKit ? j.value.title : `${j.value.title} - ${O.value.brandName}` : O.value.brandName), N = f(() => j.value?.view ? A[j.value.view.component] : void 0), P = e(), F = { opened: null }, I = () => c(j.value, F, (e, t) => P.trigger(e, t));
16
- return y(() => {
17
- I(), w(j, I);
14
+ setup(v) {
15
+ let O = n(), k = r(), A = i(), { pages: j } = t(), M = p(() => O.value.page ? u(O.value.page, O.value.alfakitLazy) : void 0), N = p(() => M.value ? k.value.starterKit ? M.value.title : `${M.value.title} - ${k.value.brandName}` : k.value.brandName), P = p(() => M.value?.view ? j[M.value.view.component] : void 0), F = p(() => c(M.value?.view?.props, O.value)), I = e(), L = { opened: null }, R = () => l(M.value, L, (e, t) => I.trigger(e, t));
16
+ return b(() => {
17
+ R(), T(M, R);
18
18
  }), a({
19
19
  get token() {
20
- return j.value?.token ?? "";
20
+ return M.value?.token ?? "";
21
21
  },
22
22
  component: "page"
23
- }), (e, t) => j.value ? (b(), h(d, { key: 0 }, [g(C(u), { title: M.value }, null, 8, ["title"]), j.value.view && !N.value ? (b(), h("div", E, S(C(k)("page_not_registered", { component: j.value.view.component }, `Page component ${j.value.view.component} is not registered in createAlfakit({ pages }).`)), 1)) : (b(), p(o, {
24
- key: 1,
25
- page: j.value
23
+ }), (e, t) => M.value ? (x(), g(f, { key: 0 }, [_(w(d), { title: N.value }, null, 8, ["title"]), M.value.view && !P.value ? (x(), g("div", D, C(w(A)("page_not_registered", { component: M.value.view.component }, `Page component ${M.value.view.component} is not registered in createAlfakit({ pages }).`)), 1)) : M.value.view && P.value ? (x(), m(S(P.value), y({ key: 1 }, F.value, { page: M.value }), null, 16, ["page"])) : (x(), m(o, {
24
+ key: 2,
25
+ page: M.value
26
26
  }, {
27
- default: T(() => [j.value.view && N.value ? (b(), p(x(N.value), v({ key: 0 }, j.value.view.props, { page: j.value }), null, 16, ["page"])) : (b(), p(s, {
28
- key: 1,
29
- page: j.value
30
- }, null, 8, ["page"]))]),
27
+ default: E(() => [_(s, { page: M.value }, null, 8, ["page"])]),
31
28
  _: 1
32
- }, 8, ["page"]))], 64)) : m("", !0);
29
+ }, 8, ["page"]))], 64)) : h("", !0);
33
30
  }
34
31
  });
35
32
  //#endregion
36
- export { D as default };
33
+ export { O as default };
37
34
 
38
35
  //# sourceMappingURL=AlfakitPage.vue_vue_type_script_setup_true_lang.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AlfakitPage.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_Fragment","_createVNode","_unref","_toDisplayString","_createBlock","PageShell","_withCtx","_resolveDynamicComponent","_mergeProps","PageContent","_createCommentVNode","PageShell_default","PageContent_default","_hoisted_1","AlfakitPage_vue_vue_type_script_setup_true_lang_default","props","useAlfakitProps","panel","usePanel","t","useT","useAlfakit","page","computed","resolveLazyComponents","title","custom","pages","runner","useActionRunner","opener","openDefault","openDefaultAction","action","context","onMounted","watch","providePageActionContext","openBlock","createElementBlock","Fragment","createVNode","unref","Head","toDisplayString","createBlock","withCtx","resolveDynamicComponent","mergeProps","createCommentVNode"],"sources":["../../src/pages/AlfakitPage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { openDefaultAction, resolveLazyComponents, type DefaultActionOpener } from '@alfakit/core'\nimport { Head } from '@inertiajs/vue3'\nimport { computed, onMounted, watch } from 'vue'\nimport { providePageActionContext } from '../components/actions/action-context'\nimport { useActionRunner, useAlfakit, useAlfakitProps, usePanel, useT } from '../context'\nimport PageContent from './PageContent.vue'\nimport PageShell from './PageShell.vue'\n\n/**\n * `Alfakit/Page`: renders any schema-driven page. Custom pages (`Page::$component`) are\n * resolved from the `pages` map passed to `createAlfakit()`.\n */\nconst props = useAlfakitProps()\nconst panel = usePanel()\nconst t = useT()\nconst { pages } = useAlfakit()\n// Lazy widgets and relation managers arrive in a deferred prop after the first response.\nconst page = computed(() =>\n props.value.page ? resolveLazyComponents(props.value.page, props.value.alfakitLazy) : undefined,\n)\n// Starter kit mode: the host's `title` callback adds the application name.\nconst title = computed(() =>\n page.value\n ? panel.value.starterKit\n ? page.value.title\n : `${page.value.title} - ${panel.value.brandName}`\n : panel.value.brandName,\n)\nconst custom = computed(() => (page.value?.view ? pages[page.value.view.component] : undefined))\n\n// The page's default action (`$defaultAction`, `?tableAction=`) opens once the page has\n// hydrated, and once per page: re-renders after the action ran don't open it again.\nconst runner = useActionRunner()\nconst opener: DefaultActionOpener = { opened: null }\nconst openDefault = () =>\n openDefaultAction(page.value, opener, (action, context) => runner.trigger(action, context))\n\nonMounted(() => {\n openDefault()\n watch(page, openDefault)\n})\n\nprovidePageActionContext({\n get token() {\n return page.value?.token ?? ''\n },\n component: 'page',\n})\n</script>\n\n<template>\n <template v-if=\"page\">\n <Head :title=\"title\" />\n <div v-if=\"page.view && !custom\" class=\"text-destructive p-6\">\n {{\n t(\n 'page_not_registered',\n { component: page.view.component },\n `Page component ${page.view.component} is not registered in createAlfakit({ pages }).`,\n )\n }}\n </div>\n <PageShell v-else :page=\"page\">\n <component :is=\"custom\" v-if=\"page.view && custom\" v-bind=\"page.view.props\" :page=\"page\" />\n <PageContent v-else :page=\"page\" />\n </PageShell>\n </template>\n</template>\n"],"mappings":";;;;;;;;;;;;;;EAaA,IAAMiB,IAAQC,EAAgB,GACxBC,IAAQC,EAAS,GACjBC,IAAIC,EAAK,GACT,EAAE,aAAUC,EAAW,GAEvBC,IAAOC,QACXR,EAAM,MAAM,OAAOS,EAAsBT,EAAM,MAAM,MAAMA,EAAM,MAAM,WAAW,IAAI,KAAA,CACxF,GAEMU,IAAQF,QACZD,EAAK,QACDL,EAAM,MAAM,aACVK,EAAK,MAAM,QACX,GAAGA,EAAK,MAAM,MAAM,KAAKL,EAAM,MAAM,cACvCA,EAAM,MAAM,SAClB,GACMS,IAASH,QAAgBD,EAAK,OAAO,OAAOK,EAAML,EAAK,MAAM,KAAK,aAAa,KAAA,CAAU,GAIzFM,IAASC,EAAgB,GACzBC,IAA8B,EAAE,QAAQ,KAAK,GAC7CC,UACJC,EAAkBV,EAAK,OAAOQ,IAAS,GAAQ,MAAYF,EAAO,QAAQK,GAAQC,CAAO,CAAC;SAE5FC,QAAgB;GAEd,AADAJ,EAAY,GACZK,EAAMd,GAAMS,CAAW;EACzB,CAAC,GAEDM,EAAyB;GACvB,IAAI,QAAQ;IACV,OAAOf,EAAK,OAAO,SAAS;GAC9B;GACA,WAAW;EACb,CAAC,aAIiBA,EAAA,SAAhBxB,EAAA,GAAAC,EAeWC,GAAA,EAAA,KAAA,EAAA,GAAA,CAdTC,EAAuBC,EAAAyC,CAAA,GAAA,EAAhB,OAAOlB,EAAA,MAAK,GAAA,MAAA,GAAA,CAAA,OAAA,CAAA,GACRH,EAAA,MAAK,QAAI,CAAKI,EAAA,SAAzB5B,EAAA,GAAAC,EAQM,OARNc,GAQMV,EANFD,EAAAiB,CAAA,CAAC,CAAA,uBAA0D,EAAA,WAAAG,EAAA,MAAK,KAAK,UAAS,GAAgC,kBAAAA,EAAA,MAAK,KAAK,UAAS,gDAAA,CAAA,GAAA,CAAA,MAOrIxB,EAAA,GAAAM,EAGYC,GAAA;;GAHO,MAAMiB,EAAA;;GACvB,SAAAhB,QAA2F,CAA7DgB,EAAA,MAAK,QAAQI,EAAA,SAA3C5B,EAAA,GAAAM,EAA2FG,EAA3EmB,EAAA,KAAM,GAAtBlB,EAA2F,EAAA,KAAA,EAAA,GAAhCc,EAAA,MAAK,KAAK,OAAK,EAAG,MAAMA,EAAA,MAAI,CAAA,GAAA,MAAA,IAAA,CAAA,MAAA,CAAA,MACvFxB,EAAA,GAAAM,EAAmCK,GAAA;;IAAd,MAAMa,EAAA"}
1
+ {"version":3,"file":"AlfakitPage.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_Fragment","_createVNode","_unref","_toDisplayString","_createBlock","_resolveDynamicComponent","_mergeProps","PageShell","_withCtx","PageContent","_createCommentVNode","PageShell_default","PageContent_default","_hoisted_1","AlfakitPage_vue_vue_type_script_setup_true_lang_default","props","useAlfakitProps","panel","usePanel","t","useT","useAlfakit","page","computed","resolveLazyComponents","title","custom","pages","customProps","customPageProps","runner","useActionRunner","opener","openDefault","openDefaultAction","action","context","onMounted","watch","providePageActionContext","openBlock","createElementBlock","Fragment","createVNode","unref","Head","toDisplayString","createBlock","resolveDynamicComponent","mergeProps","withCtx","createCommentVNode"],"sources":["../../src/pages/AlfakitPage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n customPageProps,\n openDefaultAction,\n resolveLazyComponents,\n type DefaultActionOpener,\n} from '@alfakit/core'\nimport { Head } from '@inertiajs/vue3'\nimport { computed, onMounted, watch } from 'vue'\nimport { providePageActionContext } from '../components/actions/action-context'\nimport { useActionRunner, useAlfakit, useAlfakitProps, usePanel, useT } from '../context'\nimport PageContent from './PageContent.vue'\nimport PageShell from './PageShell.vue'\n\n/**\n * `Alfakit/Page`: renders any schema-driven page. Custom pages (`Page::$component`) are\n * resolved from the `pages` map passed to `createAlfakit()`.\n */\nconst props = useAlfakitProps()\nconst panel = usePanel()\nconst t = useT()\nconst { pages } = useAlfakit()\n// Lazy widgets and relation managers arrive in a deferred prop after the first response.\nconst page = computed(() =>\n props.value.page ? resolveLazyComponents(props.value.page, props.value.alfakitLazy) : undefined,\n)\n// Starter kit mode: the host's `title` callback adds the application name.\nconst title = computed(() =>\n page.value\n ? panel.value.starterKit\n ? page.value.title\n : `${page.value.title} - ${panel.value.brandName}`\n : panel.value.brandName,\n)\nconst custom = computed(() => (page.value?.view ? pages[page.value.view.component] : undefined))\n// A custom component brings its own `PageShell` (as in panel mode, where it is the Inertia\n// page itself) and takes the live props, so `reloadProps()` reaches it.\nconst customProps = computed(() =>\n customPageProps(page.value?.view?.props, props.value as Record<string, unknown>),\n)\n\n// The page's default action (`$defaultAction`, `?tableAction=`) opens once the page has\n// hydrated, and once per page: re-renders after the action ran don't open it again.\nconst runner = useActionRunner()\nconst opener: DefaultActionOpener = { opened: null }\nconst openDefault = () =>\n openDefaultAction(page.value, opener, (action, context) => runner.trigger(action, context))\n\nonMounted(() => {\n openDefault()\n watch(page, openDefault)\n})\n\nprovidePageActionContext({\n get token() {\n return page.value?.token ?? ''\n },\n component: 'page',\n})\n</script>\n\n<template>\n <template v-if=\"page\">\n <Head :title=\"title\" />\n <div v-if=\"page.view && !custom\" class=\"text-destructive p-6\">\n {{\n t(\n 'page_not_registered',\n { component: page.view.component },\n `Page component ${page.view.component} is not registered in createAlfakit({ pages }).`,\n )\n }}\n </div>\n <component :is=\"custom\" v-else-if=\"page.view && custom\" v-bind=\"customProps\" :page=\"page\" />\n <PageShell v-else :page=\"page\">\n <PageContent :page=\"page\" />\n </PageShell>\n </template>\n</template>\n"],"mappings":";;;;;;;;;;;;;;EAkBA,IAAMiB,IAAQC,EAAgB,GACxBC,IAAQC,EAAS,GACjBC,IAAIC,EAAK,GACT,EAAE,aAAUC,EAAW,GAEvBC,IAAOC,QACXR,EAAM,MAAM,OAAOS,EAAsBT,EAAM,MAAM,MAAMA,EAAM,MAAM,WAAW,IAAI,KAAA,CACxF,GAEMU,IAAQF,QACZD,EAAK,QACDL,EAAM,MAAM,aACVK,EAAK,MAAM,QACX,GAAGA,EAAK,MAAM,MAAM,KAAKL,EAAM,MAAM,cACvCA,EAAM,MAAM,SAClB,GACMS,IAASH,QAAgBD,EAAK,OAAO,OAAOK,EAAML,EAAK,MAAM,KAAK,aAAa,KAAA,CAAU,GAGzFM,IAAcL,QAClBM,EAAgBP,EAAK,OAAO,MAAM,OAAOP,EAAM,KAAgC,CACjF,GAIMe,IAASC,EAAgB,GACzBC,IAA8B,EAAE,QAAQ,KAAK,GAC7CC,UACJC,EAAkBZ,EAAK,OAAOU,IAAS,GAAQ,MAAYF,EAAO,QAAQK,GAAQC,CAAO,CAAC;SAE5FC,QAAgB;GAEd,AADAJ,EAAY,GACZK,EAAMhB,GAAMW,CAAW;EACzB,CAAC,GAEDM,EAAyB;GACvB,IAAI,QAAQ;IACV,OAAOjB,EAAK,OAAO,SAAS;GAC9B;GACA,WAAW;EACb,CAAC,aAIiBA,EAAA,SAAhBxB,EAAA,GAAAC,EAeWC,GAAA,EAAA,KAAA,EAAA,GAAA,CAdTC,EAAuBC,EAAA2C,CAAA,GAAA,EAAhB,OAAOpB,EAAA,MAAK,GAAA,MAAA,GAAA,CAAA,OAAA,CAAA,GACRH,EAAA,MAAK,QAAI,CAAKI,EAAA,SAAzB5B,EAAA,GAAAC,EAQM,OARNc,GAQMV,EANFD,EAAAiB,CAAA,CAAC,CAAA,uBAA0D,EAAA,WAAAG,EAAA,MAAK,KAAK,UAAS,GAAgC,kBAAAA,EAAA,MAAK,KAAK,UAAS,gDAAA,CAAA,GAAA,CAAA,KAOlGA,EAAA,MAAK,QAAQI,EAAA,SAAhD5B,EAAA,GAAAM,EAA4FC,EAA5EqB,EAAA,KAAM,GAAtBpB,EAA4F,EAAA,KAAA,EAAA,GAA5BsB,EAAA,OAAW,EAAG,MAAMN,EAAA,MAAI,CAAA,GAAA,MAAA,IAAA,CAAA,MAAA,CAAA,MACxFxB,EAAA,GAAAM,EAEYG,GAAA;;GAFO,MAAMe,EAAA;;GACvB,SAAAd,QAA4B,CAA5BP,EAA4BQ,GAAA,EAAd,MAAMa,EAAA,MAAI,GAAA,MAAA,GAAA,CAAA,MAAA,CAAA,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"AlfakitComponent.js","names":["_sfc_main","AlfakitComponent_vue_vue_type_script_setup_true_lang_default","AlfakitComponent_default"],"sources":["../../src/standalone/AlfakitComponent.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n StandaloneComponentState,\n findStandalonePropName,\n registerStandaloneProp,\n standalonePanelSchema,\n type ContentBlock,\n type StandaloneComponentSchema,\n} from '@alfakit/core'\nimport { usePage } from '@inertiajs/vue3'\nimport { ConfigProvider } from 'reka-ui'\nimport { computed, onMounted, onScopeDispose, provide, ref, watch, type HTMLAttributes } from 'vue'\nimport { providePageActionContext } from '../components/actions/action-context'\nimport ActionList from '../components/actions/ActionList.vue'\nimport ActionModals from '../components/actions/ActionModals.vue'\nimport TooltipProvider from '../components/ui/TooltipProvider.vue'\nimport {\n ALFAKIT_KEY,\n provideStandalone,\n useOptionalAlfakit,\n type AlfakitContextValue,\n type AnyComponent,\n} from '../context'\nimport { cn } from '../lib/utils'\nimport ContentBlockRenderer from '../pages/ContentBlockRenderer.vue'\nimport AlfakitToaster from './AlfakitToaster.vue'\nimport {\n claimToaster,\n createStandaloneContext,\n createStandaloneRegistry,\n ensureStandaloneRuntime,\n hasToaster,\n} from './runtime'\n\n/**\n * Renders an Alfakit component outside a panel: a form, table, infolist, widgets or any mix\n * (`AlfaSix\\Alfakit\\Standalone\\*`) in any Inertia page of the application. Needs no\n * `createAlfakit()` and no panel layout: it provides its own translator, registry, action\n * runner and modals, and inherits the application's shadcn tokens.\n *\n * ```vue\n * <AlfakitComponent :component=\"orders\" class=\"max-w-4xl\" />\n * ```\n *\n * Slots: `header` (above the content blocks), `footer` (below), and the default slot to\n * render the blocks yourself: `<template #default=\"{ blocks }\">…<ContentBlockRenderer :block=\"…\" />`.\n */\nconst props = defineProps<{\n /** The payload: `ContactForm::make()` passed as an Inertia prop. */\n component: StandaloneComponentSchema\n /** Renderer overrides for this instance (`{ TextInput: MyInput }`), on top of `configureAlfakit()`. */\n components?: Record<string, AnyComponent>\n class?: HTMLAttributes['class']\n}>()\n\ndefineSlots<{\n header?: () => unknown\n footer?: () => unknown\n default?: (props: { blocks: ContentBlock[]; page: StandaloneComponentSchema }) => unknown\n}>()\n\nconst parent = useOptionalAlfakit()\nconst inertiaPage = usePage()\n\n// Lazy and polled schemas of this component, merged into the page it renders.\nconst version = ref(0)\nconst state = new StandaloneComponentState(props.component, () => version.value++)\nconst poll = (target: string, interval: string | number | null | undefined) =>\n state.poll(target, interval)\nconst refresh = (targets: string[]) => state.refresh(targets)\n\nconst context: AlfakitContextValue = parent\n ? {\n ...parent,\n registry: createStandaloneRegistry(props.components, parent.registry),\n poll,\n refresh,\n }\n : {\n ...createStandaloneContext(\n { action: props.component.endpoints.action, modal: props.component.endpoints.modal },\n props.components,\n poll,\n ),\n refresh,\n }\n\nprovide(ALFAKIT_KEY, context)\n\nconst panel = computed(() => standalonePanelSchema(props.component))\nconst page = computed(() => {\n void version.value\n state.setComponent(props.component)\n\n return state.page\n})\nconst direction = computed(() => props.component.localization?.direction ?? 'ltr')\nconst actionContext = computed(() => ({ token: props.component.token, component: 'page' }))\n\nprovideStandalone({ panel, page })\nprovidePageActionContext(actionContext.value)\n\n// Endpoints and strings follow the latest payload (they change per locale or path).\nwatch(\n () => props.component,\n (component) => {\n context.actions.setEndpoints({\n action: component.endpoints.action,\n modal: component.endpoints.modal,\n })\n\n // Inside `createAlfakit()` the panel feeds the shared translator; on a page without the\n // `alfakit` prop (the rest of the app) the component's own translations apply.\n if (!parent || !(inertiaPage.props as Record<string, unknown>).alfakit) {\n context.translator.setTranslations(component.translations ?? {})\n context.translator.setLocale(component.localization?.tag ?? 'en')\n }\n },\n { immediate: true, flush: 'sync' },\n)\n\n// Toasts: use the layout's <AlfakitToaster /> when there is one, else the first component\n// on the page renders one (checked after every component mounted).\nconst ownsToaster = ref(false)\n\nonMounted(() => {\n ensureStandaloneRuntime()\n\n // Partial reloads (sorting, paging, inline edits) request this component's own prop.\n watch(\n () => findStandalonePropName(inertiaPage.props as Record<string, unknown>, props.component),\n (name, _old, onCleanup) => onCleanup(registerStandaloneProp(name ?? null)),\n { immediate: true },\n )\n\n // The watcher runs before the new payload renders: hand it over, or the response would\n // count as stale and lazy widgets (a calendar after its action) keep their old schema.\n watch(\n () => props.component.token,\n () => void state.loadLazy(props.component),\n { immediate: true },\n )\n\n if (parent) return\n\n let release: (() => void) | null = null\n let cancelled = false\n\n queueMicrotask(() => {\n if (cancelled || hasToaster()) return\n\n release = claimToaster()\n ownsToaster.value = true\n })\n\n onScopeDispose(() => {\n cancelled = true\n release?.()\n })\n})\n</script>\n\n<template>\n <component\n :is=\"parent ? 'div' : ConfigProvider\"\n :dir=\"parent ? undefined : direction\"\n :class=\"parent ? 'contents' : undefined\"\n >\n <TooltipProvider :delay-duration=\"0\">\n <div\n data-slot=\"standalone\"\n :data-alfakit-component=\"props.component.class\"\n :dir=\"direction\"\n :class=\"cn('flex flex-col gap-6', props.class)\"\n >\n <header\n v-if=\"page.heading || page.headerActions?.length\"\n data-slot=\"page-header\"\n class=\"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\"\n >\n <div class=\"min-w-0\">\n <h2 v-if=\"page.heading\" class=\"text-xl font-semibold tracking-tight\">\n {{ page.heading }}\n </h2>\n <p v-if=\"page.subheading\" class=\"text-muted-foreground mt-1 text-sm\">\n {{ page.subheading }}\n </p>\n </div>\n <ActionList\n v-if=\"page.headerActions && page.headerActions.length > 0\"\n :actions=\"page.headerActions\"\n :context=\"actionContext\"\n align=\"end\"\n class=\"max-w-full shrink-0\"\n />\n </header>\n <slot name=\"header\" />\n <slot :blocks=\"page.content\" :page=\"props.component\">\n <ContentBlockRenderer v-for=\"block in page.content\" :key=\"block.key\" :block=\"block\" />\n </slot>\n <slot name=\"footer\" />\n </div>\n <ActionModals />\n <AlfakitToaster v-if=\"ownsToaster\" claimed />\n </TooltipProvider>\n </component>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"AlfakitComponent.js","names":["_sfc_main","AlfakitComponent_vue_vue_type_script_setup_true_lang_default","AlfakitComponent_default"],"sources":["../../src/standalone/AlfakitComponent.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n StandaloneComponentState,\n findStandalonePropName,\n registerStandaloneProp,\n standalonePanelSchema,\n type ContentBlock,\n type StandaloneComponentSchema,\n} from '@alfakit/core'\nimport { usePage } from '@inertiajs/vue3'\nimport { ConfigProvider } from 'reka-ui'\nimport { computed, onMounted, onScopeDispose, provide, ref, watch, type HTMLAttributes } from 'vue'\nimport { providePageActionContext } from '../components/actions/action-context'\nimport ActionList from '../components/actions/ActionList.vue'\nimport ActionModals from '../components/actions/ActionModals.vue'\nimport TooltipProvider from '../components/ui/TooltipProvider.vue'\nimport {\n ALFAKIT_KEY,\n provideStandalone,\n useOptionalAlfakit,\n type AlfakitContextValue,\n type AnyComponent,\n} from '../context'\nimport { cn } from '../lib/utils'\nimport ContentBlockRenderer from '../pages/ContentBlockRenderer.vue'\nimport AlfakitToaster from './AlfakitToaster.vue'\nimport {\n claimToaster,\n createStandaloneContext,\n createStandaloneRegistry,\n ensureStandaloneRuntime,\n hasToaster,\n} from './runtime'\n\n/**\n * Renders an Alfakit component outside a panel: a form, table, infolist, widgets or any mix\n * (`AlfaSix\\Alfakit\\Standalone\\*`) in any Inertia page of the application. Needs no\n * `createAlfakit()` and no panel layout: it provides its own translator, registry, action\n * runner and modals, and inherits the application's shadcn tokens.\n *\n * ```vue\n * <AlfakitComponent :component=\"orders\" class=\"max-w-4xl\" />\n * ```\n *\n * Slots: `header` (above the content blocks), `footer` (below), and the default slot to\n * render the blocks yourself: `<template #default=\"{ blocks }\">…<ContentBlockRenderer :block=\"…\" />`.\n */\nconst props = defineProps<{\n /** The payload: `ContactForm::make()` passed as an Inertia prop. */\n component: StandaloneComponentSchema\n /** Renderer overrides for this instance (`{ TextInput: MyInput }`), on top of `configureAlfakit()`. */\n components?: Record<string, AnyComponent>\n class?: HTMLAttributes['class']\n}>()\n\ndefineSlots<{\n header?: () => unknown\n footer?: () => unknown\n default?: (props: { blocks: ContentBlock[]; page: StandaloneComponentSchema }) => unknown\n}>()\n\nconst parent = useOptionalAlfakit()\nconst inertiaPage = usePage()\n\n// Lazy and polled schemas of this component, merged into the page it renders.\nconst version = ref(0)\nconst state = new StandaloneComponentState(props.component, () => version.value++)\nconst poll = (target: string, interval: string | number | null | undefined) =>\n state.poll(target, interval)\nconst refresh = (targets: string[]) => state.refresh(targets)\n\n// Inside a panel page: the panel's registry and translator, but this component's own action\n// runner, so its actions post to its own endpoints with its own token (not the panel's: 403).\nconst context: AlfakitContextValue = parent\n ? {\n ...parent,\n actions: createStandaloneContext(\n { action: props.component.endpoints.action, modal: props.component.endpoints.modal },\n props.components,\n poll,\n ).actions,\n registry: createStandaloneRegistry(props.components, parent.registry),\n poll,\n refresh,\n }\n : {\n ...createStandaloneContext(\n { action: props.component.endpoints.action, modal: props.component.endpoints.modal },\n props.components,\n poll,\n ),\n refresh,\n }\n\nprovide(ALFAKIT_KEY, context)\n\nconst panel = computed(() => standalonePanelSchema(props.component))\nconst page = computed(() => {\n void version.value\n state.setComponent(props.component)\n\n return state.page\n})\nconst direction = computed(() => props.component.localization?.direction ?? 'ltr')\nconst actionContext = computed(() => ({ token: props.component.token, component: 'page' }))\n\nprovideStandalone({ panel, page })\nprovidePageActionContext(actionContext.value)\n\n// Endpoints and strings follow the latest payload (they change per locale or path).\nwatch(\n () => props.component,\n (component) => {\n context.actions.setEndpoints({\n action: component.endpoints.action,\n modal: component.endpoints.modal,\n })\n\n // Inside `createAlfakit()` the panel feeds the shared translator; on a page without the\n // `alfakit` prop (the rest of the app) the component's own translations apply.\n if (!parent || !(inertiaPage.props as Record<string, unknown>).alfakit) {\n context.translator.setTranslations(component.translations ?? {})\n context.translator.setLocale(component.localization?.tag ?? 'en')\n }\n },\n { immediate: true, flush: 'sync' },\n)\n\n// Toasts: use the layout's <AlfakitToaster /> when there is one, else the first component\n// on the page renders one (checked after every component mounted).\nconst ownsToaster = ref(false)\n\n// Partial reloads (sorting, paging, inline edits) request this component's own prop.\n// Registered in setup (browser only), before the children's `onMounted`: a `deferLoading()`\n// table's first reload must already ask for this prop, not the panel `page` prop.\nif (typeof window !== 'undefined') {\n watch(\n () => findStandalonePropName(inertiaPage.props as Record<string, unknown>, props.component),\n (name, _old, onCleanup) => onCleanup(registerStandaloneProp(name ?? null)),\n { immediate: true },\n )\n}\n\nonMounted(() => {\n ensureStandaloneRuntime()\n\n // The watcher runs before the new payload renders: hand it over, or the response would\n // count as stale and lazy widgets (a calendar after its action) keep their old schema.\n watch(\n () => props.component.token,\n () => void state.loadLazy(props.component),\n { immediate: true },\n )\n\n if (parent) return\n\n let release: (() => void) | null = null\n let cancelled = false\n\n queueMicrotask(() => {\n if (cancelled || hasToaster()) return\n\n release = claimToaster()\n ownsToaster.value = true\n })\n\n onScopeDispose(() => {\n cancelled = true\n release?.()\n })\n})\n</script>\n\n<template>\n <component\n :is=\"parent ? 'div' : ConfigProvider\"\n :dir=\"parent ? undefined : direction\"\n :class=\"parent ? 'contents' : undefined\"\n >\n <TooltipProvider :delay-duration=\"0\">\n <div\n data-slot=\"standalone\"\n :data-alfakit-component=\"props.component.class\"\n :dir=\"direction\"\n :class=\"cn('flex flex-col gap-6', props.class)\"\n >\n <header\n v-if=\"page.heading || page.headerActions?.length\"\n data-slot=\"page-header\"\n class=\"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\"\n >\n <div class=\"min-w-0\">\n <h2 v-if=\"page.heading\" class=\"text-xl font-semibold tracking-tight\">\n {{ page.heading }}\n </h2>\n <p v-if=\"page.subheading\" class=\"text-muted-foreground mt-1 text-sm\">\n {{ page.subheading }}\n </p>\n </div>\n <ActionList\n v-if=\"page.headerActions && page.headerActions.length > 0\"\n :actions=\"page.headerActions\"\n :context=\"actionContext\"\n align=\"end\"\n class=\"max-w-full shrink-0\"\n />\n </header>\n <slot name=\"header\" />\n <slot :blocks=\"page.content\" :page=\"props.component\">\n <ContentBlockRenderer v-for=\"block in page.content\" :key=\"block.key\" :block=\"block\" />\n </slot>\n <slot name=\"footer\" />\n </div>\n <ActionModals />\n <AlfakitToaster v-if=\"ownsToaster\" claimed :dir=\"direction\" />\n </TooltipProvider>\n </component>\n</template>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"AlfakitComponent.vue.d.ts","sourceRoot":"","sources":["../../src/standalone/AlfakitComponent.vue"],"names":[],"mappings":"AAiNA,OAAO,EAKL,KAAK,YAAY,EACjB,KAAK,yBAAyB,EAC/B,MAAM,eAAe,CAAA;AAGtB,OAAO,EAA4D,KAAK,cAAc,EAAE,MAAM,KAAK,CAAA;AAKnG,OAAO,EAKL,KAAK,YAAY,EAClB,MAAM,YAAY,CAAA;AAYnB;;;;;;;;;;;;GAYG;AACH,KAAK,WAAW,GAAG;IACjB,oEAAoE;IACpE,SAAS,EAAE,yBAAyB,CAAA;IACpC,uGAAuG;IACvG,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACzC,KAAK,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAA;CAChC,CAAC;AAGF,KAAK,WAAW,GAAG;IACjB,MAAM,CAAC,EAAE,MAAM,OAAO,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,OAAO,CAAA;IACtB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,YAAY,EAAE,CAAC;QAAC,IAAI,EAAE,yBAAyB,CAAA;KAAE,KAAK,OAAO,CAAA;CAC1F,CAAC;AAkQF,QAAA,MAAM,eAAe,kSAMnB,CAAC;wBACkB,eAAe,CAAC,OAAO,eAAe,EAAE,WAAW,CAAC;AAAzE,wBAA0E;AAQ1E,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
1
+ {"version":3,"file":"AlfakitComponent.vue.d.ts","sourceRoot":"","sources":["../../src/standalone/AlfakitComponent.vue"],"names":[],"mappings":"AA4NA,OAAO,EAKL,KAAK,YAAY,EACjB,KAAK,yBAAyB,EAC/B,MAAM,eAAe,CAAA;AAGtB,OAAO,EAA4D,KAAK,cAAc,EAAE,MAAM,KAAK,CAAA;AAKnG,OAAO,EAKL,KAAK,YAAY,EAClB,MAAM,YAAY,CAAA;AAYnB;;;;;;;;;;;;GAYG;AACH,KAAK,WAAW,GAAG;IACjB,oEAAoE;IACpE,SAAS,EAAE,yBAAyB,CAAA;IACpC,uGAAuG;IACvG,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACzC,KAAK,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAA;CAChC,CAAC;AAGF,KAAK,WAAW,GAAG;IACjB,MAAM,CAAC,EAAE,MAAM,OAAO,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,OAAO,CAAA;IACtB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,YAAY,EAAE,CAAC;QAAC,IAAI,EAAE,yBAAyB,CAAA;KAAE,KAAK,OAAO,CAAA;CAC1F,CAAC;AA+QF,QAAA,MAAM,eAAe,kSAMnB,CAAC;wBACkB,eAAe,CAAC,OAAO,eAAe,EAAE,WAAW,CAAC;AAAzE,wBAA0E;AAQ1E,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}