@alfakit/vue 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/components/actions/ActionButton.js.map +1 -1
  3. package/dist/components/actions/ActionButton.vue.d.ts.map +1 -1
  4. package/dist/components/actions/ActionButton.vue_vue_type_script_setup_true_lang.js +160 -159
  5. package/dist/components/actions/ActionButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  6. package/dist/components/actions/ActionModal.js.map +1 -1
  7. package/dist/components/actions/ActionModal.vue.d.ts.map +1 -1
  8. package/dist/components/actions/ActionModal.vue_vue_type_script_setup_true_lang.js +214 -214
  9. package/dist/components/actions/ActionModal.vue_vue_type_script_setup_true_lang.js.map +1 -1
  10. package/dist/components/fields/ColorPickerField.js.map +1 -1
  11. package/dist/components/fields/ColorPickerField.vue.d.ts.map +1 -1
  12. package/dist/components/fields/ColorPickerField.vue_vue_type_script_setup_true_lang.js +1 -0
  13. package/dist/components/fields/ColorPickerField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  14. package/dist/components/fields/ComboboxSelect.js.map +1 -1
  15. package/dist/components/fields/ComboboxSelect.vue.d.ts.map +1 -1
  16. package/dist/components/fields/ComboboxSelect.vue_vue_type_script_setup_true_lang.js +1 -1
  17. package/dist/components/fields/ComboboxSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  18. package/dist/components/fields/FileUploadField.js.map +1 -1
  19. package/dist/components/fields/FileUploadField.vue.d.ts.map +1 -1
  20. package/dist/components/fields/FileUploadField.vue_vue_type_script_setup_true_lang.js +183 -183
  21. package/dist/components/fields/FileUploadField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  22. package/dist/components/fields/OneTimeCodeInputField.js.map +1 -1
  23. package/dist/components/fields/OneTimeCodeInputField.vue_vue_type_script_setup_true_lang.js +1 -2
  24. package/dist/components/fields/OneTimeCodeInputField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  25. package/dist/components/fields/SelectField.js.map +1 -1
  26. package/dist/components/fields/SelectField.vue.d.ts.map +1 -1
  27. package/dist/components/fields/SelectField.vue_vue_type_script_setup_true_lang.js +2 -2
  28. package/dist/components/fields/SelectField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  29. package/dist/components/fields/TableColumnHeaders.js.map +1 -1
  30. package/dist/components/fields/TableColumnHeaders.vue.d.ts.map +1 -1
  31. package/dist/components/fields/TableColumnHeaders.vue_vue_type_script_setup_true_lang.js +6 -3
  32. package/dist/components/fields/TableColumnHeaders.vue_vue_type_script_setup_true_lang.js.map +1 -1
  33. package/dist/components/file-manager/FileManagerView.js.map +1 -1
  34. package/dist/components/file-manager/FileManagerView.vue_vue_type_script_setup_true_lang.js +1 -1
  35. package/dist/components/file-manager/FileManagerView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  36. package/dist/components/form/FormBlock.js.map +1 -1
  37. package/dist/components/form/FormBlock.vue.d.ts.map +1 -1
  38. package/dist/components/form/FormBlock.vue_vue_type_script_setup_true_lang.js +81 -77
  39. package/dist/components/form/FormBlock.vue_vue_type_script_setup_true_lang.js.map +1 -1
  40. package/dist/components/form/form-context.js +25 -25
  41. package/dist/components/form/form-context.js.map +1 -1
  42. package/dist/components/layout/FusedGroupComponent.js.map +1 -1
  43. package/dist/components/layout/FusedGroupComponent.vue.d.ts.map +1 -1
  44. package/dist/components/layout/FusedGroupComponent.vue_vue_type_script_setup_true_lang.js +1 -0
  45. package/dist/components/layout/FusedGroupComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  46. package/dist/components/layout/TabsComponent.js.map +1 -1
  47. package/dist/components/layout/TabsComponent.vue.d.ts.map +1 -1
  48. package/dist/components/layout/TabsComponent.vue_vue_type_script_setup_true_lang.js +76 -55
  49. package/dist/components/layout/TabsComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  50. package/dist/components/notifications/NotificationsMenu.js.map +1 -1
  51. package/dist/components/notifications/NotificationsMenu.vue.d.ts.map +1 -1
  52. package/dist/components/notifications/NotificationsMenu.vue_vue_type_script_setup_true_lang.js +44 -42
  53. package/dist/components/notifications/NotificationsMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  54. package/dist/components/panel/GlobalSearch.js.map +1 -1
  55. package/dist/components/panel/GlobalSearch.vue.d.ts.map +1 -1
  56. package/dist/components/panel/GlobalSearch.vue_vue_type_script_setup_true_lang.js +1 -0
  57. package/dist/components/panel/GlobalSearch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  58. package/dist/components/panel/ShortcutKeys.js.map +1 -1
  59. package/dist/components/panel/ShortcutKeys.vue.d.ts.map +1 -1
  60. package/dist/components/panel/ShortcutKeys.vue_vue_type_script_setup_true_lang.js +4 -1
  61. package/dist/components/panel/ShortcutKeys.vue_vue_type_script_setup_true_lang.js.map +1 -1
  62. package/dist/components/panel/TenantMenu.js.map +1 -1
  63. package/dist/components/panel/TenantMenu.vue_vue_type_script_setup_true_lang.js +2 -2
  64. package/dist/components/panel/TenantMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  65. package/dist/components/table/GroupHeaderRow.js.map +1 -1
  66. package/dist/components/table/GroupHeaderRow.vue.d.ts.map +1 -1
  67. package/dist/components/table/GroupHeaderRow.vue_vue_type_script_setup_true_lang.js +55 -34
  68. package/dist/components/table/GroupHeaderRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
  69. package/dist/components/table/SelectCell.js.map +1 -1
  70. package/dist/components/table/SelectCell.vue.d.ts.map +1 -1
  71. package/dist/components/table/SelectCell.vue_vue_type_script_setup_true_lang.js +24 -19
  72. package/dist/components/table/SelectCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
  73. package/dist/components/table/TextInputCell.js.map +1 -1
  74. package/dist/components/table/TextInputCell.vue.d.ts.map +1 -1
  75. package/dist/components/table/TextInputCell.vue_vue_type_script_setup_true_lang.js +38 -33
  76. package/dist/components/table/TextInputCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
  77. package/dist/components.css +347 -0
  78. package/dist/eject-manifest.json +2 -2
  79. package/dist/standalone/AlfakitToaster.js.map +1 -1
  80. package/dist/standalone/AlfakitToaster.vue.d.ts.map +1 -1
  81. package/dist/standalone/AlfakitToaster.vue_vue_type_script_setup_true_lang.js +23 -15
  82. package/dist/standalone/AlfakitToaster.vue_vue_type_script_setup_true_lang.js.map +1 -1
  83. package/dist/standalone.css +47 -0
  84. package/dist/starter-kit/widgets/SearchTrigger.js.map +1 -1
  85. package/dist/starter-kit/widgets/SearchTrigger.vue.d.ts.map +1 -1
  86. package/dist/starter-kit/widgets/SearchTrigger.vue_vue_type_script_setup_true_lang.js +1 -0
  87. package/dist/starter-kit/widgets/SearchTrigger.vue_vue_type_script_setup_true_lang.js.map +1 -1
  88. package/dist/starter-kit/widgets/TenantChooser.js.map +1 -1
  89. package/dist/starter-kit/widgets/TenantChooser.vue_vue_type_script_setup_true_lang.js +1 -1
  90. package/dist/starter-kit/widgets/TenantChooser.vue_vue_type_script_setup_true_lang.js.map +1 -1
  91. package/dist/themes.css +2 -334
  92. package/package.json +3 -3
  93. package/src/components/actions/ActionButton.vue +14 -6
  94. package/src/components/actions/ActionModal.vue +3 -1
  95. package/src/components/fields/ColorPickerField.vue +1 -0
  96. package/src/components/fields/ComboboxSelect.vue +1 -1
  97. package/src/components/fields/FileUploadField.vue +14 -11
  98. package/src/components/fields/OneTimeCodeInputField.vue +1 -1
  99. package/src/components/fields/SelectField.vue +4 -2
  100. package/src/components/fields/TableColumnHeaders.vue +6 -1
  101. package/src/components/file-manager/FileManagerView.vue +1 -1
  102. package/src/components/form/FormBlock.vue +24 -0
  103. package/src/components/form/form-context.ts +2 -2
  104. package/src/components/layout/FusedGroupComponent.vue +1 -0
  105. package/src/components/layout/TabsComponent.vue +61 -5
  106. package/src/components/notifications/NotificationsMenu.vue +11 -0
  107. package/src/components/panel/GlobalSearch.vue +1 -0
  108. package/src/components/panel/ShortcutKeys.vue +1 -0
  109. package/src/components/panel/TenantMenu.vue +2 -2
  110. package/src/components/table/GroupHeaderRow.vue +27 -0
  111. package/src/components/table/SelectCell.vue +5 -2
  112. package/src/components/table/TextInputCell.vue +11 -5
  113. package/src/standalone/AlfakitToaster.vue +12 -2
  114. package/src/starter-kit/widgets/SearchTrigger.vue +1 -0
  115. package/src/starter-kit/widgets/TenantChooser.vue +1 -1
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "package": "@alfakit/vue",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "adapter": "vue",
5
- "generatedAt": "2026-10-19T06:40:49.122Z",
5
+ "generatedAt": "2026-10-19T11:54:13.615Z",
6
6
  "components": {
7
7
  "TextInput": {
8
8
  "file": "src/components/fields/TextInputField.vue",
@@ -1 +1 @@
1
- {"version":3,"file":"AlfakitToaster.js","names":["_sfc_main","AlfakitToaster_vue_vue_type_script_setup_true_lang_default","AlfakitToaster_default"],"sources":["../../src/standalone/AlfakitToaster.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { resolveToastPosition, type ToastPosition } from '@alfakit/core'\nimport { onMounted, onUnmounted } from 'vue'\nimport Toaster from '../components/ui/Toaster.vue'\nimport { useOptionalAlfakit } from '../context'\nimport { claimToaster, createStandaloneContext, ensureFlashToasts } from './runtime'\n\n/**\n * Shows notifications flashed by standalone components (`Notification::make()->send()`\n * from `submit()` or an action) as toasts. Place it once in your app layout; a page whose\n * layout has none gets one from its first `<AlfakitComponent>`.\n *\n * Flash data comes from the `flash` Inertia event after each visit and from the initial\n * page (already fired before the app mounted), so it works in any layout.\n */\nconst props = withDefaults(\n defineProps<{\n /** Where toasts appear; `start`/`end` follow the reading direction. */\n position?: ToastPosition\n dir?: 'ltr' | 'rtl'\n /**\n * Render vue-sonner's `<Toaster>` too (default). Pass `false` when your layout already\n * mounts one: flashed Alfakit notifications are then shown through it.\n */\n toaster?: boolean\n /** @internal Set by `<AlfakitComponent>` when it takes the toaster role. */\n claimed?: boolean\n }>(),\n { dir: 'ltr', toaster: true, claimed: false },\n)\n\n// Outside <AlfakitComponent> the flash reader needs a registry for custom toast views.\nconst context =\n useOptionalAlfakit() ?? createStandaloneContext({ action: '', modal: '' }, undefined, undefined)\n\nlet release: (() => void) | null = null\n\nonMounted(() => {\n if (!props.claimed) release = claimToaster()\n\n ensureFlashToasts(context.registry)\n})\n\nonUnmounted(() => release?.())\n</script>\n\n<template>\n <Toaster\n v-if=\"props.toaster\"\n :position=\"resolveToastPosition(props.position, props.dir)\"\n :dir=\"props.dir\"\n rich-colors\n close-button\n />\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"AlfakitToaster.js","names":["_sfc_main","AlfakitToaster_vue_vue_type_script_setup_true_lang_default","AlfakitToaster_default"],"sources":["../../src/standalone/AlfakitToaster.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { resolveToastPosition, STARTER_KIT_TOASTER_ID, type ToastPosition } from '@alfakit/core'\nimport { onMounted, onUnmounted } from 'vue'\nimport { setToasterId } from '../components/notifications/flash-toasts'\nimport Toaster from '../components/ui/Toaster.vue'\nimport { useOptionalAlfakit } from '../context'\nimport { claimToaster, createStandaloneContext, ensureFlashToasts } from './runtime'\n\n/**\n * Shows notifications flashed by standalone components (`Notification::make()->send()`\n * from `submit()` or an action) as toasts. Place it once in your app layout; a page whose\n * layout has none gets one from its first `<AlfakitComponent>`.\n *\n * Flash data comes from the `flash` Inertia event after each visit and from the initial\n * page (already fired before the app mounted), so it works in any layout.\n */\nconst props = withDefaults(\n defineProps<{\n /** Where toasts appear; `start`/`end` follow the reading direction. */\n position?: ToastPosition\n dir?: 'ltr' | 'rtl'\n /**\n * Render vue-sonner's `<Toaster>` too (default). Pass `false` when your layout already\n * mounts one: flashed Alfakit notifications are then shown through it.\n */\n toaster?: boolean\n /** @internal Set by `<AlfakitComponent>` when it takes the toaster role. */\n claimed?: boolean\n }>(),\n { dir: 'ltr', toaster: true, claimed: false },\n)\n\n// Outside <AlfakitComponent> the flash reader needs a registry for custom toast views.\nconst context =\n useOptionalAlfakit() ?? createStandaloneContext({ action: '', modal: '' }, undefined, undefined)\n\nlet release: (() => void) | null = null\n\nonMounted(() => {\n if (!props.claimed) release = claimToaster()\n\n // Our own toaster gets an id, so a `<Toaster />` the app's layout already mounts (the\n // starter kits have one) doesn't show every Alfakit toast a second time.\n if (props.toaster) setToasterId(STARTER_KIT_TOASTER_ID)\n\n ensureFlashToasts(context.registry)\n})\n\nonUnmounted(() => {\n release?.()\n\n if (props.toaster) setToasterId(undefined)\n})\n</script>\n\n<template>\n <Toaster\n v-if=\"props.toaster\"\n :id=\"STARTER_KIT_TOASTER_ID\"\n :position=\"resolveToastPosition(props.position, props.dir)\"\n :dir=\"props.dir\"\n rich-colors\n close-button\n />\n</template>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"AlfakitToaster.vue.d.ts","sourceRoot":"","sources":["../../src/standalone/AlfakitToaster.vue"],"names":[],"mappings":"AAyDA,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,eAAe,CAAA;AAMxE;;;;;;;GAOG;AACH,KAAK,WAAW,GAAG;IACf,uEAAuE;IACvE,QAAQ,CAAC,EAAE,aAAa,CAAA;IACxB,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAA;IACnB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAC;;SARM,KAAK,GAAG,KAAK;aAKT,OAAO;aAEP,OAAO;;AAsErB,wBAOG"}
1
+ {"version":3,"file":"AlfakitToaster.vue.d.ts","sourceRoot":"","sources":["../../src/standalone/AlfakitToaster.vue"],"names":[],"mappings":"AAmEA,OAAO,EAAgD,KAAK,aAAa,EAAE,MAAM,eAAe,CAAA;AAOhG;;;;;;;GAOG;AACH,KAAK,WAAW,GAAG;IACf,uEAAuE;IACvE,QAAQ,CAAC,EAAE,aAAa,CAAA;IACxB,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAA;IACnB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAC;;SARM,KAAK,GAAG,KAAK;aAKT,OAAO;aAEP,OAAO;;AAiFrB,wBAOG"}
@@ -1,10 +1,11 @@
1
1
  import { useOptionalAlfakit as e } from "../context.js";
2
- import { claimToaster as t, createStandaloneContext as n, ensureFlashToasts as r } from "./runtime.js";
3
- import i from "../components/ui/Toaster.js";
4
- import { resolveToastPosition as a } from "@alfakit/core";
5
- import { createBlock as o, createCommentVNode as s, defineComponent as c, onMounted as l, onUnmounted as u, openBlock as d, unref as f } from "vue";
2
+ import { setToasterId as t } from "../components/notifications/flash-toasts.js";
3
+ import { claimToaster as n, createStandaloneContext as r, ensureFlashToasts as i } from "./runtime.js";
4
+ import a from "../components/ui/Toaster.js";
5
+ import { STARTER_KIT_TOASTER_ID as o, resolveToastPosition as s } from "@alfakit/core";
6
+ import { createBlock as c, createCommentVNode as l, defineComponent as u, onMounted as d, onUnmounted as f, openBlock as p, unref as m } from "vue";
6
7
  //#region src/standalone/AlfakitToaster.vue?vue&type=script&setup=true&lang.ts
7
- var p = /*@__PURE__*/ c({
8
+ var h = /*@__PURE__*/ u({
8
9
  __name: "AlfakitToaster",
9
10
  props: {
10
11
  position: {},
@@ -18,23 +19,30 @@ var p = /*@__PURE__*/ c({
18
19
  default: !1
19
20
  }
20
21
  },
21
- setup(c) {
22
- let p = c, m = e() ?? n({
22
+ setup(u) {
23
+ let h = u, g = e() ?? r({
23
24
  action: "",
24
25
  modal: ""
25
- }, void 0, void 0), h = null;
26
- return l(() => {
27
- p.claimed || (h = t()), r(m.registry);
28
- }), u(() => h?.()), (e, t) => p.toaster ? (d(), o(i, {
26
+ }, void 0, void 0), _ = null;
27
+ return d(() => {
28
+ h.claimed || (_ = n()), h.toaster && t(o), i(g.registry);
29
+ }), f(() => {
30
+ _?.(), h.toaster && t(void 0);
31
+ }), (e, t) => h.toaster ? (p(), c(a, {
29
32
  key: 0,
30
- position: f(a)(p.position, p.dir),
31
- dir: p.dir,
33
+ id: m(o),
34
+ position: m(s)(h.position, h.dir),
35
+ dir: h.dir,
32
36
  "rich-colors": "",
33
37
  "close-button": ""
34
- }, null, 8, ["position", "dir"])) : s("", !0);
38
+ }, null, 8, [
39
+ "id",
40
+ "position",
41
+ "dir"
42
+ ])) : l("", !0);
35
43
  }
36
44
  });
37
45
  //#endregion
38
- export { p as default };
46
+ export { h as default };
39
47
 
40
48
  //# sourceMappingURL=AlfakitToaster.vue_vue_type_script_setup_true_lang.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AlfakitToaster.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","Toaster","_unref","_createCommentVNode","Toaster_default","AlfakitToaster_vue_vue_type_script_setup_true_lang_default","props","__props","context","useOptionalAlfakit","createStandaloneContext","release","onMounted","claimToaster","ensureFlashToasts","onUnmounted","openBlock","createBlock","unref","resolveToastPosition","createCommentVNode"],"sources":["../../src/standalone/AlfakitToaster.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { resolveToastPosition, type ToastPosition } from '@alfakit/core'\nimport { onMounted, onUnmounted } from 'vue'\nimport Toaster from '../components/ui/Toaster.vue'\nimport { useOptionalAlfakit } from '../context'\nimport { claimToaster, createStandaloneContext, ensureFlashToasts } from './runtime'\n\n/**\n * Shows notifications flashed by standalone components (`Notification::make()->send()`\n * from `submit()` or an action) as toasts. Place it once in your app layout; a page whose\n * layout has none gets one from its first `<AlfakitComponent>`.\n *\n * Flash data comes from the `flash` Inertia event after each visit and from the initial\n * page (already fired before the app mounted), so it works in any layout.\n */\nconst props = withDefaults(\n defineProps<{\n /** Where toasts appear; `start`/`end` follow the reading direction. */\n position?: ToastPosition\n dir?: 'ltr' | 'rtl'\n /**\n * Render vue-sonner's `<Toaster>` too (default). Pass `false` when your layout already\n * mounts one: flashed Alfakit notifications are then shown through it.\n */\n toaster?: boolean\n /** @internal Set by `<AlfakitComponent>` when it takes the toaster role. */\n claimed?: boolean\n }>(),\n { dir: 'ltr', toaster: true, claimed: false },\n)\n\n// Outside <AlfakitComponent> the flash reader needs a registry for custom toast views.\nconst context =\n useOptionalAlfakit() ?? createStandaloneContext({ action: '', modal: '' }, undefined, undefined)\n\nlet release: (() => void) | null = null\n\nonMounted(() => {\n if (!props.claimed) release = claimToaster()\n\n ensureFlashToasts(context.registry)\n})\n\nonUnmounted(() => release?.())\n</script>\n\n<template>\n <Toaster\n v-if=\"props.toaster\"\n :position=\"resolveToastPosition(props.position, props.dir)\"\n :dir=\"props.dir\"\n rich-colors\n close-button\n />\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;EAeA,IAAMO,IAAQC,GAiBRC,IACJC,EAAmB,KAAKC,EAAwB;GAAE,QAAQ;GAAI,OAAO;EAAG,GAAG,KAAA,GAAW,KAAA,CAAS,GAE7FC,IAA+B;SAEnCC,QAAgB;GAGd,AAFKN,EAAM,YAAS,IAAUO,EAAa,IAE3CC,EAAkBN,EAAQ,QAAQ;EACpC,CAAC,GAEDO,QAAkBJ,IAAU,CAAC,aAKnBL,EAAM,WADdP,EAAA,GAAAC,EAMEC,GAAA;;GAJC,UAAUC,EAAAiB,CAAA,CAAoB,CAACb,EAAM,UAAUA,EAAM,GAAG;GACxD,KAAKA,EAAM;GACZ,eAAA;GACA,gBAAA"}
1
+ {"version":3,"file":"AlfakitToaster.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","Toaster","_unref","_createCommentVNode","Toaster_default","AlfakitToaster_vue_vue_type_script_setup_true_lang_default","props","__props","context","useOptionalAlfakit","createStandaloneContext","release","onMounted","claimToaster","setToasterId","STARTER_KIT_TOASTER_ID","ensureFlashToasts","onUnmounted","openBlock","createBlock","unref","resolveToastPosition","createCommentVNode"],"sources":["../../src/standalone/AlfakitToaster.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { resolveToastPosition, STARTER_KIT_TOASTER_ID, type ToastPosition } from '@alfakit/core'\nimport { onMounted, onUnmounted } from 'vue'\nimport { setToasterId } from '../components/notifications/flash-toasts'\nimport Toaster from '../components/ui/Toaster.vue'\nimport { useOptionalAlfakit } from '../context'\nimport { claimToaster, createStandaloneContext, ensureFlashToasts } from './runtime'\n\n/**\n * Shows notifications flashed by standalone components (`Notification::make()->send()`\n * from `submit()` or an action) as toasts. Place it once in your app layout; a page whose\n * layout has none gets one from its first `<AlfakitComponent>`.\n *\n * Flash data comes from the `flash` Inertia event after each visit and from the initial\n * page (already fired before the app mounted), so it works in any layout.\n */\nconst props = withDefaults(\n defineProps<{\n /** Where toasts appear; `start`/`end` follow the reading direction. */\n position?: ToastPosition\n dir?: 'ltr' | 'rtl'\n /**\n * Render vue-sonner's `<Toaster>` too (default). Pass `false` when your layout already\n * mounts one: flashed Alfakit notifications are then shown through it.\n */\n toaster?: boolean\n /** @internal Set by `<AlfakitComponent>` when it takes the toaster role. */\n claimed?: boolean\n }>(),\n { dir: 'ltr', toaster: true, claimed: false },\n)\n\n// Outside <AlfakitComponent> the flash reader needs a registry for custom toast views.\nconst context =\n useOptionalAlfakit() ?? createStandaloneContext({ action: '', modal: '' }, undefined, undefined)\n\nlet release: (() => void) | null = null\n\nonMounted(() => {\n if (!props.claimed) release = claimToaster()\n\n // Our own toaster gets an id, so a `<Toaster />` the app's layout already mounts (the\n // starter kits have one) doesn't show every Alfakit toast a second time.\n if (props.toaster) setToasterId(STARTER_KIT_TOASTER_ID)\n\n ensureFlashToasts(context.registry)\n})\n\nonUnmounted(() => {\n release?.()\n\n if (props.toaster) setToasterId(undefined)\n})\n</script>\n\n<template>\n <Toaster\n v-if=\"props.toaster\"\n :id=\"STARTER_KIT_TOASTER_ID\"\n :position=\"resolveToastPosition(props.position, props.dir)\"\n :dir=\"props.dir\"\n rich-colors\n close-button\n />\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;EAgBA,IAAMO,IAAQC,GAiBRC,IACJC,EAAmB,KAAKC,EAAwB;GAAE,QAAQ;GAAI,OAAO;EAAG,GAAG,KAAA,GAAW,KAAA,CAAS,GAE7FC,IAA+B;SAEnCC,QAAgB;GAOd,AANKN,EAAM,YAAS,IAAUO,EAAa,IAIvCP,EAAM,WAASQ,EAAaC,CAAsB,GAEtDC,EAAkBR,EAAQ,QAAQ;EACpC,CAAC,GAEDS,QAAkB;GAGhB,AAFAN,IAAU,GAENL,EAAM,WAASQ,EAAa,KAAA,CAAS;EAC3C,CAAC,aAKSR,EAAM,WADdP,EAAA,GAAAC,EAOEC,GAAA;;GALC,IAAIC,EAAAa,CAAA;GACJ,UAAUb,EAAAmB,CAAA,CAAoB,CAACf,EAAM,UAAUA,EAAM,GAAG;GACxD,KAAKA,EAAM;GACZ,eAAA;GACA,gBAAA"}
@@ -13,6 +13,8 @@
13
13
  * your own `:root`. Shared by the React, Vue and Svelte renderers (copied into each dist).
14
14
  */
15
15
 
16
+ @import './components.css';
17
+
16
18
  @custom-variant dark (&:is(.dark *));
17
19
 
18
20
  /*
@@ -148,3 +150,48 @@
148
150
  content: attr(data-placeholder);
149
151
  @apply text-muted-foreground pointer-events-none float-left;
150
152
  }
153
+
154
+ /*
155
+ * "Developed by Alfa Six" (`[data-slot='credit']`) in the footer of panel pages. Starter-kit
156
+ * panels load this stylesheet instead of `themes.css`, so its rules are repeated here
157
+ * (keep them in step with the Credit section of themes.css).
158
+ */
159
+ [data-slot='credit'] {
160
+ display: flex;
161
+ justify-content: center;
162
+ padding: 0.75rem 1rem 1rem;
163
+ font-size: 0.75rem;
164
+ line-height: 1rem;
165
+ color: var(--muted-foreground);
166
+ }
167
+
168
+ [data-slot='credit'] a {
169
+ display: inline-flex;
170
+ align-items: center;
171
+ gap: 0.375rem;
172
+ color: inherit;
173
+ text-decoration: none;
174
+ transition: color 150ms;
175
+ }
176
+
177
+ [data-slot='credit'] svg {
178
+ width: auto;
179
+ height: 1.125rem;
180
+ flex-shrink: 0;
181
+ color: #073b78;
182
+ }
183
+
184
+ .dark [data-slot='credit'] svg {
185
+ color: #ffffff;
186
+ }
187
+
188
+ [data-slot='credit'] a:hover,
189
+ [data-slot='credit'] a:focus-visible {
190
+ color: var(--foreground);
191
+ text-decoration: underline;
192
+ text-underline-offset: 4px;
193
+ }
194
+
195
+ [data-slot='credit'] strong {
196
+ font-weight: 600;
197
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"SearchTrigger.js","names":["_sfc_main","SearchTrigger_vue_vue_type_script_setup_true_lang_default","SearchTrigger_default"],"sources":["../../../src/starter-kit/widgets/SearchTrigger.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n formatKeyBinding,\n registerStarterKitSearchShortcut,\n requestStarterKitSearch,\n type StarterKitWidgets,\n} from '@alfakit/core'\nimport { SearchIcon } from '@lucide/vue'\nimport { computed, watch } from 'vue'\nimport { useHydrated } from '../../composables/use-hydrated'\n\n/**\n * The search field until the palette has loaded: the same look, from the shared prop\n * alone. Its key bindings and a click are remembered and open the palette once loaded.\n */\nconst props = defineProps<{ source: StarterKitWidgets; onLoad?: () => void }>()\n\nconst hydrated = useHydrated()\nconst search = computed(() => props.source.widgets.search)\nconst placeholder = computed(() => search.value?.placeholder ?? '')\nconst binding = computed(() => search.value?.keyBindings[0])\n\nif (typeof window !== 'undefined') {\n watch(\n () => [JSON.stringify(search.value?.keyBindings ?? ['mod+k']), placeholder.value] as const,\n ([keys, label], _old, onCleanup) =>\n onCleanup(\n registerStarterKitSearchShortcut(JSON.parse(keys) as string[], label, () =>\n props.onLoad?.(),\n ),\n ),\n { immediate: true },\n )\n}\n\nfunction request() {\n requestStarterKitSearch()\n props.onLoad?.()\n}\n</script>\n\n<template>\n <button\n type=\"button\"\n class=\"border-input bg-background hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 focus-visible:ring-ring/50 text-muted-foreground inline-flex size-8 h-8 shrink-0 items-center justify-center gap-2 rounded-md border px-0 text-sm font-normal shadow-xs outline-none focus-visible:ring-[3px] sm:w-56 sm:justify-start sm:px-2.5\"\n @pointerenter=\"props.onLoad?.()\"\n @click=\"request\"\n >\n <SearchIcon class=\"size-4\" aria-hidden=\"true\" />\n <span class=\"sr-only sm:not-sr-only sm:flex-1 sm:text-start\">{{ placeholder }}</span>\n <kbd\n v-if=\"hydrated && binding\"\n class=\"bg-muted hidden rounded px-1 font-mono text-[10px] sm:inline\"\n >{{ formatKeyBinding(binding) }}</kbd\n >\n </button>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"SearchTrigger.js","names":["_sfc_main","SearchTrigger_vue_vue_type_script_setup_true_lang_default","SearchTrigger_default"],"sources":["../../../src/starter-kit/widgets/SearchTrigger.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n formatKeyBinding,\n registerStarterKitSearchShortcut,\n requestStarterKitSearch,\n type StarterKitWidgets,\n} from '@alfakit/core'\nimport { SearchIcon } from '@lucide/vue'\nimport { computed, watch } from 'vue'\nimport { useHydrated } from '../../composables/use-hydrated'\n\n/**\n * The search field until the palette has loaded: the same look, from the shared prop\n * alone. Its key bindings and a click are remembered and open the palette once loaded.\n */\nconst props = defineProps<{ source: StarterKitWidgets; onLoad?: () => void }>()\n\nconst hydrated = useHydrated()\nconst search = computed(() => props.source.widgets.search)\nconst placeholder = computed(() => search.value?.placeholder ?? '')\nconst binding = computed(() => search.value?.keyBindings[0])\n\nif (typeof window !== 'undefined') {\n watch(\n () => [JSON.stringify(search.value?.keyBindings ?? ['mod+k']), placeholder.value] as const,\n ([keys, label], _old, onCleanup) =>\n onCleanup(\n registerStarterKitSearchShortcut(JSON.parse(keys) as string[], label, () =>\n props.onLoad?.(),\n ),\n ),\n { immediate: true },\n )\n}\n\nfunction request() {\n requestStarterKitSearch()\n props.onLoad?.()\n}\n</script>\n\n<template>\n <button\n type=\"button\"\n class=\"border-input bg-background hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 focus-visible:ring-ring/50 text-muted-foreground inline-flex size-8 h-8 shrink-0 items-center justify-center gap-2 rounded-md border px-0 text-sm font-normal shadow-xs outline-none focus-visible:ring-[3px] sm:w-56 sm:justify-start sm:px-2.5\"\n @pointerenter=\"props.onLoad?.()\"\n @click=\"request\"\n >\n <SearchIcon class=\"size-4\" aria-hidden=\"true\" />\n <span class=\"sr-only sm:not-sr-only sm:flex-1 sm:text-start\">{{ placeholder }}</span>\n <kbd\n v-if=\"hydrated && binding\"\n dir=\"ltr\"\n class=\"bg-muted hidden rounded px-1 font-mono text-[10px] sm:inline\"\n >{{ formatKeyBinding(binding) }}</kbd\n >\n </button>\n</template>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"SearchTrigger.vue.d.ts","sourceRoot":"","sources":["../../../src/starter-kit/widgets/SearchTrigger.vue"],"names":[],"mappings":"AA2DA,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,eAAe,CAAA;AAKtB;;;GAGG;AACH,KAAK,WAAW,GAAG;IAAE,MAAM,EAAE,iBAAiB,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;CAAE,CAAC;;AA+HtE,wBAMG"}
1
+ {"version":3,"file":"SearchTrigger.vue.d.ts","sourceRoot":"","sources":["../../../src/starter-kit/widgets/SearchTrigger.vue"],"names":[],"mappings":"AA4DA,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,eAAe,CAAA;AAKtB;;;GAGG;AACH,KAAK,WAAW,GAAG;IAAE,MAAM,EAAE,iBAAiB,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;CAAE,CAAC;;AAgItE,wBAMG"}
@@ -5,6 +5,7 @@ import { SearchIcon as m } from "@lucide/vue";
5
5
  //#region src/starter-kit/widgets/SearchTrigger.vue?vue&type=script&setup=true&lang.ts
6
6
  var h = { class: "sr-only sm:not-sr-only sm:flex-1 sm:text-start" }, g = {
7
7
  key: 0,
8
+ dir: "ltr",
8
9
  class: "bg-muted hidden rounded px-1 font-mono text-[10px] sm:inline"
9
10
  }, _ = /*@__PURE__*/ l({
10
11
  __name: "SearchTrigger",
@@ -1 +1 @@
1
- {"version":3,"file":"SearchTrigger.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_createVNode","_unref","_createElementVNode","_toDisplayString","_createCommentVNode","_hoisted_1","_hoisted_2","SearchTrigger_vue_vue_type_script_setup_true_lang_default","props","__props","hydrated","useHydrated","search","computed","placeholder","binding","watch","keys","label","onCleanup","registerStarterKitSearchShortcut","request","requestStarterKitSearch","openBlock","createElementBlock","_cache","createVNode","unref","SearchIcon","createElementVNode","toDisplayString","formatKeyBinding","createCommentVNode"],"sources":["../../../src/starter-kit/widgets/SearchTrigger.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n formatKeyBinding,\n registerStarterKitSearchShortcut,\n requestStarterKitSearch,\n type StarterKitWidgets,\n} from '@alfakit/core'\nimport { SearchIcon } from '@lucide/vue'\nimport { computed, watch } from 'vue'\nimport { useHydrated } from '../../composables/use-hydrated'\n\n/**\n * The search field until the palette has loaded: the same look, from the shared prop\n * alone. Its key bindings and a click are remembered and open the palette once loaded.\n */\nconst props = defineProps<{ source: StarterKitWidgets; onLoad?: () => void }>()\n\nconst hydrated = useHydrated()\nconst search = computed(() => props.source.widgets.search)\nconst placeholder = computed(() => search.value?.placeholder ?? '')\nconst binding = computed(() => search.value?.keyBindings[0])\n\nif (typeof window !== 'undefined') {\n watch(\n () => [JSON.stringify(search.value?.keyBindings ?? ['mod+k']), placeholder.value] as const,\n ([keys, label], _old, onCleanup) =>\n onCleanup(\n registerStarterKitSearchShortcut(JSON.parse(keys) as string[], label, () =>\n props.onLoad?.(),\n ),\n ),\n { immediate: true },\n )\n}\n\nfunction request() {\n requestStarterKitSearch()\n props.onLoad?.()\n}\n</script>\n\n<template>\n <button\n type=\"button\"\n class=\"border-input bg-background hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 focus-visible:ring-ring/50 text-muted-foreground inline-flex size-8 h-8 shrink-0 items-center justify-center gap-2 rounded-md border px-0 text-sm font-normal shadow-xs outline-none focus-visible:ring-[3px] sm:w-56 sm:justify-start sm:px-2.5\"\n @pointerenter=\"props.onLoad?.()\"\n @click=\"request\"\n >\n <SearchIcon class=\"size-4\" aria-hidden=\"true\" />\n <span class=\"sr-only sm:not-sr-only sm:flex-1 sm:text-start\">{{ placeholder }}</span>\n <kbd\n v-if=\"hydrated && binding\"\n class=\"bg-muted hidden rounded px-1 font-mono text-[10px] sm:inline\"\n >{{ formatKeyBinding(binding) }}</kbd\n >\n </button>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;EAeA,IAAMU,IAAQC,GAERC,IAAWC,EAAY,GACvBC,IAASC,QAAeL,EAAM,OAAO,QAAQ,MAAM,GACnDM,IAAcD,QAAeD,EAAO,OAAO,eAAe,EAAE,GAC5DG,IAAUF,QAAeD,EAAO,OAAO,YAAY,EAAE;EAE3D,AAAI,OAAO,SAAW,OACpBI,QACQ,CAAC,KAAK,UAAUJ,EAAO,OAAO,eAAe,CAAC,OAAO,CAAC,GAAGE,EAAY,KAAK,IAC/E,CAACG,GAAMC,IAAQ,GAAM,MACpBC,EACEC,EAAiC,KAAK,MAAMH,CAAI,GAAeC,SAC7DV,EAAM,SAAS,CACjB,CACF,GACF,EAAE,WAAW,GAAK,CACpB;EAGF,SAASa,IAAU;GAEjB,AADAC,EAAwB,GACxBd,EAAM,SAAS;EACjB;oBAIEV,EAAA,GAAAC,EAaS,UAAA;GAZP,MAAK;GACL,OAAM;GACL,gBAAY,AAAA0B,EAAA,QAAA,MAAEjB,EAAM,SAAM;GAC1B,SAAOa;;GAERrB,EAAgDC,EAAA2B,CAAA,GAAA;IAApC,OAAM;IAAS,eAAY;;GACvC1B,EAAqF,QAArFG,GAAqFF,EAArBW,EAAA,KAAW,GAAA,CAAA;GAEnEb,EAAAS,CAAA,KAAYK,EAAA,SADpBjB,EAAA,GAAAC,EAIC,OAJDO,GAICH,EADKF,EAAA8B,CAAA,CAAgB,CAAChB,EAAA,KAAO,CAAA,GAAA,CAAA,KAAAiB,EAAA,IAAA,EAAA"}
1
+ {"version":3,"file":"SearchTrigger.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_createVNode","_unref","_createElementVNode","_toDisplayString","_createCommentVNode","_hoisted_1","_hoisted_2","SearchTrigger_vue_vue_type_script_setup_true_lang_default","props","__props","hydrated","useHydrated","search","computed","placeholder","binding","watch","keys","label","onCleanup","registerStarterKitSearchShortcut","request","requestStarterKitSearch","openBlock","createElementBlock","_cache","createVNode","unref","SearchIcon","createElementVNode","toDisplayString","formatKeyBinding","createCommentVNode"],"sources":["../../../src/starter-kit/widgets/SearchTrigger.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n formatKeyBinding,\n registerStarterKitSearchShortcut,\n requestStarterKitSearch,\n type StarterKitWidgets,\n} from '@alfakit/core'\nimport { SearchIcon } from '@lucide/vue'\nimport { computed, watch } from 'vue'\nimport { useHydrated } from '../../composables/use-hydrated'\n\n/**\n * The search field until the palette has loaded: the same look, from the shared prop\n * alone. Its key bindings and a click are remembered and open the palette once loaded.\n */\nconst props = defineProps<{ source: StarterKitWidgets; onLoad?: () => void }>()\n\nconst hydrated = useHydrated()\nconst search = computed(() => props.source.widgets.search)\nconst placeholder = computed(() => search.value?.placeholder ?? '')\nconst binding = computed(() => search.value?.keyBindings[0])\n\nif (typeof window !== 'undefined') {\n watch(\n () => [JSON.stringify(search.value?.keyBindings ?? ['mod+k']), placeholder.value] as const,\n ([keys, label], _old, onCleanup) =>\n onCleanup(\n registerStarterKitSearchShortcut(JSON.parse(keys) as string[], label, () =>\n props.onLoad?.(),\n ),\n ),\n { immediate: true },\n )\n}\n\nfunction request() {\n requestStarterKitSearch()\n props.onLoad?.()\n}\n</script>\n\n<template>\n <button\n type=\"button\"\n class=\"border-input bg-background hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 focus-visible:ring-ring/50 text-muted-foreground inline-flex size-8 h-8 shrink-0 items-center justify-center gap-2 rounded-md border px-0 text-sm font-normal shadow-xs outline-none focus-visible:ring-[3px] sm:w-56 sm:justify-start sm:px-2.5\"\n @pointerenter=\"props.onLoad?.()\"\n @click=\"request\"\n >\n <SearchIcon class=\"size-4\" aria-hidden=\"true\" />\n <span class=\"sr-only sm:not-sr-only sm:flex-1 sm:text-start\">{{ placeholder }}</span>\n <kbd\n v-if=\"hydrated && binding\"\n dir=\"ltr\"\n class=\"bg-muted hidden rounded px-1 font-mono text-[10px] sm:inline\"\n >{{ formatKeyBinding(binding) }}</kbd\n >\n </button>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;EAeA,IAAMU,IAAQC,GAERC,IAAWC,EAAY,GACvBC,IAASC,QAAeL,EAAM,OAAO,QAAQ,MAAM,GACnDM,IAAcD,QAAeD,EAAO,OAAO,eAAe,EAAE,GAC5DG,IAAUF,QAAeD,EAAO,OAAO,YAAY,EAAE;EAE3D,AAAI,OAAO,SAAW,OACpBI,QACQ,CAAC,KAAK,UAAUJ,EAAO,OAAO,eAAe,CAAC,OAAO,CAAC,GAAGE,EAAY,KAAK,IAC/E,CAACG,GAAMC,IAAQ,GAAM,MACpBC,EACEC,EAAiC,KAAK,MAAMH,CAAI,GAAeC,SAC7DV,EAAM,SAAS,CACjB,CACF,GACF,EAAE,WAAW,GAAK,CACpB;EAGF,SAASa,IAAU;GAEjB,AADAC,EAAwB,GACxBd,EAAM,SAAS;EACjB;oBAIEV,EAAA,GAAAC,EAcS,UAAA;GAbP,MAAK;GACL,OAAM;GACL,gBAAY,AAAA0B,EAAA,QAAA,MAAEjB,EAAM,SAAM;GAC1B,SAAOa;;GAERrB,EAAgDC,EAAA2B,CAAA,GAAA;IAApC,OAAM;IAAS,eAAY;;GACvC1B,EAAqF,QAArFG,GAAqFF,EAArBW,EAAA,KAAW,GAAA,CAAA;GAEnEb,EAAAS,CAAA,KAAYK,EAAA,SADpBjB,EAAA,GAAAC,EAKC,OALDO,GAKCH,EADKF,EAAA8B,CAAA,CAAgB,CAAChB,EAAA,KAAO,CAAA,GAAA,CAAA,KAAAiB,EAAA,IAAA,EAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"TenantChooser.js","names":["_sfc_main","TenantChooser_vue_vue_type_script_setup_true_lang_default","TenantChooser_default"],"sources":["../../../src/starter-kit/widgets/TenantChooser.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { initials, tenantNameText } from '@alfakit/core'\nimport { router } from '@inertiajs/vue3'\nimport { ChevronsUpDownIcon, PlusIcon } from '@lucide/vue'\nimport { computed } from 'vue'\nimport NavLabel from '../../components/panel/NavLabel.vue'\nimport Avatar from '../../components/ui/Avatar.vue'\nimport AvatarFallback from '../../components/ui/AvatarFallback.vue'\nimport AvatarImage from '../../components/ui/AvatarImage.vue'\nimport DropdownMenu from '../../components/ui/DropdownMenu.vue'\nimport DropdownMenuContent from '../../components/ui/DropdownMenuContent.vue'\nimport DropdownMenuItem from '../../components/ui/DropdownMenuItem.vue'\nimport DropdownMenuLabel from '../../components/ui/DropdownMenuLabel.vue'\nimport DropdownMenuSeparator from '../../components/ui/DropdownMenuSeparator.vue'\nimport DropdownMenuTrigger from '../../components/ui/DropdownMenuTrigger.vue'\nimport { usePanel, useT } from '../../context'\nimport { Icon } from '../../lib/icons'\n\n/** The user's tenants on a page outside the panel (no current tenant). */\nconst t = useT()\nconst panel = usePanel()\nconst tenancy = computed(() => panel.value.tenancy)\nconst label = computed(() => t('starter_kit.choose_tenant', {}, 'Choose a tenant'))\nconst visible = computed(\n () => !!tenancy.value && (tenancy.value.tenants.length > 0 || !!tenancy.value.registrationUrl),\n)\n</script>\n\n<template>\n <DropdownMenu v-if=\"tenancy && visible\">\n <DropdownMenuTrigger as-child>\n <button\n type=\"button\"\n data-slot=\"tenant-menu\"\n class=\"hover:bg-accent data-[state=open]:bg-accent inline-flex h-9 max-w-60 shrink-0 items-center gap-2 rounded-md px-2 text-sm font-medium\"\n >\n <span class=\"sr-only lg:not-sr-only lg:truncate\">{{ label }}</span>\n <Icon\n name=\"alfakit::panels.tenant-menu.toggle-button\"\n :fallback=\"ChevronsUpDownIcon\"\n class=\"text-muted-foreground size-4 shrink-0\"\n />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent class=\"min-w-56 rounded-lg\" side=\"bottom\" align=\"end\" :side-offset=\"4\">\n <DropdownMenuLabel v-if=\"tenancy.tenants.length > 0\" class=\"text-muted-foreground text-xs\">{{\n label\n }}</DropdownMenuLabel>\n <DropdownMenuItem\n v-for=\"tenant in tenancy.tenants\"\n :key=\"String(tenant.id)\"\n @select=\"router.visit(tenant.url)\"\n >\n <Avatar class=\"size-6 rounded-sm\">\n <AvatarImage v-if=\"tenant.avatar\" :src=\"tenant.avatar\" alt=\"\" />\n <AvatarFallback class=\"rounded-sm text-[10px]\">{{\n initials(tenantNameText(tenant))\n }}</AvatarFallback>\n </Avatar>\n <NavLabel class=\"flex-1 truncate\" :text=\"tenant.name\" :html=\"tenant.nameHtml\" />\n </DropdownMenuItem>\n <template v-if=\"tenancy.registrationUrl\">\n <DropdownMenuSeparator v-if=\"tenancy.tenants.length > 0\" />\n <DropdownMenuItem @select=\"router.visit(tenancy.registrationUrl!)\">\n <Icon name=\"alfakit::panels.tenant-menu.registration-button\" :fallback=\"PlusIcon\" />\n {{ t('tenancy.register', {}, 'New') }}\n </DropdownMenuItem>\n </template>\n </DropdownMenuContent>\n </DropdownMenu>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"TenantChooser.js","names":["_sfc_main","TenantChooser_vue_vue_type_script_setup_true_lang_default","TenantChooser_default"],"sources":["../../../src/starter-kit/widgets/TenantChooser.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { initials, tenantNameText } from '@alfakit/core'\nimport { router } from '@inertiajs/vue3'\nimport { ChevronsUpDownIcon, PlusIcon } from '@lucide/vue'\nimport { computed } from 'vue'\nimport NavLabel from '../../components/panel/NavLabel.vue'\nimport Avatar from '../../components/ui/Avatar.vue'\nimport AvatarFallback from '../../components/ui/AvatarFallback.vue'\nimport AvatarImage from '../../components/ui/AvatarImage.vue'\nimport DropdownMenu from '../../components/ui/DropdownMenu.vue'\nimport DropdownMenuContent from '../../components/ui/DropdownMenuContent.vue'\nimport DropdownMenuItem from '../../components/ui/DropdownMenuItem.vue'\nimport DropdownMenuLabel from '../../components/ui/DropdownMenuLabel.vue'\nimport DropdownMenuSeparator from '../../components/ui/DropdownMenuSeparator.vue'\nimport DropdownMenuTrigger from '../../components/ui/DropdownMenuTrigger.vue'\nimport { usePanel, useT } from '../../context'\nimport { Icon } from '../../lib/icons'\n\n/** The user's tenants on a page outside the panel (no current tenant). */\nconst t = useT()\nconst panel = usePanel()\nconst tenancy = computed(() => panel.value.tenancy)\nconst label = computed(() => t('starter_kit.choose_tenant', {}, 'Choose a tenant'))\nconst visible = computed(\n () => !!tenancy.value && (tenancy.value.tenants.length > 0 || !!tenancy.value.registrationUrl),\n)\n</script>\n\n<template>\n <DropdownMenu v-if=\"tenancy && visible\">\n <DropdownMenuTrigger as-child>\n <button\n type=\"button\"\n data-slot=\"tenant-menu\"\n class=\"hover:bg-accent data-[state=open]:bg-accent inline-flex h-9 max-w-60 shrink-0 items-center gap-2 rounded-md px-2 text-sm font-medium\"\n >\n <span class=\"sr-only lg:not-sr-only lg:truncate\">{{ label }}</span>\n <Icon\n name=\"alfakit::panels.tenant-menu.toggle-button\"\n :fallback=\"ChevronsUpDownIcon\"\n class=\"text-muted-foreground size-4 shrink-0\"\n />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent class=\"min-w-56 rounded-lg\" side=\"bottom\" align=\"end\" :side-offset=\"4\">\n <DropdownMenuLabel v-if=\"tenancy.tenants.length > 0\" class=\"text-muted-foreground text-xs\">{{\n label\n }}</DropdownMenuLabel>\n <DropdownMenuItem\n v-for=\"tenant in tenancy.tenants\"\n :key=\"String(tenant.id)\"\n @select=\"router.visit(tenant.url)\"\n >\n <Avatar class=\"size-6 rounded-sm\">\n <AvatarImage v-if=\"tenant.avatar\" :src=\"tenant.avatar\" alt=\"\" />\n <AvatarFallback class=\"rounded-sm text-[10px]\">{{\n initials(tenantNameText(tenant))\n }}</AvatarFallback>\n </Avatar>\n <NavLabel class=\"flex-1 truncate\" :text=\"tenant.name\" :html=\"tenant.nameHtml\" />\n </DropdownMenuItem>\n <template v-if=\"tenancy.registrationUrl\">\n <DropdownMenuSeparator v-if=\"tenancy.tenants.length > 0\" />\n <DropdownMenuItem @select=\"router.visit(tenancy.registrationUrl!)\">\n <Icon name=\"alfakit::panels.tenant-menu.registration-button\" :fallback=\"PlusIcon\" />\n {{ tenancy.registrationLabel ?? t('tenancy.register', {}, 'New') }}\n </DropdownMenuItem>\n </template>\n </DropdownMenuContent>\n </DropdownMenu>\n</template>\n"],"mappings":""}
@@ -70,7 +70,7 @@ var M = {
70
70
  default: k(() => [C(O(n), {
71
71
  name: "alfakit::panels.tenant-menu.registration-button",
72
72
  fallback: O(j)
73
- }, null, 8, ["fallback"]), S(" " + D(O(P)("tenancy.register", {}, "New")), 1)]),
73
+ }, null, 8, ["fallback"]), S(" " + D(I.value.registrationLabel ?? O(P)("tenancy.register", {}, "New")), 1)]),
74
74
  _: 1
75
75
  })], 64)) : y("", !0)
76
76
  ]),
@@ -1 +1 @@
1
- {"version":3,"file":"TenantChooser.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","DropdownMenu","_withCtx","_createVNode","DropdownMenuTrigger","_createElementVNode","_toDisplayString","_unref","Icon","DropdownMenuContent","DropdownMenuLabel","_createTextVNode","_createCommentVNode","_createElementBlock","_Fragment","_renderList","DropdownMenuItem","Avatar","AvatarImage","AvatarFallback","NavLabel","DropdownMenuSeparator","Icon_default","DropdownMenu_default","DropdownMenuContent_default","DropdownMenuItem_default","DropdownMenuSeparator_default","DropdownMenuTrigger_default","DropdownMenuLabel_default","NavLabel_default","Avatar_default","AvatarFallback_default","AvatarImage_default","_hoisted_1","_hoisted_2","TenantChooser_vue_vue_type_script_setup_true_lang_default","t","useT","panel","usePanel","tenancy","computed","label","visible","openBlock","createBlock","withCtx","createVNode","createElementVNode","toDisplayString","unref","ChevronsUpDownIcon","createTextVNode","createCommentVNode","createElementBlock","Fragment","renderList","tenant","router","initials","tenantNameText","_cache","PlusIcon"],"sources":["../../../src/starter-kit/widgets/TenantChooser.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { initials, tenantNameText } from '@alfakit/core'\nimport { router } from '@inertiajs/vue3'\nimport { ChevronsUpDownIcon, PlusIcon } from '@lucide/vue'\nimport { computed } from 'vue'\nimport NavLabel from '../../components/panel/NavLabel.vue'\nimport Avatar from '../../components/ui/Avatar.vue'\nimport AvatarFallback from '../../components/ui/AvatarFallback.vue'\nimport AvatarImage from '../../components/ui/AvatarImage.vue'\nimport DropdownMenu from '../../components/ui/DropdownMenu.vue'\nimport DropdownMenuContent from '../../components/ui/DropdownMenuContent.vue'\nimport DropdownMenuItem from '../../components/ui/DropdownMenuItem.vue'\nimport DropdownMenuLabel from '../../components/ui/DropdownMenuLabel.vue'\nimport DropdownMenuSeparator from '../../components/ui/DropdownMenuSeparator.vue'\nimport DropdownMenuTrigger from '../../components/ui/DropdownMenuTrigger.vue'\nimport { usePanel, useT } from '../../context'\nimport { Icon } from '../../lib/icons'\n\n/** The user's tenants on a page outside the panel (no current tenant). */\nconst t = useT()\nconst panel = usePanel()\nconst tenancy = computed(() => panel.value.tenancy)\nconst label = computed(() => t('starter_kit.choose_tenant', {}, 'Choose a tenant'))\nconst visible = computed(\n () => !!tenancy.value && (tenancy.value.tenants.length > 0 || !!tenancy.value.registrationUrl),\n)\n</script>\n\n<template>\n <DropdownMenu v-if=\"tenancy && visible\">\n <DropdownMenuTrigger as-child>\n <button\n type=\"button\"\n data-slot=\"tenant-menu\"\n class=\"hover:bg-accent data-[state=open]:bg-accent inline-flex h-9 max-w-60 shrink-0 items-center gap-2 rounded-md px-2 text-sm font-medium\"\n >\n <span class=\"sr-only lg:not-sr-only lg:truncate\">{{ label }}</span>\n <Icon\n name=\"alfakit::panels.tenant-menu.toggle-button\"\n :fallback=\"ChevronsUpDownIcon\"\n class=\"text-muted-foreground size-4 shrink-0\"\n />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent class=\"min-w-56 rounded-lg\" side=\"bottom\" align=\"end\" :side-offset=\"4\">\n <DropdownMenuLabel v-if=\"tenancy.tenants.length > 0\" class=\"text-muted-foreground text-xs\">{{\n label\n }}</DropdownMenuLabel>\n <DropdownMenuItem\n v-for=\"tenant in tenancy.tenants\"\n :key=\"String(tenant.id)\"\n @select=\"router.visit(tenant.url)\"\n >\n <Avatar class=\"size-6 rounded-sm\">\n <AvatarImage v-if=\"tenant.avatar\" :src=\"tenant.avatar\" alt=\"\" />\n <AvatarFallback class=\"rounded-sm text-[10px]\">{{\n initials(tenantNameText(tenant))\n }}</AvatarFallback>\n </Avatar>\n <NavLabel class=\"flex-1 truncate\" :text=\"tenant.name\" :html=\"tenant.nameHtml\" />\n </DropdownMenuItem>\n <template v-if=\"tenancy.registrationUrl\">\n <DropdownMenuSeparator v-if=\"tenancy.tenants.length > 0\" />\n <DropdownMenuItem @select=\"router.visit(tenancy.registrationUrl!)\">\n <Icon name=\"alfakit::panels.tenant-menu.registration-button\" :fallback=\"PlusIcon\" />\n {{ t('tenancy.register', {}, 'New') }}\n </DropdownMenuItem>\n </template>\n </DropdownMenuContent>\n </DropdownMenu>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;EAmBA,IAAMqC,IAAIC,EAAK,GACTC,IAAQC,EAAS,GACjBC,IAAUC,QAAeH,EAAM,MAAM,OAAO,GAC5CI,IAAQD,QAAeL,EAAE,6BAA6B,CAAC,GAAG,iBAAiB,CAAC,GAC5EO,IAAUF,QACR,CAAC,CAACD,EAAQ,UAAUA,EAAQ,MAAM,QAAQ,SAAS,KAAK,CAAC,CAACA,EAAQ,MAAM,gBAChF;mBAIsBA,EAAA,SAAWG,EAAA,SAA/B5C,EAAA,GAAAC,EAwCeC,GAAA,EAAA,KAAA,EAAA,GAAA;GAvCb,SAAAC,QAasB,CAbtBC,EAasBC,GAAA,EAbD,YAAA,GAAQ,GAAA;IAC3B,SAAAF,QAWS,CAXTG,EAWS,UAXT4B,GAWS,CANP5B,EAAmE,QAAnE6B,GAAmE5B,EAAfoC,EAAA,KAAK,GAAA,CAAA,GACzDvC,EAIEI,EAAAC,CAAA,GAAA;KAHA,MAAK;KACJ,UAAUD,EAAA4C,CAAA;KACX,OAAM;;;GAIZhD,CAAAA,GAAAA,EAwBsBM,GAAA;IAxBD,OAAM;IAAsB,MAAK;IAAS,OAAM;IAAO,eAAa;;IACvF,SAAAP,QAEsB;KAFGsC,EAAA,MAAQ,QAAQ,SAAM,KAA/CzC,EAAA,GAAAC,EAEsBU,GAAA;;MAF+B,OAAM;;MAAgC,SAAAR,QAEzF,CADAS,EAAAL,EAAAoC,EAAA,KAAK,GAAA,CAAA,CAAA,CAAA;;;MAEP3C,EAAA,EAAA,GAAAc,EAYmBC,GAAA,MAAAC,EAXAyB,EAAA,MAAQ,UAAlB,OADTzC,EAAA,GAAAC,EAYmBgB,GAAA;MAVhB,KAAK,OAAOyC,EAAO,EAAE;MACrB,WAAM,MAAElD,EAAAmD,CAAA,CAAM,CAAC,MAAMD,EAAO,GAAG;;MAEhC,SAAAvD,QAKS,CALTC,EAKSc,GAAA,EALD,OAAM,oBAAmB,GAAA;OAC/B,SAAAf,QAAgE,CAA7CuD,EAAO,UAA1B1D,EAAA,GAAAC,EAAgEkB,GAAA;;QAA7B,KAAKuC,EAAO;QAAQ,KAAI;OAC3DtD,GAAAA,MAAAA,GAAAA,CAAAA,KAAAA,CAAAA,KAAAA,EAAAA,IAAAA,EAAAA,GAAAA,EAEmBgB,GAAA,EAFH,OAAM,yBAAwB,GAAA;QAAC,SAAAjB,QAE7C,CADAS,EAAAL,EAAAC,EAAAoD,CAAA,CAAQ,CAACpD,EAAAqD,CAAA,CAAc,CAACH,CAAM,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;;;MAGlCtD,GAAAA,IAAAA,GAAAA,EAAgFiB,GAAA;OAAtE,OAAM;OAAmB,MAAMqC,EAAO;OAAO,MAAMA,EAAO;;;;KAEtDjB,EAAA,MAAQ,mBAAxBzC,EAAA,GAAAc,EAMWC,GAAA,EAAA,KAAA,EAAA,GAAA,CALoB0B,EAAA,MAAQ,QAAQ,SAAM,KAAnDzC,EAAA,GAAAC,EAA2DqB,GAAA,EAAA,KAAA,EAAA,CAAA,KAAAgC,EAAA,IAAA,EAAA,GAC3DlD,EAGmBa,GAAA,EAHA,UAAM,AAAA6C,EAAA,QAAA,MAAEtD,EAAAmD,CAAA,CAAM,CAAC,MAAMlB,EAAA,MAAQ,eAAe,EAAA,GAAA;MAC7D,SAAAtC,QAAoF,CAApFC,EAAoFI,EAAAC,CAAA,GAAA;OAA9E,MAAK;OAAmD,UAAUD,EAAAuD,CAAA;MAAYnD,GAAAA,MAAAA,GAAAA,CAAAA,UAAAA,CAAAA,GAAAA,EAAA,MACpFL,EAAGC,EAAA6B,CAAA,CAAC,CAAA,oBAAA,CAAA,GAAA,KAAA,CAAA,GAAA,CAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"TenantChooser.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","DropdownMenu","_withCtx","_createVNode","DropdownMenuTrigger","_createElementVNode","_toDisplayString","_unref","Icon","DropdownMenuContent","DropdownMenuLabel","_createTextVNode","_createCommentVNode","_createElementBlock","_Fragment","_renderList","DropdownMenuItem","Avatar","AvatarImage","AvatarFallback","NavLabel","DropdownMenuSeparator","Icon_default","DropdownMenu_default","DropdownMenuContent_default","DropdownMenuItem_default","DropdownMenuSeparator_default","DropdownMenuTrigger_default","DropdownMenuLabel_default","NavLabel_default","Avatar_default","AvatarFallback_default","AvatarImage_default","_hoisted_1","_hoisted_2","TenantChooser_vue_vue_type_script_setup_true_lang_default","t","useT","panel","usePanel","tenancy","computed","label","visible","openBlock","createBlock","withCtx","createVNode","createElementVNode","toDisplayString","unref","ChevronsUpDownIcon","createTextVNode","createCommentVNode","createElementBlock","Fragment","renderList","tenant","router","initials","tenantNameText","_cache","PlusIcon"],"sources":["../../../src/starter-kit/widgets/TenantChooser.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { initials, tenantNameText } from '@alfakit/core'\nimport { router } from '@inertiajs/vue3'\nimport { ChevronsUpDownIcon, PlusIcon } from '@lucide/vue'\nimport { computed } from 'vue'\nimport NavLabel from '../../components/panel/NavLabel.vue'\nimport Avatar from '../../components/ui/Avatar.vue'\nimport AvatarFallback from '../../components/ui/AvatarFallback.vue'\nimport AvatarImage from '../../components/ui/AvatarImage.vue'\nimport DropdownMenu from '../../components/ui/DropdownMenu.vue'\nimport DropdownMenuContent from '../../components/ui/DropdownMenuContent.vue'\nimport DropdownMenuItem from '../../components/ui/DropdownMenuItem.vue'\nimport DropdownMenuLabel from '../../components/ui/DropdownMenuLabel.vue'\nimport DropdownMenuSeparator from '../../components/ui/DropdownMenuSeparator.vue'\nimport DropdownMenuTrigger from '../../components/ui/DropdownMenuTrigger.vue'\nimport { usePanel, useT } from '../../context'\nimport { Icon } from '../../lib/icons'\n\n/** The user's tenants on a page outside the panel (no current tenant). */\nconst t = useT()\nconst panel = usePanel()\nconst tenancy = computed(() => panel.value.tenancy)\nconst label = computed(() => t('starter_kit.choose_tenant', {}, 'Choose a tenant'))\nconst visible = computed(\n () => !!tenancy.value && (tenancy.value.tenants.length > 0 || !!tenancy.value.registrationUrl),\n)\n</script>\n\n<template>\n <DropdownMenu v-if=\"tenancy && visible\">\n <DropdownMenuTrigger as-child>\n <button\n type=\"button\"\n data-slot=\"tenant-menu\"\n class=\"hover:bg-accent data-[state=open]:bg-accent inline-flex h-9 max-w-60 shrink-0 items-center gap-2 rounded-md px-2 text-sm font-medium\"\n >\n <span class=\"sr-only lg:not-sr-only lg:truncate\">{{ label }}</span>\n <Icon\n name=\"alfakit::panels.tenant-menu.toggle-button\"\n :fallback=\"ChevronsUpDownIcon\"\n class=\"text-muted-foreground size-4 shrink-0\"\n />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent class=\"min-w-56 rounded-lg\" side=\"bottom\" align=\"end\" :side-offset=\"4\">\n <DropdownMenuLabel v-if=\"tenancy.tenants.length > 0\" class=\"text-muted-foreground text-xs\">{{\n label\n }}</DropdownMenuLabel>\n <DropdownMenuItem\n v-for=\"tenant in tenancy.tenants\"\n :key=\"String(tenant.id)\"\n @select=\"router.visit(tenant.url)\"\n >\n <Avatar class=\"size-6 rounded-sm\">\n <AvatarImage v-if=\"tenant.avatar\" :src=\"tenant.avatar\" alt=\"\" />\n <AvatarFallback class=\"rounded-sm text-[10px]\">{{\n initials(tenantNameText(tenant))\n }}</AvatarFallback>\n </Avatar>\n <NavLabel class=\"flex-1 truncate\" :text=\"tenant.name\" :html=\"tenant.nameHtml\" />\n </DropdownMenuItem>\n <template v-if=\"tenancy.registrationUrl\">\n <DropdownMenuSeparator v-if=\"tenancy.tenants.length > 0\" />\n <DropdownMenuItem @select=\"router.visit(tenancy.registrationUrl!)\">\n <Icon name=\"alfakit::panels.tenant-menu.registration-button\" :fallback=\"PlusIcon\" />\n {{ tenancy.registrationLabel ?? t('tenancy.register', {}, 'New') }}\n </DropdownMenuItem>\n </template>\n </DropdownMenuContent>\n </DropdownMenu>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;EAmBA,IAAMqC,IAAIC,EAAK,GACTC,IAAQC,EAAS,GACjBC,IAAUC,QAAeH,EAAM,MAAM,OAAO,GAC5CI,IAAQD,QAAeL,EAAE,6BAA6B,CAAC,GAAG,iBAAiB,CAAC,GAC5EO,IAAUF,QACR,CAAC,CAACD,EAAQ,UAAUA,EAAQ,MAAM,QAAQ,SAAS,KAAK,CAAC,CAACA,EAAQ,MAAM,gBAChF;mBAIsBA,EAAA,SAAWG,EAAA,SAA/B5C,EAAA,GAAAC,EAwCeC,GAAA,EAAA,KAAA,EAAA,GAAA;GAvCb,SAAAC,QAasB,CAbtBC,EAasBC,GAAA,EAbD,YAAA,GAAQ,GAAA;IAC3B,SAAAF,QAWS,CAXTG,EAWS,UAXT4B,GAWS,CANP5B,EAAmE,QAAnE6B,GAAmE5B,EAAfoC,EAAA,KAAK,GAAA,CAAA,GACzDvC,EAIEI,EAAAC,CAAA,GAAA;KAHA,MAAK;KACJ,UAAUD,EAAA4C,CAAA;KACX,OAAM;;;GAIZhD,CAAAA,GAAAA,EAwBsBM,GAAA;IAxBD,OAAM;IAAsB,MAAK;IAAS,OAAM;IAAO,eAAa;;IACvF,SAAAP,QAEsB;KAFGsC,EAAA,MAAQ,QAAQ,SAAM,KAA/CzC,EAAA,GAAAC,EAEsBU,GAAA;;MAF+B,OAAM;;MAAgC,SAAAR,QAEzF,CADAS,EAAAL,EAAAoC,EAAA,KAAK,GAAA,CAAA,CAAA,CAAA;;;MAEP3C,EAAA,EAAA,GAAAc,EAYmBC,GAAA,MAAAC,EAXAyB,EAAA,MAAQ,UAAlB,OADTzC,EAAA,GAAAC,EAYmBgB,GAAA;MAVhB,KAAK,OAAOyC,EAAO,EAAE;MACrB,WAAM,MAAElD,EAAAmD,CAAA,CAAM,CAAC,MAAMD,EAAO,GAAG;;MAEhC,SAAAvD,QAKS,CALTC,EAKSc,GAAA,EALD,OAAM,oBAAmB,GAAA;OAC/B,SAAAf,QAAgE,CAA7CuD,EAAO,UAA1B1D,EAAA,GAAAC,EAAgEkB,GAAA;;QAA7B,KAAKuC,EAAO;QAAQ,KAAI;OAC3DtD,GAAAA,MAAAA,GAAAA,CAAAA,KAAAA,CAAAA,KAAAA,EAAAA,IAAAA,EAAAA,GAAAA,EAEmBgB,GAAA,EAFH,OAAM,yBAAwB,GAAA;QAAC,SAAAjB,QAE7C,CADAS,EAAAL,EAAAC,EAAAoD,CAAA,CAAQ,CAACpD,EAAAqD,CAAA,CAAc,CAACH,CAAM,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;;;MAGlCtD,GAAAA,IAAAA,GAAAA,EAAgFiB,GAAA;OAAtE,OAAM;OAAmB,MAAMqC,EAAO;OAAO,MAAMA,EAAO;;;;KAEtDjB,EAAA,MAAQ,mBAAxBzC,EAAA,GAAAc,EAMWC,GAAA,EAAA,KAAA,EAAA,GAAA,CALoB0B,EAAA,MAAQ,QAAQ,SAAM,KAAnDzC,EAAA,GAAAC,EAA2DqB,GAAA,EAAA,KAAA,EAAA,CAAA,KAAAgC,EAAA,IAAA,EAAA,GAC3DlD,EAGmBa,GAAA,EAHA,UAAM,AAAA6C,EAAA,QAAA,MAAEtD,EAAAmD,CAAA,CAAM,CAAC,MAAMlB,EAAA,MAAQ,eAAe,EAAA,GAAA;MAC7D,SAAAtC,QAAoF,CAApFC,EAAoFI,EAAAC,CAAA,GAAA;OAA9E,MAAK;OAAmD,UAAUD,EAAAuD,CAAA;MAAYnD,GAAAA,MAAAA,GAAAA,CAAAA,UAAAA,CAAAA,GAAAA,EAAA,MACpFL,EAAGkC,EAAA,MAAQ,qBAAqBjC,EAAA6B,CAAA,CAAC,CAAA,oBAAA,CAAA,GAAA,KAAA,CAAA,GAAA,CAAA,CAAA,CAAA"}
package/dist/themes.css CHANGED
@@ -1,3 +1,5 @@
1
+ @import './components.css';
2
+
1
3
  /*
2
4
  * Alfakit themes. Shared by every renderer and imported by their `styles.css`.
3
5
  *
@@ -1004,337 +1006,3 @@
1004
1006
  box-shadow: none;
1005
1007
  outline: none;
1006
1008
  }
1007
-
1008
- /* ------------------------------------------------------------------ Charts */
1009
-
1010
- /*
1011
- * Chart.js paints axes, legends and tooltips on the canvas, so chart widgets read these
1012
- * properties from <html> (re-read when the theme or dark mode changes). Colours take any
1013
- * CSS colour; the widths and radius are unitless numbers. Override them in a theme:
1014
- * :root[data-alfakit-theme~='acme'] { --chart-tooltip-bg: oklch(0.2 0 0); }
1015
- * Stat sparklines (`[data-slot='stat-chart']`) use the `--stat-chart-*` properties.
1016
- */
1017
- :root {
1018
- --chart-text: var(--muted-foreground);
1019
- --chart-grid: var(--border);
1020
- --chart-legend-foreground: var(--muted-foreground);
1021
- --chart-tooltip-bg: var(--popover);
1022
- --chart-tooltip-foreground: var(--popover-foreground);
1023
- --chart-tooltip-border: var(--border);
1024
- --chart-tooltip-border-width: 1;
1025
- --chart-tooltip-radius: 6;
1026
- --stat-chart-stroke-width: 2;
1027
- --stat-chart-fill-opacity: 0.12;
1028
- }
1029
-
1030
- /*
1031
- * RichEditor `grid` column blocks and `lead` / `small` text, in the editor and in rendered
1032
- * content (`RichContentRenderer`). Columns stack on small screens. Stored as
1033
- * `<div data-type="grid" class="alfakit-grid alfakit-grid-cols-2"><div data-type="gridColumn">`
1034
- * and `<p class="alfakit-lead">`; copy these rules when showing content outside a panel.
1035
- */
1036
- :where(.alfakit-grid) {
1037
- display: grid;
1038
- gap: 1rem;
1039
- grid-template-columns: minmax(0, 1fr);
1040
- margin-block: 0.5rem;
1041
- }
1042
- :where(.alfakit-grid-column) {
1043
- min-width: 0;
1044
- }
1045
- :where(.alfakit-grid-column) > :first-child {
1046
- margin-block-start: 0;
1047
- }
1048
- @media (min-width: 768px) {
1049
- :where(.alfakit-grid-cols-2) {
1050
- grid-template-columns: repeat(2, minmax(0, 1fr));
1051
- }
1052
- :where(.alfakit-grid-cols-3) {
1053
- grid-template-columns: repeat(3, minmax(0, 1fr));
1054
- }
1055
- :where(.alfakit-grid-cols-4) {
1056
- grid-template-columns: repeat(4, minmax(0, 1fr));
1057
- }
1058
- :where(.alfakit-grid-cols-5) {
1059
- grid-template-columns: repeat(5, minmax(0, 1fr));
1060
- }
1061
- :where(.alfakit-grid-cols-6) {
1062
- grid-template-columns: repeat(6, minmax(0, 1fr));
1063
- }
1064
- }
1065
- :where([contenteditable] .alfakit-grid-column) {
1066
- border: 1px dashed var(--border);
1067
- border-radius: 0.375rem;
1068
- padding: 0.25rem 0.5rem;
1069
- }
1070
- :where(.alfakit-lead) {
1071
- font-size: 1.125em;
1072
- line-height: 1.6;
1073
- }
1074
- :where(.alfakit-prose small) {
1075
- font-size: 0.8125em;
1076
- }
1077
-
1078
- /* ---------------------------------------------------------- Calendar and tree */
1079
-
1080
- /*
1081
- * The calendar widget (alfasix/alfakit-calendar) draws FullCalendar inside
1082
- * `[data-slot="calendar"]`; FullCalendar reads these `--fc-*` variables, so every theme's
1083
- * tokens (and dark mode) apply. Override them on the slot to restyle one calendar.
1084
- */
1085
- :where(.fc[data-slot='calendar']) {
1086
- --fc-small-font-size: 0.75rem;
1087
- --fc-page-bg-color: var(--card);
1088
- --fc-neutral-bg-color: var(--muted);
1089
- --fc-neutral-text-color: var(--muted-foreground);
1090
- --fc-border-color: var(--border);
1091
- --fc-button-text-color: var(--foreground);
1092
- --fc-button-bg-color: var(--background);
1093
- --fc-button-border-color: var(--border);
1094
- --fc-button-hover-bg-color: var(--accent);
1095
- --fc-button-hover-border-color: var(--border);
1096
- --fc-button-active-bg-color: var(--secondary);
1097
- --fc-button-active-border-color: var(--border);
1098
- --fc-event-bg-color: var(--primary);
1099
- --fc-event-border-color: var(--primary);
1100
- --fc-event-text-color: var(--primary-foreground);
1101
- --fc-event-selected-overlay-color: color-mix(in oklab, var(--foreground) 25%, transparent);
1102
- --fc-more-link-bg-color: var(--muted);
1103
- --fc-more-link-text-color: var(--foreground);
1104
- --fc-non-business-color: color-mix(in oklab, var(--muted) 60%, transparent);
1105
- --fc-bg-event-color: var(--primary);
1106
- --fc-bg-event-opacity: 0.2;
1107
- --fc-highlight-color: color-mix(in oklab, var(--primary) 15%, transparent);
1108
- --fc-today-bg-color: color-mix(in oklab, var(--primary) 6%, transparent);
1109
- --fc-now-indicator-color: var(--destructive);
1110
- --fc-list-event-hover-bg-color: var(--accent);
1111
- color: var(--card-foreground);
1112
- }
1113
- /*
1114
- * FullCalendar puts its `fc` class on the slot element itself and injects its own CSS
1115
- * (`.fc .fc-button`, two classes), so these rules are plain selectors anchored on
1116
- * `.fc[data-slot='calendar']` (three) rather than `:where()`, which would always lose.
1117
- * Restyle one calendar with a more specific selector or with the `--fc-*` variables.
1118
- */
1119
- .fc[data-slot='calendar'] .fc-toolbar-title {
1120
- font-size: 1.125rem;
1121
- font-weight: 600;
1122
- line-height: 1.75rem;
1123
- color: var(--foreground);
1124
- }
1125
- .fc[data-slot='calendar'] .fc-button {
1126
- display: inline-flex;
1127
- align-items: center;
1128
- justify-content: center;
1129
- min-height: 2.25rem;
1130
- padding: 0.375rem 0.75rem;
1131
- border-radius: var(--radius);
1132
- font-size: 0.875rem;
1133
- font-weight: 500;
1134
- line-height: 1.25rem;
1135
- box-shadow: none;
1136
- text-transform: capitalize;
1137
- }
1138
- .fc[data-slot='calendar'] .fc-button .fc-icon {
1139
- font-size: 1.125rem;
1140
- }
1141
- .fc[data-slot='calendar'] .fc-button-group > .fc-button:not(:first-child) {
1142
- border-start-start-radius: 0;
1143
- border-end-start-radius: 0;
1144
- }
1145
- .fc[data-slot='calendar'] .fc-button-group > .fc-button:not(:last-child) {
1146
- border-start-end-radius: 0;
1147
- border-end-end-radius: 0;
1148
- }
1149
- .fc[data-slot='calendar'] .fc-button-primary:disabled {
1150
- opacity: 0.5;
1151
- }
1152
- .fc[data-slot='calendar'] .fc-button-primary:not(:disabled).fc-button-active,
1153
- .fc[data-slot='calendar'] .fc-button-primary:not(:disabled):active {
1154
- color: var(--secondary-foreground);
1155
- }
1156
- .fc[data-slot='calendar'] .fc-button-primary:focus,
1157
- .fc[data-slot='calendar'] .fc-button-primary:not(:disabled).fc-button-active:focus,
1158
- .fc[data-slot='calendar'] .fc-button-primary:not(:disabled):active:focus {
1159
- box-shadow: none;
1160
- }
1161
- .fc[data-slot='calendar'] .fc-button:focus-visible {
1162
- outline: 2px solid var(--ring);
1163
- outline-offset: 2px;
1164
- z-index: 2;
1165
- }
1166
- .fc[data-slot='calendar'] a {
1167
- color: inherit;
1168
- }
1169
- .fc[data-slot='calendar'] .fc-daygrid-day-number,
1170
- .fc[data-slot='calendar'] .fc-col-header-cell-cushion {
1171
- text-decoration: none;
1172
- }
1173
- .fc[data-slot='calendar'] .fc-col-header-cell-cushion {
1174
- padding-block: 0.375rem;
1175
- font-size: 0.75rem;
1176
- font-weight: 500;
1177
- color: var(--muted-foreground);
1178
- }
1179
- .fc[data-slot='calendar'] .fc-daygrid-day-number {
1180
- font-size: 0.875rem;
1181
- }
1182
- .fc[data-slot='calendar'] .fc-day-other .fc-daygrid-day-number {
1183
- color: var(--muted-foreground);
1184
- }
1185
- /* Today: a tinted cell (`--fc-today-bg-color`) and the date in a primary pill. */
1186
- .fc[data-slot='calendar'] .fc-daygrid-day.fc-day-today .fc-daygrid-day-number {
1187
- display: inline-flex;
1188
- align-items: center;
1189
- justify-content: center;
1190
- min-width: 1.75rem;
1191
- height: 1.75rem;
1192
- margin: 0.25rem;
1193
- padding: 0 0.375rem;
1194
- border-radius: 9999px;
1195
- background: var(--primary);
1196
- color: var(--primary-foreground);
1197
- font-weight: 600;
1198
- }
1199
- .fc[data-slot='calendar'] .fc-col-header-cell.fc-day-today .fc-col-header-cell-cushion {
1200
- color: var(--primary);
1201
- font-weight: 600;
1202
- }
1203
- .fc[data-slot='calendar'] .fc-event {
1204
- border-radius: min(var(--radius), 0.375rem);
1205
- }
1206
- .fc[data-slot='calendar'] .fc-daygrid-event,
1207
- .fc[data-slot='calendar'] .fc-timegrid-event .fc-event-main,
1208
- .fc[data-slot='calendar'] .fc-list-event td {
1209
- font-size: 0.75rem;
1210
- }
1211
- .fc[data-slot='calendar'] .fc-daygrid-dot-event:hover,
1212
- .fc[data-slot='calendar'] .fc-daygrid-dot-event.fc-event-mirror {
1213
- background: var(--accent);
1214
- }
1215
- .fc[data-slot='calendar'] .fc-list-day-cushion,
1216
- .fc[data-slot='calendar'] .fc-popover-header {
1217
- color: var(--foreground);
1218
- }
1219
- .fc[data-slot='calendar'] .fc-popover {
1220
- border-radius: var(--radius);
1221
- box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1);
1222
- overflow: hidden;
1223
- }
1224
- .fc[data-slot='calendar'] .fc-timegrid-slot-label,
1225
- .fc[data-slot='calendar'] .fc-timegrid-axis,
1226
- .fc[data-slot='calendar'] .fc-list-event-time {
1227
- color: var(--muted-foreground);
1228
- font-size: 0.75rem;
1229
- }
1230
- /*
1231
- * The list view hides its column headers for screen readers with `left: -10000px`. Right to
1232
- * left that is scrollable overflow: the whole page gains a 10 000 px horizontal scroll and the
1233
- * top bar slides under the sidebar. Clip it in place instead (still read by screen readers).
1234
- */
1235
- .fc[data-slot='calendar'] .fc-list-table thead {
1236
- left: auto;
1237
- inset-inline-start: 0;
1238
- width: 1px;
1239
- height: 1px;
1240
- overflow: hidden;
1241
- clip-path: inset(50%);
1242
- white-space: nowrap;
1243
- }
1244
-
1245
- /*
1246
- * Fields contain what they position. Headless switches, checkboxes and radios render a
1247
- * visually hidden native input beside the control, absolutely positioned (and shifted by
1248
- * -100%); without a positioned field it lands at the page edge and, right to left, widens
1249
- * the page on phones.
1250
- */
1251
- :where([data-slot='field']) {
1252
- position: relative;
1253
- }
1254
-
1255
- /*
1256
- * Narrow screens: FullCalendar keeps its header toolbar on one row, wider than a phone.
1257
- * Its chunks (navigation, title, views) wrap instead, and the title shrinks. Flex gaps and
1258
- * `justify-content` follow the writing direction, so this works right to left too. (Plain
1259
- * selectors: FullCalendar injects its own CSS, which would beat `:where()`; the slot is
1260
- * the `.fc` element itself.)
1261
- */
1262
- @media (max-width: 39.99rem) {
1263
- [data-slot='calendar'] .fc-toolbar.fc-header-toolbar {
1264
- flex-wrap: wrap;
1265
- gap: 0.5rem;
1266
- }
1267
- [data-slot='calendar'] .fc-toolbar .fc-toolbar-chunk {
1268
- display: flex;
1269
- flex-wrap: wrap;
1270
- align-items: center;
1271
- gap: 0.25rem;
1272
- min-width: 0;
1273
- }
1274
- [data-slot='calendar'] .fc-toolbar .fc-toolbar-title {
1275
- font-size: 1rem;
1276
- overflow-wrap: anywhere;
1277
- }
1278
- [data-slot='calendar'] .fc-toolbar .fc-button {
1279
- font-size: 0.8125rem;
1280
- }
1281
- }
1282
-
1283
- /*
1284
- * The tree (alfasix/alfakit-tree): the drop indicator while dragging. Rows carry
1285
- * `data-drop="before|after|inside"`; lines are drawn above or below the row, so they
1286
- * need no direction.
1287
- */
1288
- :where([data-slot='tree-item'][data-drop='before']) {
1289
- box-shadow: inset 0 2px 0 0 var(--primary);
1290
- }
1291
- :where([data-slot='tree-item'][data-drop='after']) {
1292
- box-shadow: inset 0 -2px 0 0 var(--primary);
1293
- }
1294
- :where([data-slot='tree-item'][data-drop='inside']) {
1295
- background-color: color-mix(in oklab, var(--primary) 10%, transparent);
1296
- outline: 1px dashed var(--primary);
1297
- outline-offset: -1px;
1298
- }
1299
-
1300
- /*
1301
- * The Kanban board (alfasix/alfakit-kanban). A card being dragged leaves a dashed
1302
- * placeholder (`data-picked="pointer"`) while a copy follows the pointer
1303
- * (`data-slot="kanban-ghost"`); a card picked up with the keyboard is lifted
1304
- * (`data-picked="keyboard"`). A list the picked card may not enter has `data-refused`.
1305
- */
1306
- :where([data-slot='kanban-card'][data-picked='pointer']) {
1307
- opacity: 0.45;
1308
- }
1309
- :where([data-slot='kanban-card'][data-picked='pointer'] > [data-slot='kanban-card-body']) {
1310
- border-style: dashed;
1311
- box-shadow: none;
1312
- }
1313
- :where([data-slot='kanban-card'][data-picked='keyboard'] > [data-slot='kanban-card-body']) {
1314
- outline: 2px solid var(--primary);
1315
- outline-offset: 2px;
1316
- box-shadow: 0 10px 24px -12px color-mix(in oklab, var(--foreground) 45%, transparent);
1317
- }
1318
- :where([data-slot='kanban-card'][data-saving]) {
1319
- opacity: 0.7;
1320
- }
1321
- :where([data-slot='kanban-ghost']) {
1322
- cursor: grabbing;
1323
- list-style: none;
1324
- box-shadow: 0 18px 40px -16px color-mix(in oklab, var(--foreground) 55%, transparent);
1325
- }
1326
- :where([data-slot='kanban-dropzone'][data-refused]) {
1327
- background-color: color-mix(in oklab, var(--destructive) 8%, transparent);
1328
- outline: 1px dashed var(--destructive);
1329
- outline-offset: -1px;
1330
- }
1331
- :where(body[data-kanban-dragging]) {
1332
- cursor: grabbing;
1333
- user-select: none;
1334
- -webkit-user-select: none;
1335
- }
1336
- @media (prefers-reduced-motion: reduce) {
1337
- :where([data-slot='kanban-card'] > [data-slot='kanban-card-body']) {
1338
- transition: none;
1339
- }
1340
- }