@alfakit/vue 0.1.8 → 0.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/dist/app/components.d.ts.map +1 -1
- package/dist/app/components.js +1 -0
- package/dist/app/components.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 +1 -1
- package/dist/components/actions/ActionModal.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/dev-tools/DevToolsInspector.js.map +1 -1
- package/dist/components/dev-tools/DevToolsInspector.vue.d.ts.map +1 -1
- package/dist/components/dev-tools/DevToolsInspector.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/dev-tools/DevToolsInspector.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/CheckboxListField.js.map +1 -1
- package/dist/components/fields/CheckboxListField.vue.d.ts.map +1 -1
- package/dist/components/fields/CheckboxListField.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/fields/CheckboxListField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/DatePickerField.js.map +1 -1
- package/dist/components/fields/DatePickerField.vue.d.ts.map +1 -1
- package/dist/components/fields/DatePickerField.vue_vue_type_script_setup_true_lang.js +34 -32
- package/dist/components/fields/DatePickerField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/RichEditorSuggestions.js.map +1 -1
- package/dist/components/fields/RichEditorSuggestions.vue.d.ts +1 -1
- package/dist/components/fields/RichEditorSuggestions.vue.d.ts.map +1 -1
- package/dist/components/fields/RichEditorSuggestions.vue_vue_type_script_setup_true_lang.js +29 -23
- package/dist/components/fields/RichEditorSuggestions.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/RichEditorToolbarGroup.js.map +1 -1
- package/dist/components/fields/RichEditorToolbarGroup.vue.d.ts.map +1 -1
- package/dist/components/fields/RichEditorToolbarGroup.vue_vue_type_script_setup_true_lang.js +9 -4
- package/dist/components/fields/RichEditorToolbarGroup.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.d.ts.map +1 -1
- package/dist/components/file-manager/FileManagerView.vue_vue_type_script_setup_true_lang.js +5 -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 +79 -78
- package/dist/components/form/FormBlock.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/layout/CalloutComponent.js.map +1 -1
- package/dist/components/layout/CalloutComponent.vue.d.ts.map +1 -1
- package/dist/components/layout/CalloutComponent.vue_vue_type_script_setup_true_lang.js +43 -39
- package/dist/components/layout/CalloutComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/layout/EmptyStateComponent.js.map +1 -1
- package/dist/components/layout/EmptyStateComponent.vue.d.ts.map +1 -1
- package/dist/components/layout/EmptyStateComponent.vue_vue_type_script_setup_true_lang.js +29 -26
- package/dist/components/layout/EmptyStateComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/layout/MixedContent.js.map +1 -1
- package/dist/components/layout/MixedContent.vue.d.ts +5 -3
- package/dist/components/layout/MixedContent.vue.d.ts.map +1 -1
- package/dist/components/layout/MixedContent.vue_vue_type_script_setup_true_lang.js +5 -4
- package/dist/components/layout/MixedContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/layout/SectionComponent.js.map +1 -1
- package/dist/components/layout/SectionComponent.vue.d.ts.map +1 -1
- package/dist/components/layout/SectionComponent.vue_vue_type_script_setup_true_lang.js +12 -8
- package/dist/components/layout/SectionComponent.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 +133 -104
- package/dist/components/notifications/NotificationsMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/BottomNav.js.map +1 -1
- package/dist/components/panel/BottomNav.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/panel/BottomNav.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/KeyboardShortcuts.js.map +1 -1
- package/dist/components/panel/KeyboardShortcuts.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/panel/KeyboardShortcuts.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/NavGroup.js.map +1 -1
- package/dist/components/panel/NavGroup.vue_vue_type_script_setup_true_lang.js +3 -3
- package/dist/components/panel/NavGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/NavItem.js.map +1 -1
- package/dist/components/panel/NavItem.vue.d.ts.map +1 -1
- package/dist/components/panel/NavItem.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/panel/NavItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/NavSubItem.js.map +1 -1
- package/dist/components/panel/NavSubItem.vue.d.ts.map +1 -1
- package/dist/components/panel/NavSubItem.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/panel/NavSubItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/ShortcutsOverlay.js.map +1 -1
- package/dist/components/panel/ShortcutsOverlay.vue.d.ts.map +1 -1
- package/dist/components/panel/ShortcutsOverlay.vue_vue_type_script_setup_true_lang.js +20 -19
- package/dist/components/panel/ShortcutsOverlay.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/table/ColumnManager.js.map +1 -1
- package/dist/components/table/ColumnManager.vue.d.ts.map +1 -1
- package/dist/components/table/ColumnManager.vue_vue_type_script_setup_true_lang.js +6 -6
- package/dist/components/table/ColumnManager.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/table/Spreadsheet.js.map +1 -1
- package/dist/components/table/Spreadsheet.vue.d.ts.map +1 -1
- package/dist/components/table/Spreadsheet.vue_vue_type_script_setup_true_lang.js +37 -33
- package/dist/components/table/Spreadsheet.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/translation-manager/TranslationManagerView.js.map +1 -1
- package/dist/components/translation-manager/TranslationManagerView.vue.d.ts.map +1 -1
- package/dist/components/translation-manager/TranslationManagerView.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/translation-manager/TranslationManagerView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/ui/SidebarMenuButton.js.map +1 -1
- package/dist/components/ui/SidebarMenuButton.vue.d.ts.map +1 -1
- package/dist/components/ui/SidebarMenuButton.vue_vue_type_script_setup_true_lang.js +12 -12
- package/dist/components/ui/SidebarMenuButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/ui/TooltipTrigger.js.map +1 -1
- package/dist/components/ui/TooltipTrigger.vue.d.ts +2 -2
- package/dist/components/ui/TooltipTrigger.vue.d.ts.map +1 -1
- package/dist/components/ui/TooltipTrigger.vue_vue_type_script_setup_true_lang.js +10 -7
- package/dist/components/ui/TooltipTrigger.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/widgets/StatCard.js.map +1 -1
- package/dist/components/widgets/StatCard.vue.d.ts.map +1 -1
- package/dist/components/widgets/StatCard.vue_vue_type_script_setup_true_lang.js +30 -30
- package/dist/components/widgets/StatCard.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/eject-manifest.json +2 -2
- package/dist/layouts/TopNavLayout.js.map +1 -1
- package/dist/layouts/TopNavLayout.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/layouts/TopNavLayout.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/layouts/TopNavMenu.js.map +1 -1
- package/dist/layouts/TopNavMenu.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/layouts/TopNavMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/pages/AlfakitPage.js.map +1 -1
- package/dist/pages/AlfakitPage.vue.d.ts.map +1 -1
- package/dist/pages/AlfakitPage.vue_vue_type_script_setup_true_lang.js +16 -19
- package/dist/pages/AlfakitPage.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/standalone/AlfakitComponent.js.map +1 -1
- package/dist/standalone/AlfakitComponent.vue.d.ts.map +1 -1
- package/dist/standalone/AlfakitComponent.vue_vue_type_script_setup_true_lang.js +29 -24
- package/dist/standalone/AlfakitComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/standalone/runtime.d.ts.map +1 -1
- package/dist/standalone/runtime.js +25 -25
- package/dist/standalone/runtime.js.map +1 -1
- package/dist/standalone.css +12 -7
- package/dist/starter-kit/AlfakitStarterKitRoot.js.map +1 -1
- package/dist/starter-kit/AlfakitStarterKitRoot.vue.d.ts.map +1 -1
- package/dist/starter-kit/AlfakitStarterKitRoot.vue_vue_type_script_setup_true_lang.js +25 -21
- package/dist/starter-kit/AlfakitStarterKitRoot.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/starter-kit/navigation.d.ts +6 -1
- package/dist/starter-kit/navigation.d.ts.map +1 -1
- package/dist/starter-kit/navigation.js +11 -10
- package/dist/starter-kit/navigation.js.map +1 -1
- package/dist/styles.css +2 -1
- package/dist/themes.css +4 -0
- package/package.json +2 -2
- package/src/app/components.ts +3 -0
- package/src/components/actions/ActionModal.vue +2 -0
- package/src/components/dev-tools/DevToolsInspector.vue +1 -1
- package/src/components/fields/CheckboxListField.vue +2 -2
- package/src/components/fields/DatePickerField.vue +1 -0
- package/src/components/fields/RichEditorSuggestions.vue +13 -6
- package/src/components/fields/RichEditorToolbarGroup.vue +16 -1
- package/src/components/file-manager/FileManagerView.vue +3 -1
- package/src/components/form/FormBlock.vue +15 -2
- package/src/components/layout/CalloutComponent.vue +15 -2
- package/src/components/layout/EmptyStateComponent.vue +10 -1
- package/src/components/layout/MixedContent.vue +12 -4
- package/src/components/layout/SectionComponent.vue +20 -4
- package/src/components/notifications/NotificationsMenu.vue +45 -1
- package/src/components/panel/BottomNav.vue +2 -2
- package/src/components/panel/KeyboardShortcuts.vue +1 -1
- package/src/components/panel/NavGroup.vue +3 -3
- package/src/components/panel/NavItem.vue +5 -1
- package/src/components/panel/NavSubItem.vue +5 -1
- package/src/components/panel/ShortcutsOverlay.vue +27 -22
- package/src/components/table/ColumnManager.vue +6 -4
- package/src/components/table/Spreadsheet.vue +9 -4
- package/src/components/translation-manager/TranslationManagerView.vue +1 -1
- package/src/components/ui/SidebarMenuButton.vue +6 -0
- package/src/components/ui/TooltipTrigger.vue +4 -1
- package/src/components/widgets/StatCard.vue +6 -3
- package/src/layouts/TopNavLayout.vue +2 -2
- package/src/layouts/TopNavMenu.vue +1 -1
- package/src/pages/AlfakitPage.vue +13 -3
- package/src/standalone/AlfakitComponent.vue +16 -5
- package/src/standalone/runtime.ts +3 -0
- package/src/starter-kit/AlfakitStarterKitRoot.vue +7 -0
- package/src/starter-kit/navigation.ts +12 -1
- package/src/styles.css +2 -1
|
@@ -8,6 +8,10 @@ import TooltipContent from './TooltipContent.vue'
|
|
|
8
8
|
import TooltipTrigger from './TooltipTrigger.vue'
|
|
9
9
|
import { useSidebar } from './use-sidebar'
|
|
10
10
|
|
|
11
|
+
// Attributes from an `as-child` parent (CollapsibleTrigger's click handler and ARIA state,
|
|
12
|
+
// a nav item's extra attributes) go on the button, not on the renderless Tooltip root.
|
|
13
|
+
defineOptions({ inheritAttrs: false })
|
|
14
|
+
|
|
11
15
|
const props = withDefaults(
|
|
12
16
|
defineProps<
|
|
13
17
|
PrimitiveProps & {
|
|
@@ -27,6 +31,7 @@ const { isMobile, state } = useSidebar()
|
|
|
27
31
|
<Tooltip v-if="props.tooltip">
|
|
28
32
|
<TooltipTrigger as-child>
|
|
29
33
|
<Primitive
|
|
34
|
+
v-bind="$attrs"
|
|
30
35
|
data-slot="sidebar-menu-button"
|
|
31
36
|
data-sidebar="menu-button"
|
|
32
37
|
:data-size="props.size"
|
|
@@ -46,6 +51,7 @@ const { isMobile, state } = useSidebar()
|
|
|
46
51
|
</Tooltip>
|
|
47
52
|
<Primitive
|
|
48
53
|
v-else
|
|
54
|
+
v-bind="$attrs"
|
|
49
55
|
data-slot="sidebar-menu-button"
|
|
50
56
|
data-sidebar="menu-button"
|
|
51
57
|
:data-size="props.size"
|
|
@@ -5,7 +5,10 @@ const props = defineProps<TooltipTriggerProps>()
|
|
|
5
5
|
</script>
|
|
6
6
|
|
|
7
7
|
<template>
|
|
8
|
-
|
|
8
|
+
<!-- With as-child the child keeps its own data-slot (an action's `button`). -->
|
|
9
|
+
<TooltipTrigger
|
|
10
|
+
v-bind="{ ...(props.asChild ? {} : { 'data-slot': 'tooltip-trigger' }), ...props }"
|
|
11
|
+
>
|
|
9
12
|
<slot />
|
|
10
13
|
</TooltipTrigger>
|
|
11
14
|
</template>
|
|
@@ -39,7 +39,9 @@ const props = defineProps<{ stat: StatSchema }>()
|
|
|
39
39
|
>
|
|
40
40
|
<div class="flex items-start justify-between gap-3">
|
|
41
41
|
<div class="flex flex-col gap-1">
|
|
42
|
-
<span class="text-muted-foreground text-sm font-medium"
|
|
42
|
+
<span class="text-muted-foreground text-sm font-medium"
|
|
43
|
+
><bdi>{{ props.stat.label }}</bdi></span
|
|
44
|
+
>
|
|
43
45
|
<span
|
|
44
46
|
v-if="(props.stat.value === null || props.stat.value === '') && props.stat.placeholder"
|
|
45
47
|
class="text-muted-foreground text-2xl font-semibold tracking-tight"
|
|
@@ -54,7 +56,7 @@ const props = defineProps<{ stat: StatSchema }>()
|
|
|
54
56
|
props.stat.color && textColorClasses[props.stat.color],
|
|
55
57
|
)
|
|
56
58
|
"
|
|
57
|
-
>{{ props.stat.value }}</span
|
|
59
|
+
><bdi>{{ props.stat.value }}</bdi></span
|
|
58
60
|
>
|
|
59
61
|
<span
|
|
60
62
|
v-if="props.stat.description"
|
|
@@ -72,7 +74,8 @@ const props = defineProps<{ stat: StatSchema }>()
|
|
|
72
74
|
:name="props.stat.descriptionIcon"
|
|
73
75
|
class="size-3.5"
|
|
74
76
|
/>
|
|
75
|
-
|
|
77
|
+
<!-- Mixed-direction text (a Latin "-3% this month" in Arabic) keeps its order. -->
|
|
78
|
+
<bdi>{{ props.stat.description }}</bdi>
|
|
76
79
|
<Icon
|
|
77
80
|
v-if="props.stat.descriptionIcon && props.stat.descriptionIconPosition === 'after'"
|
|
78
81
|
:name="props.stat.descriptionIcon"
|
|
@@ -97,7 +97,7 @@ const linkClass =
|
|
|
97
97
|
</p>
|
|
98
98
|
<Link
|
|
99
99
|
v-for="item in group.items.flatMap((entry) => [entry, ...(entry.children ?? [])])"
|
|
100
|
-
:key="item.label"
|
|
100
|
+
:key="item.url ?? item.label"
|
|
101
101
|
:href="item.url ?? '#'"
|
|
102
102
|
:data-active="item.active ? 'true' : undefined"
|
|
103
103
|
class="hover:bg-accent data-[active=true]:bg-accent flex items-center gap-2 rounded-md px-2 py-2 font-medium [&_svg]:size-4"
|
|
@@ -133,7 +133,7 @@ const linkClass =
|
|
|
133
133
|
:items="group.items"
|
|
134
134
|
:active="group.items.some(isActive)"
|
|
135
135
|
/>
|
|
136
|
-
<template v-for="item in group.items" v-else :key="item.label">
|
|
136
|
+
<template v-for="item in group.items" v-else :key="item.url ?? item.label">
|
|
137
137
|
<TopNavMenu
|
|
138
138
|
v-if="item.children && item.children.length > 0"
|
|
139
139
|
:label="item.label"
|
|
@@ -36,7 +36,7 @@ const props = defineProps<{
|
|
|
36
36
|
<ChevronDownIcon class="opacity-60" />
|
|
37
37
|
</DropdownMenuTrigger>
|
|
38
38
|
<DropdownMenuContent align="start" class="min-w-48">
|
|
39
|
-
<DropdownMenuItem v-for="item in props.items" :key="item.label" as-child>
|
|
39
|
+
<DropdownMenuItem v-for="item in props.items" :key="item.url ?? item.label" as-child>
|
|
40
40
|
<Link
|
|
41
41
|
v-bind="item.extraAttributes ?? {}"
|
|
42
42
|
:href="item.url ?? '#'"
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
customPageProps,
|
|
4
|
+
openDefaultAction,
|
|
5
|
+
resolveLazyComponents,
|
|
6
|
+
type DefaultActionOpener,
|
|
7
|
+
} from '@alfakit/core'
|
|
3
8
|
import { Head } from '@inertiajs/vue3'
|
|
4
9
|
import { computed, onMounted, watch } from 'vue'
|
|
5
10
|
import { providePageActionContext } from '../components/actions/action-context'
|
|
@@ -28,6 +33,11 @@ const title = computed(() =>
|
|
|
28
33
|
: panel.value.brandName,
|
|
29
34
|
)
|
|
30
35
|
const custom = computed(() => (page.value?.view ? pages[page.value.view.component] : undefined))
|
|
36
|
+
// A custom component brings its own `PageShell` (as in panel mode, where it is the Inertia
|
|
37
|
+
// page itself) and takes the live props, so `reloadProps()` reaches it.
|
|
38
|
+
const customProps = computed(() =>
|
|
39
|
+
customPageProps(page.value?.view?.props, props.value as Record<string, unknown>),
|
|
40
|
+
)
|
|
31
41
|
|
|
32
42
|
// The page's default action (`$defaultAction`, `?tableAction=`) opens once the page has
|
|
33
43
|
// hydrated, and once per page: re-renders after the action ran don't open it again.
|
|
@@ -61,9 +71,9 @@ providePageActionContext({
|
|
|
61
71
|
)
|
|
62
72
|
}}
|
|
63
73
|
</div>
|
|
74
|
+
<component :is="custom" v-else-if="page.view && custom" v-bind="customProps" :page="page" />
|
|
64
75
|
<PageShell v-else :page="page">
|
|
65
|
-
<
|
|
66
|
-
<PageContent v-else :page="page" />
|
|
76
|
+
<PageContent :page="page" />
|
|
67
77
|
</PageShell>
|
|
68
78
|
</template>
|
|
69
79
|
</template>
|
|
@@ -69,9 +69,16 @@ const poll = (target: string, interval: string | number | null | undefined) =>
|
|
|
69
69
|
state.poll(target, interval)
|
|
70
70
|
const refresh = (targets: string[]) => state.refresh(targets)
|
|
71
71
|
|
|
72
|
+
// Inside a panel page: the panel's registry and translator, but this component's own action
|
|
73
|
+
// runner, so its actions post to its own endpoints with its own token (not the panel's: 403).
|
|
72
74
|
const context: AlfakitContextValue = parent
|
|
73
75
|
? {
|
|
74
76
|
...parent,
|
|
77
|
+
actions: createStandaloneContext(
|
|
78
|
+
{ action: props.component.endpoints.action, modal: props.component.endpoints.modal },
|
|
79
|
+
props.components,
|
|
80
|
+
poll,
|
|
81
|
+
).actions,
|
|
75
82
|
registry: createStandaloneRegistry(props.components, parent.registry),
|
|
76
83
|
poll,
|
|
77
84
|
refresh,
|
|
@@ -123,15 +130,19 @@ watch(
|
|
|
123
130
|
// on the page renders one (checked after every component mounted).
|
|
124
131
|
const ownsToaster = ref(false)
|
|
125
132
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
133
|
+
// Partial reloads (sorting, paging, inline edits) request this component's own prop.
|
|
134
|
+
// Registered in setup (browser only), before the children's `onMounted`: a `deferLoading()`
|
|
135
|
+
// table's first reload must already ask for this prop, not the panel `page` prop.
|
|
136
|
+
if (typeof window !== 'undefined') {
|
|
130
137
|
watch(
|
|
131
138
|
() => findStandalonePropName(inertiaPage.props as Record<string, unknown>, props.component),
|
|
132
139
|
(name, _old, onCleanup) => onCleanup(registerStandaloneProp(name ?? null)),
|
|
133
140
|
{ immediate: true },
|
|
134
141
|
)
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
onMounted(() => {
|
|
145
|
+
ensureStandaloneRuntime()
|
|
135
146
|
|
|
136
147
|
// The watcher runs before the new payload renders: hand it over, or the response would
|
|
137
148
|
// count as stale and lazy widgets (a calendar after its action) keep their old schema.
|
|
@@ -201,7 +212,7 @@ onMounted(() => {
|
|
|
201
212
|
<slot name="footer" />
|
|
202
213
|
</div>
|
|
203
214
|
<ActionModals />
|
|
204
|
-
<AlfakitToaster v-if="ownsToaster" claimed />
|
|
215
|
+
<AlfakitToaster v-if="ownsToaster" claimed :dir="direction" />
|
|
205
216
|
</TooltipProvider>
|
|
206
217
|
</component>
|
|
207
218
|
</template>
|
|
@@ -3,6 +3,7 @@ import {
|
|
|
3
3
|
ComponentRegistry,
|
|
4
4
|
FlashNotificationTracker,
|
|
5
5
|
Translator,
|
|
6
|
+
installPrefetchInvalidation,
|
|
6
7
|
reloadOnExpiredPage,
|
|
7
8
|
resolveRequestErrorNotification,
|
|
8
9
|
type NotificationSchema,
|
|
@@ -27,6 +28,8 @@ export function ensureStandaloneRuntime(): void {
|
|
|
27
28
|
|
|
28
29
|
browserReady = true
|
|
29
30
|
reloadOnExpiredPage()
|
|
31
|
+
// Pages restored by Back after a change are reloaded; shared with a surrounding panel.
|
|
32
|
+
installPrefetchInvalidation()
|
|
30
33
|
}
|
|
31
34
|
|
|
32
35
|
/**
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
import { usePage } from '@inertiajs/vue3'
|
|
9
9
|
import { onMounted, onUnmounted, watch } from 'vue'
|
|
10
10
|
import AlfakitRoot from '../AlfakitRoot.vue'
|
|
11
|
+
import DebugPanelSlot from '../components/panel/DebugPanelSlot.vue'
|
|
11
12
|
import { setToasterId, showToast } from '../components/notifications/flash-toasts'
|
|
12
13
|
import { provideAlfakit } from '../context'
|
|
13
14
|
import { starterKitContext, type StarterKitPageOptions } from './runtime'
|
|
@@ -66,6 +67,12 @@ onUnmounted(() => {
|
|
|
66
67
|
>
|
|
67
68
|
<AlfakitRoot :toaster-id="STARTER_KIT_TOASTER_ID">
|
|
68
69
|
<slot />
|
|
70
|
+
<!-- The debug panel's button lives in AlfaKit's top bar, which a starter kit doesn't
|
|
71
|
+
render: float it in the corner (nothing without `alfakitDebug`). The corner is the
|
|
72
|
+
document's right: the kit's sidebar stays on the left in a right-to-left panel language. -->
|
|
73
|
+
<div data-slot="starter-kit-debug-panel" class="fixed right-16 bottom-16 z-40">
|
|
74
|
+
<DebugPanelSlot />
|
|
75
|
+
</div>
|
|
69
76
|
</AlfakitRoot>
|
|
70
77
|
</div>
|
|
71
78
|
</template>
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
starterKitNavigation,
|
|
3
3
|
toStarterKitNavGroups,
|
|
4
|
+
toStarterKitUserMenuItems,
|
|
4
5
|
type StarterKitNavGroup,
|
|
5
6
|
type StarterKitNavigationSchema,
|
|
7
|
+
type StarterKitUserMenuItem,
|
|
6
8
|
} from '@alfakit/core'
|
|
7
9
|
import { usePage } from '@inertiajs/vue3'
|
|
8
10
|
import { computed, type ComputedRef } from 'vue'
|
|
@@ -15,6 +17,11 @@ export interface AlfakitNavigation {
|
|
|
15
17
|
navigation: StarterKitNavigationSchema | null
|
|
16
18
|
/** Its groups as plain items (`title`, `href`, `icon`, `isActive`, `badge`, `children`). */
|
|
17
19
|
groups: StarterKitNavGroup[]
|
|
20
|
+
/**
|
|
21
|
+
* The panel's user menu links (`userMenuItems()`, Billing's entry…) for the kit's user
|
|
22
|
+
* menu: `<AlfakitUserMenuItems />` renders them with the app's dropdown items.
|
|
23
|
+
*/
|
|
24
|
+
userMenuItems: StarterKitUserMenuItem[]
|
|
18
25
|
}
|
|
19
26
|
|
|
20
27
|
/**
|
|
@@ -33,6 +40,10 @@ export function useAlfakitNavigation(panelId?: string): ComputedRef<AlfakitNavig
|
|
|
33
40
|
return computed(() => {
|
|
34
41
|
const navigation = starterKitNavigation(page.props, panelId)
|
|
35
42
|
|
|
36
|
-
return {
|
|
43
|
+
return {
|
|
44
|
+
navigation,
|
|
45
|
+
groups: toStarterKitNavGroups(navigation?.groups),
|
|
46
|
+
userMenuItems: toStarterKitUserMenuItems(navigation?.userMenu),
|
|
47
|
+
}
|
|
37
48
|
})
|
|
38
49
|
}
|
package/src/styles.css
CHANGED
|
@@ -289,7 +289,8 @@
|
|
|
289
289
|
}
|
|
290
290
|
/* Rich editor mentions, merge tags and custom blocks (RichEditor extensions) */
|
|
291
291
|
.alfakit-prose :where(.alfakit-mention):not(:where(.alfakit-not-prose *)) {
|
|
292
|
-
|
|
292
|
+
/* Full-contrast text on the tint (WCAG AA); the ring marks it as a mention. */
|
|
293
|
+
@apply bg-primary/10 text-foreground ring-primary/30 rounded px-1 font-medium ring-1;
|
|
293
294
|
}
|
|
294
295
|
.alfakit-prose :where(.alfakit-merge-tag):not(:where(.alfakit-not-prose *)) {
|
|
295
296
|
@apply bg-muted text-muted-foreground rounded px-1 font-mono text-xs;
|