@alfakit/vue 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/dist/components/actions/ActionButton.js.map +1 -1
- package/dist/components/actions/ActionButton.vue.d.ts.map +1 -1
- package/dist/components/actions/ActionButton.vue_vue_type_script_setup_true_lang.js +160 -159
- package/dist/components/actions/ActionButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/actions/ActionModal.js.map +1 -1
- package/dist/components/actions/ActionModal.vue.d.ts.map +1 -1
- package/dist/components/actions/ActionModal.vue_vue_type_script_setup_true_lang.js +214 -214
- package/dist/components/actions/ActionModal.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/ColorPickerField.js.map +1 -1
- package/dist/components/fields/ColorPickerField.vue.d.ts.map +1 -1
- package/dist/components/fields/ColorPickerField.vue_vue_type_script_setup_true_lang.js +1 -0
- package/dist/components/fields/ColorPickerField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/ComboboxSelect.js.map +1 -1
- package/dist/components/fields/ComboboxSelect.vue.d.ts.map +1 -1
- package/dist/components/fields/ComboboxSelect.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/fields/ComboboxSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/FileUploadField.js.map +1 -1
- package/dist/components/fields/FileUploadField.vue.d.ts.map +1 -1
- package/dist/components/fields/FileUploadField.vue_vue_type_script_setup_true_lang.js +183 -183
- package/dist/components/fields/FileUploadField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/OneTimeCodeInputField.js.map +1 -1
- package/dist/components/fields/OneTimeCodeInputField.vue_vue_type_script_setup_true_lang.js +1 -2
- package/dist/components/fields/OneTimeCodeInputField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/SelectField.js.map +1 -1
- package/dist/components/fields/SelectField.vue.d.ts.map +1 -1
- package/dist/components/fields/SelectField.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/fields/SelectField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/TableColumnHeaders.js.map +1 -1
- package/dist/components/fields/TableColumnHeaders.vue.d.ts.map +1 -1
- package/dist/components/fields/TableColumnHeaders.vue_vue_type_script_setup_true_lang.js +6 -3
- package/dist/components/fields/TableColumnHeaders.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/file-manager/FileManagerView.js.map +1 -1
- package/dist/components/file-manager/FileManagerView.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/file-manager/FileManagerView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/form/FormBlock.js.map +1 -1
- package/dist/components/form/FormBlock.vue.d.ts.map +1 -1
- package/dist/components/form/FormBlock.vue_vue_type_script_setup_true_lang.js +81 -77
- package/dist/components/form/FormBlock.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/form/form-context.js +25 -25
- package/dist/components/form/form-context.js.map +1 -1
- package/dist/components/layout/FusedGroupComponent.js.map +1 -1
- package/dist/components/layout/FusedGroupComponent.vue.d.ts.map +1 -1
- package/dist/components/layout/FusedGroupComponent.vue_vue_type_script_setup_true_lang.js +1 -0
- package/dist/components/layout/FusedGroupComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/layout/TabsComponent.js.map +1 -1
- package/dist/components/layout/TabsComponent.vue.d.ts.map +1 -1
- package/dist/components/layout/TabsComponent.vue_vue_type_script_setup_true_lang.js +76 -55
- package/dist/components/layout/TabsComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/notifications/NotificationsMenu.js.map +1 -1
- package/dist/components/notifications/NotificationsMenu.vue.d.ts.map +1 -1
- package/dist/components/notifications/NotificationsMenu.vue_vue_type_script_setup_true_lang.js +44 -42
- package/dist/components/notifications/NotificationsMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/GlobalSearch.js.map +1 -1
- package/dist/components/panel/GlobalSearch.vue.d.ts.map +1 -1
- package/dist/components/panel/GlobalSearch.vue_vue_type_script_setup_true_lang.js +1 -0
- package/dist/components/panel/GlobalSearch.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/ShortcutKeys.js.map +1 -1
- package/dist/components/panel/ShortcutKeys.vue.d.ts.map +1 -1
- package/dist/components/panel/ShortcutKeys.vue_vue_type_script_setup_true_lang.js +4 -1
- package/dist/components/panel/ShortcutKeys.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/TenantMenu.js.map +1 -1
- package/dist/components/panel/TenantMenu.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/panel/TenantMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/table/GroupHeaderRow.js.map +1 -1
- package/dist/components/table/GroupHeaderRow.vue.d.ts.map +1 -1
- package/dist/components/table/GroupHeaderRow.vue_vue_type_script_setup_true_lang.js +55 -34
- package/dist/components/table/GroupHeaderRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/table/SelectCell.js.map +1 -1
- package/dist/components/table/SelectCell.vue.d.ts.map +1 -1
- package/dist/components/table/SelectCell.vue_vue_type_script_setup_true_lang.js +24 -19
- package/dist/components/table/SelectCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/table/TextInputCell.js.map +1 -1
- package/dist/components/table/TextInputCell.vue.d.ts.map +1 -1
- package/dist/components/table/TextInputCell.vue_vue_type_script_setup_true_lang.js +38 -33
- package/dist/components/table/TextInputCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components.css +347 -0
- package/dist/eject-manifest.json +2 -2
- package/dist/standalone/AlfakitToaster.js.map +1 -1
- package/dist/standalone/AlfakitToaster.vue.d.ts.map +1 -1
- package/dist/standalone/AlfakitToaster.vue_vue_type_script_setup_true_lang.js +23 -15
- package/dist/standalone/AlfakitToaster.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/standalone.css +47 -0
- package/dist/starter-kit/widgets/SearchTrigger.js.map +1 -1
- package/dist/starter-kit/widgets/SearchTrigger.vue.d.ts.map +1 -1
- package/dist/starter-kit/widgets/SearchTrigger.vue_vue_type_script_setup_true_lang.js +1 -0
- package/dist/starter-kit/widgets/SearchTrigger.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/starter-kit/widgets/TenantChooser.js.map +1 -1
- package/dist/starter-kit/widgets/TenantChooser.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/starter-kit/widgets/TenantChooser.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/themes.css +2 -334
- package/package.json +3 -3
- package/src/components/actions/ActionButton.vue +14 -6
- package/src/components/actions/ActionModal.vue +3 -1
- package/src/components/fields/ColorPickerField.vue +1 -0
- package/src/components/fields/ComboboxSelect.vue +1 -1
- package/src/components/fields/FileUploadField.vue +14 -11
- package/src/components/fields/OneTimeCodeInputField.vue +1 -1
- package/src/components/fields/SelectField.vue +4 -2
- package/src/components/fields/TableColumnHeaders.vue +6 -1
- package/src/components/file-manager/FileManagerView.vue +1 -1
- package/src/components/form/FormBlock.vue +24 -0
- package/src/components/form/form-context.ts +2 -2
- package/src/components/layout/FusedGroupComponent.vue +1 -0
- package/src/components/layout/TabsComponent.vue +61 -5
- package/src/components/notifications/NotificationsMenu.vue +11 -0
- package/src/components/panel/GlobalSearch.vue +1 -0
- package/src/components/panel/ShortcutKeys.vue +1 -0
- package/src/components/panel/TenantMenu.vue +2 -2
- package/src/components/table/GroupHeaderRow.vue +27 -0
- package/src/components/table/SelectCell.vue +5 -2
- package/src/components/table/TextInputCell.vue +11 -5
- package/src/standalone/AlfakitToaster.vue +12 -2
- package/src/starter-kit/widgets/SearchTrigger.vue +1 -0
- package/src/starter-kit/widgets/TenantChooser.vue +1 -1
package/dist/eject-manifest.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"package": "@alfakit/vue",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"adapter": "vue",
|
|
5
|
-
"generatedAt": "2026-10-
|
|
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":"
|
|
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 {
|
|
3
|
-
import i from "
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
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
|
|
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(
|
|
22
|
-
let
|
|
22
|
+
setup(u) {
|
|
23
|
+
let h = u, g = e() ?? r({
|
|
23
24
|
action: "",
|
|
24
25
|
modal: ""
|
|
25
|
-
}, void 0, void 0),
|
|
26
|
-
return
|
|
27
|
-
|
|
28
|
-
}),
|
|
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
|
-
|
|
31
|
-
|
|
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, [
|
|
38
|
+
}, null, 8, [
|
|
39
|
+
"id",
|
|
40
|
+
"position",
|
|
41
|
+
"dir"
|
|
42
|
+
])) : l("", !0);
|
|
35
43
|
}
|
|
36
44
|
});
|
|
37
45
|
//#endregion
|
|
38
|
-
export {
|
|
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":"
|
|
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"}
|
package/dist/standalone.css
CHANGED
|
@@ -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":"
|
|
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":"
|
|
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,
|
|
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
|
-
}
|