@revenexx/studio-shared 0.3.3 → 0.4.1
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/dist/module.d.mts +7 -3
- package/dist/module.json +2 -2
- package/dist/module.mjs +10 -4
- package/dist/runtime/components/Dashboard/DashboardConfirmDialog.d.vue.ts +2 -1
- package/dist/runtime/components/Dashboard/DashboardConfirmDialog.vue +1 -1
- package/dist/runtime/components/Dashboard/DashboardConfirmDialog.vue.d.ts +2 -1
- package/dist/runtime/components/Dashboard/DashboardControls.d.vue.ts +8 -7
- package/dist/runtime/components/Dashboard/DashboardControls.vue.d.ts +8 -7
- package/dist/runtime/components/Dashboard/DashboardGrid.d.vue.ts +2 -1
- package/dist/runtime/components/Dashboard/DashboardGrid.vue +45 -1
- package/dist/runtime/components/Dashboard/DashboardGrid.vue.d.ts +2 -1
- package/dist/runtime/components/Dashboard/DashboardNameDialog.d.vue.ts +2 -1
- package/dist/runtime/components/Dashboard/DashboardNameDialog.vue +1 -1
- package/dist/runtime/components/Dashboard/DashboardNameDialog.vue.d.ts +2 -1
- package/dist/runtime/components/Dashboard/DashboardPickerDialog.d.vue.ts +2 -1
- package/dist/runtime/components/Dashboard/DashboardPickerDialog.vue +1 -1
- package/dist/runtime/components/Dashboard/DashboardPickerDialog.vue.d.ts +2 -1
- package/dist/runtime/components/Dashboard/DashboardShareDialog.d.vue.ts +2 -1
- package/dist/runtime/components/Dashboard/DashboardShareDialog.vue +1 -1
- package/dist/runtime/components/Dashboard/DashboardShareDialog.vue.d.ts +2 -1
- package/dist/runtime/components/Dashboard/DashboardTopBar.d.vue.ts +9 -4
- package/dist/runtime/components/Dashboard/DashboardTopBar.vue.d.ts +9 -4
- package/dist/runtime/components/Dashboard/DashboardWidgetConfigDialog.d.vue.ts +8 -6
- package/dist/runtime/components/Dashboard/DashboardWidgetConfigDialog.vue +1 -1
- package/dist/runtime/components/Dashboard/DashboardWidgetConfigDialog.vue.d.ts +8 -6
- package/dist/runtime/components/Dashboard/DashboardWidgetFrame.d.vue.ts +5 -4
- package/dist/runtime/components/Dashboard/DashboardWidgetFrame.vue +14 -3
- package/dist/runtime/components/Dashboard/DashboardWidgetFrame.vue.d.ts +5 -4
- package/dist/runtime/components/Dashboard/DashboardWidgetHost.d.vue.ts +2 -1
- package/dist/runtime/components/Dashboard/DashboardWidgetHost.vue.d.ts +2 -1
- package/dist/runtime/components/Dashboard/DashboardWidgetIcon.d.vue.ts +2 -1
- package/dist/runtime/components/Dashboard/DashboardWidgetIcon.vue.d.ts +2 -1
- package/dist/runtime/components/Dashboard/DashboardWidgetLibrary.d.vue.ts +2 -1
- package/dist/runtime/components/Dashboard/DashboardWidgetLibrary.vue.d.ts +2 -1
- package/dist/runtime/components/Dashboard/DashboardWidgetPreview.d.vue.ts +2 -1
- package/dist/runtime/components/Dashboard/DashboardWidgetPreview.vue.d.ts +2 -1
- package/dist/runtime/components/DataTable/ColumnsMenu.d.vue.ts +2 -1
- package/dist/runtime/components/DataTable/ColumnsMenu.vue.d.ts +2 -1
- package/dist/runtime/components/DataTable/DataTable.d.vue.ts +120 -37
- package/dist/runtime/components/DataTable/DataTable.vue +493 -53
- package/dist/runtime/components/DataTable/DataTable.vue.d.ts +120 -37
- package/dist/runtime/components/DataTable/FacetChips.d.vue.ts +2 -1
- package/dist/runtime/components/DataTable/FacetChips.vue.d.ts +2 -1
- package/dist/runtime/components/DataTable/FacetPanel.d.vue.ts +6 -5
- package/dist/runtime/components/DataTable/FacetPanel.vue +57 -8
- package/dist/runtime/components/DataTable/FacetPanel.vue.d.ts +6 -5
- package/dist/runtime/components/DataTable/FilterMenu.d.vue.ts +6 -5
- package/dist/runtime/components/DataTable/FilterMenu.vue +5 -5
- package/dist/runtime/components/DataTable/FilterMenu.vue.d.ts +6 -5
- package/dist/runtime/components/DataTable/SavedViewsMenu.d.vue.ts +2 -1
- package/dist/runtime/components/DataTable/SavedViewsMenu.vue +61 -12
- package/dist/runtime/components/DataTable/SavedViewsMenu.vue.d.ts +2 -1
- package/dist/runtime/components/DataTable/SortMenu.d.vue.ts +4 -2
- package/dist/runtime/components/DataTable/SortMenu.vue +4 -1
- package/dist/runtime/components/DataTable/SortMenu.vue.d.ts +4 -2
- package/dist/runtime/components/DataTable/ToolbarLabelTrigger.d.vue.ts +23 -0
- package/dist/runtime/components/DataTable/ToolbarLabelTrigger.vue +29 -0
- package/dist/runtime/components/DataTable/ToolbarLabelTrigger.vue.d.ts +23 -0
- package/dist/runtime/components/DataTable/ViewModeSwitch.d.vue.ts +4 -2
- package/dist/runtime/components/DataTable/ViewModeSwitch.vue.d.ts +4 -2
- package/dist/runtime/components/DataTable/types.d.ts +17 -0
- package/dist/runtime/components/Form/FieldCell.d.vue.ts +32 -0
- package/dist/runtime/components/Form/FieldCell.vue +46 -0
- package/dist/runtime/components/Form/FieldCell.vue.d.ts +32 -0
- package/dist/runtime/components/Form/FieldGrid.d.vue.ts +13 -0
- package/dist/runtime/components/Form/FieldGrid.vue +11 -0
- package/dist/runtime/components/Form/FieldGrid.vue.d.ts +13 -0
- package/dist/runtime/components/Form/FormContextCard.d.vue.ts +33 -0
- package/dist/runtime/components/Form/FormContextCard.vue +56 -0
- package/dist/runtime/components/Form/FormContextCard.vue.d.ts +33 -0
- package/dist/runtime/components/Form/FormLayout.d.vue.ts +47 -0
- package/dist/runtime/components/Form/FormLayout.vue +169 -0
- package/dist/runtime/components/Form/FormLayout.vue.d.ts +47 -0
- package/dist/runtime/components/Form/FormSection.d.vue.ts +25 -0
- package/dist/runtime/components/Form/FormSection.vue +48 -0
- package/dist/runtime/components/Form/FormSection.vue.d.ts +25 -0
- package/dist/runtime/components/Form/SaveBar.d.vue.ts +44 -0
- package/dist/runtime/components/Form/SaveBar.vue +71 -0
- package/dist/runtime/components/Form/SaveBar.vue.d.ts +44 -0
- package/dist/runtime/components/Media/MediaFolderTree.d.vue.ts +6 -5
- package/dist/runtime/components/Media/MediaFolderTree.vue +1 -2
- package/dist/runtime/components/Media/MediaFolderTree.vue.d.ts +6 -5
- package/dist/runtime/components/Media/MediaPickerDialog.d.vue.ts +13 -1
- package/dist/runtime/components/Media/MediaPickerDialog.vue +206 -54
- package/dist/runtime/components/Media/MediaPickerDialog.vue.d.ts +13 -1
- package/dist/runtime/components/Media/MediaUploader.d.vue.ts +2 -1
- package/dist/runtime/components/Media/MediaUploader.vue +1 -1
- package/dist/runtime/components/Media/MediaUploader.vue.d.ts +2 -1
- package/dist/runtime/components/Shared/AppIcon.d.vue.ts +21 -0
- package/dist/runtime/components/Shared/AppIcon.vue +47 -0
- package/dist/runtime/components/Shared/AppIcon.vue.d.ts +21 -0
- package/dist/runtime/components/Shared/BuildLogsFlyout.d.vue.ts +2 -1
- package/dist/runtime/components/Shared/BuildLogsFlyout.vue.d.ts +2 -1
- package/dist/runtime/components/Shared/CardSizeToggle.d.vue.ts +11 -0
- package/dist/runtime/components/Shared/CardSizeToggle.vue +19 -0
- package/dist/runtime/components/Shared/CardSizeToggle.vue.d.ts +11 -0
- package/dist/runtime/components/Shared/DetailSheet.d.vue.ts +60 -0
- package/dist/runtime/components/Shared/DetailSheet.vue +211 -0
- package/dist/runtime/components/Shared/DetailSheet.vue.d.ts +60 -0
- package/dist/runtime/components/Shared/EmptyNote.d.vue.ts +19 -0
- package/dist/runtime/components/Shared/EmptyNote.vue +25 -0
- package/dist/runtime/components/Shared/EmptyNote.vue.d.ts +19 -0
- package/dist/runtime/components/Shared/FloatingPanel.d.vue.ts +7 -6
- package/dist/runtime/components/Shared/FloatingPanel.vue.d.ts +7 -6
- package/dist/runtime/components/Shared/GitDeploymentSettings.d.vue.ts +2 -1
- package/dist/runtime/components/Shared/GitDeploymentSettings.vue.d.ts +2 -1
- package/dist/runtime/components/Shared/KpiTile.d.vue.ts +8 -1
- package/dist/runtime/components/Shared/KpiTile.vue +10 -9
- package/dist/runtime/components/Shared/KpiTile.vue.d.ts +8 -1
- package/dist/runtime/components/Shared/ListSurface.d.vue.ts +3 -2
- package/dist/runtime/components/Shared/ListSurface.vue.d.ts +3 -2
- package/dist/runtime/components/Shared/PageHeader.d.vue.ts +7 -6
- package/dist/runtime/components/Shared/PageHeader.vue +15 -4
- package/dist/runtime/components/Shared/PageHeader.vue.d.ts +7 -6
- package/dist/runtime/components/Shared/RecordLayout.d.vue.ts +8 -7
- package/dist/runtime/components/Shared/RecordLayout.vue +1 -2
- package/dist/runtime/components/Shared/RecordLayout.vue.d.ts +8 -7
- package/dist/runtime/components/Shared/RecordRailCard.d.vue.ts +3 -2
- package/dist/runtime/components/Shared/RecordRailCard.vue +3 -3
- package/dist/runtime/components/Shared/RecordRailCard.vue.d.ts +3 -2
- package/dist/runtime/components/Shared/SelectionBar.d.vue.ts +22 -0
- package/dist/runtime/components/Shared/SelectionBar.vue +40 -0
- package/dist/runtime/components/Shared/SelectionBar.vue.d.ts +22 -0
- package/dist/runtime/components/Shared/SidebarNav.d.vue.ts +39 -4
- package/dist/runtime/components/Shared/SidebarNav.vue +71 -25
- package/dist/runtime/components/Shared/SidebarNav.vue.d.ts +39 -4
- package/dist/runtime/components/Shared/SidebarNavAreas.d.vue.ts +7 -0
- package/dist/runtime/components/Shared/SidebarNavAreas.vue +291 -0
- package/dist/runtime/components/Shared/SidebarNavAreas.vue.d.ts +7 -0
- package/dist/runtime/components/Shared/SidebarNavLink.d.vue.ts +3 -10
- package/dist/runtime/components/Shared/SidebarNavLink.vue +31 -5
- package/dist/runtime/components/Shared/SidebarNavLink.vue.d.ts +3 -10
- package/dist/runtime/components/Shared/SortHeader.d.vue.ts +3 -2
- package/dist/runtime/components/Shared/SortHeader.vue +6 -2
- package/dist/runtime/components/Shared/SortHeader.vue.d.ts +3 -2
- package/dist/runtime/components/Shared/StateCard.d.vue.ts +6 -5
- package/dist/runtime/components/Shared/StateCard.vue +1 -1
- package/dist/runtime/components/Shared/StateCard.vue.d.ts +6 -5
- package/dist/runtime/components/Shared/StudioCard.d.vue.ts +5 -4
- package/dist/runtime/components/Shared/StudioCard.vue.d.ts +5 -4
- package/dist/runtime/components/Shared/TabBar.d.vue.ts +4 -21
- package/dist/runtime/components/Shared/TabBar.vue +30 -13
- package/dist/runtime/components/Shared/TabBar.vue.d.ts +4 -21
- package/dist/runtime/components/Shared/ViewTab.d.vue.ts +2 -1
- package/dist/runtime/components/Shared/ViewTab.vue.d.ts +2 -1
- package/dist/runtime/components/Shared/Wizard.d.vue.ts +20 -7
- package/dist/runtime/components/Shared/Wizard.vue +9 -5
- package/dist/runtime/components/Shared/Wizard.vue.d.ts +20 -7
- package/dist/runtime/composables/useDetailSheet.d.ts +20 -0
- package/dist/runtime/composables/useDetailSheet.js +50 -0
- package/dist/runtime/composables/useMediaLibrary.d.ts +12 -0
- package/dist/runtime/composables/usePlatformTenant.d.ts +6 -0
- package/dist/runtime/composables/useSavedViews.d.ts +11 -1
- package/dist/runtime/composables/useSavedViews.js +4 -4
- package/dist/runtime/composables/useWidgetFigures.d.ts +12 -0
- package/dist/runtime/composables/useWidgetFigures.js +24 -0
- package/dist/runtime/composables/useWidgetHeader.d.ts +15 -0
- package/dist/runtime/composables/useWidgetHeader.js +15 -0
- package/dist/runtime/lib/activeTenant.d.ts +58 -0
- package/dist/runtime/lib/activeTenant.js +45 -0
- package/dist/runtime/lib/appIcon.d.ts +48 -0
- package/dist/runtime/lib/appIcon.js +27 -0
- package/dist/runtime/lib/auditEnvelope.d.ts +43 -0
- package/dist/runtime/lib/auditEnvelope.js +55 -0
- package/dist/runtime/lib/cardSize.d.ts +13 -0
- package/dist/runtime/lib/cardSize.js +20 -0
- package/dist/runtime/lib/dashboardIcons.js +2 -0
- package/dist/runtime/lib/dataTableFilters.d.ts +22 -0
- package/dist/runtime/lib/dataTableFilters.js +5 -0
- package/dist/runtime/lib/detailSheet.d.ts +43 -0
- package/dist/runtime/lib/detailSheet.js +34 -0
- package/dist/runtime/lib/facets.d.ts +13 -0
- package/dist/runtime/lib/formLayout.d.ts +164 -0
- package/dist/runtime/lib/formLayout.js +117 -0
- package/dist/runtime/lib/formLayoutContext.d.ts +26 -0
- package/dist/runtime/lib/formLayoutContext.js +1 -0
- package/dist/runtime/lib/gridTracks.d.ts +14 -1
- package/dist/runtime/lib/gridTracks.js +13 -2
- package/dist/runtime/lib/isoLists.d.ts +37 -2
- package/dist/runtime/lib/isoLists.js +54 -1
- package/dist/runtime/lib/notice.d.ts +14 -0
- package/dist/runtime/lib/notice.js +19 -0
- package/dist/runtime/lib/pageSize.d.ts +15 -0
- package/dist/runtime/lib/pageSize.js +26 -0
- package/dist/runtime/lib/rowMove.d.ts +38 -0
- package/dist/runtime/lib/rowMove.js +20 -0
- package/dist/runtime/lib/sidebarAreas.d.ts +46 -0
- package/dist/runtime/lib/sidebarAreas.js +25 -0
- package/dist/runtime/lib/sidebarNav.d.ts +21 -2
- package/dist/runtime/lib/sidebarNav.js +23 -4
- package/dist/runtime/lib/solarIconMap.d.ts +16 -0
- package/dist/runtime/lib/solarIconMap.js +326 -0
- package/dist/runtime/lib/solarIcons.d.ts +37 -0
- package/dist/runtime/lib/solarIcons.js +25 -0
- package/dist/runtime/lib/swipeToClose.d.ts +25 -0
- package/dist/runtime/lib/swipeToClose.js +118 -0
- package/dist/runtime/lib/tableExport.d.ts +31 -0
- package/dist/runtime/lib/tableExport.js +143 -0
- package/dist/runtime/lib/talkback.d.ts +5 -0
- package/dist/runtime/lib/talkback.js +8 -0
- package/dist/runtime/lib/talkbackTokenBatch.d.ts +35 -0
- package/dist/runtime/lib/talkbackTokenBatch.js +101 -0
- package/dist/runtime/types/nav.d.ts +9 -0
- package/dist/types.d.mts +8 -0
- package/package.json +4 -3
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { AltArrowDown, AltArrowLeft, AltArrowUp, CloseCircle } from "#solar-icons";
|
|
3
|
+
import { Sheet, SheetContent, SheetTitle } from "@revenexx/studio";
|
|
4
|
+
import { vSwipeClose } from "../../lib/swipeToClose";
|
|
5
|
+
import { nextTick, onBeforeUnmount, onMounted, ref, watch } from "vue";
|
|
6
|
+
import { isCloseKey, isRecordStepKey } from "../../lib/detailSheet";
|
|
7
|
+
import { useT } from "../../composables/useT";
|
|
8
|
+
const props = defineProps({
|
|
9
|
+
open: { type: Boolean, required: true },
|
|
10
|
+
label: { type: String, required: true },
|
|
11
|
+
busy: { type: Boolean, required: false, default: false },
|
|
12
|
+
width: { type: String, required: false, default: "440px" },
|
|
13
|
+
top: { type: String, required: false, default: "4rem" },
|
|
14
|
+
returnFocus: { type: Function, required: false, default: void 0 },
|
|
15
|
+
canStep: { type: Object, required: false, default: void 0 }
|
|
16
|
+
});
|
|
17
|
+
const emit = defineEmits(["update:open", "step"]);
|
|
18
|
+
const t = useT();
|
|
19
|
+
const WIDE = "(min-width: 1024px)";
|
|
20
|
+
const wide = ref(false);
|
|
21
|
+
let mql = null;
|
|
22
|
+
const onMedia = (e) => {
|
|
23
|
+
wide.value = e.matches;
|
|
24
|
+
};
|
|
25
|
+
const panel = ref(null);
|
|
26
|
+
let opener = null;
|
|
27
|
+
function close() {
|
|
28
|
+
emit("update:open", false);
|
|
29
|
+
}
|
|
30
|
+
function stepBy(dir) {
|
|
31
|
+
if (props.canStep?.[dir < 0 ? "prev" : "next"]) emit("step", dir);
|
|
32
|
+
}
|
|
33
|
+
function restoreFocus() {
|
|
34
|
+
const target = props.returnFocus?.() ?? opener;
|
|
35
|
+
opener = null;
|
|
36
|
+
if (target?.isConnected) target.focus({ preventScroll: false });
|
|
37
|
+
}
|
|
38
|
+
watch(() => props.open, async (open, was) => {
|
|
39
|
+
if (open && !was) {
|
|
40
|
+
opener = document.activeElement instanceof HTMLElement ? document.activeElement : null;
|
|
41
|
+
if (wide.value) {
|
|
42
|
+
await nextTick();
|
|
43
|
+
panel.value?.focus({ preventScroll: true });
|
|
44
|
+
}
|
|
45
|
+
} else if (!open && was && wide.value) {
|
|
46
|
+
await nextTick();
|
|
47
|
+
restoreFocus();
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
function onCloseAutoFocus(ev) {
|
|
51
|
+
ev.preventDefault();
|
|
52
|
+
restoreFocus();
|
|
53
|
+
}
|
|
54
|
+
function onKeydown(ev) {
|
|
55
|
+
if (!props.open) return;
|
|
56
|
+
if (wide.value && document.querySelector('[role="dialog"][data-state="open"], [role="alertdialog"][data-state="open"]')) return;
|
|
57
|
+
if (wide.value && isCloseKey(ev)) {
|
|
58
|
+
ev.preventDefault();
|
|
59
|
+
close();
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const dir = isRecordStepKey(ev);
|
|
63
|
+
if (dir !== null) {
|
|
64
|
+
ev.preventDefault();
|
|
65
|
+
emit("step", dir);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
onMounted(() => {
|
|
69
|
+
mql = window.matchMedia(WIDE);
|
|
70
|
+
wide.value = mql.matches;
|
|
71
|
+
mql.addEventListener("change", onMedia);
|
|
72
|
+
document.addEventListener("keydown", onKeydown);
|
|
73
|
+
});
|
|
74
|
+
onBeforeUnmount(() => {
|
|
75
|
+
mql?.removeEventListener("change", onMedia);
|
|
76
|
+
document.removeEventListener("keydown", onKeydown);
|
|
77
|
+
});
|
|
78
|
+
</script>
|
|
79
|
+
|
|
80
|
+
<template>
|
|
81
|
+
<!-- Slide-in from the right (≥ 1024 px), not modal ------------------- -->
|
|
82
|
+
<Teleport to="body">
|
|
83
|
+
<Transition
|
|
84
|
+
enter-active-class="motion-safe:transition-transform motion-safe:duration-200 motion-safe:ease-out"
|
|
85
|
+
enter-from-class="motion-safe:translate-x-[calc(100%+1rem)]"
|
|
86
|
+
leave-active-class="motion-safe:transition-transform motion-safe:duration-150 motion-safe:ease-in"
|
|
87
|
+
leave-to-class="motion-safe:translate-x-[calc(100%+1rem)]"
|
|
88
|
+
>
|
|
89
|
+
<aside
|
|
90
|
+
v-if="open && wide"
|
|
91
|
+
ref="panel"
|
|
92
|
+
role="region"
|
|
93
|
+
:aria-label="label"
|
|
94
|
+
tabindex="-1"
|
|
95
|
+
class="fixed bottom-3 right-3 z-40 flex flex-col overflow-hidden rounded-lg border border-black/[0.06] bg-white shadow-[0_8px_24px_rgba(11,5,34,0.12)] outline-none"
|
|
96
|
+
:style="{ width, top, maxWidth: 'calc(100vw - 1.5rem)' }"
|
|
97
|
+
>
|
|
98
|
+
<div class="shrink-0 border-b border-black/[0.06] p-4">
|
|
99
|
+
<div class="flex items-start gap-2">
|
|
100
|
+
<div class="min-w-0 flex-1">
|
|
101
|
+
<slot name="header" />
|
|
102
|
+
</div>
|
|
103
|
+
<template v-if="canStep">
|
|
104
|
+
<button
|
|
105
|
+
type="button"
|
|
106
|
+
class="flex size-8 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground aria-disabled:cursor-default aria-disabled:opacity-40 aria-disabled:hover:bg-transparent aria-disabled:hover:text-muted-foreground"
|
|
107
|
+
:aria-label="t('shared.detailsheet.action.previous')"
|
|
108
|
+
:title="t('shared.detailsheet.action.previous')"
|
|
109
|
+
aria-keyshortcuts="ArrowUp"
|
|
110
|
+
:aria-disabled="canStep.prev ? void 0 : 'true'"
|
|
111
|
+
@click="stepBy(-1)"
|
|
112
|
+
>
|
|
113
|
+
<AltArrowUp :size="18" weight="Bold" />
|
|
114
|
+
</button>
|
|
115
|
+
<button
|
|
116
|
+
type="button"
|
|
117
|
+
class="flex size-8 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground aria-disabled:cursor-default aria-disabled:opacity-40 aria-disabled:hover:bg-transparent aria-disabled:hover:text-muted-foreground"
|
|
118
|
+
:aria-label="t('shared.detailsheet.action.next')"
|
|
119
|
+
:title="t('shared.detailsheet.action.next')"
|
|
120
|
+
aria-keyshortcuts="ArrowDown"
|
|
121
|
+
:aria-disabled="canStep.next ? void 0 : 'true'"
|
|
122
|
+
@click="stepBy(1)"
|
|
123
|
+
>
|
|
124
|
+
<AltArrowDown :size="18" weight="Bold" />
|
|
125
|
+
</button>
|
|
126
|
+
</template>
|
|
127
|
+
<button
|
|
128
|
+
type="button"
|
|
129
|
+
class="flex size-8 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground"
|
|
130
|
+
:aria-label="t('shared.detailsheet.action.close')"
|
|
131
|
+
@click="close"
|
|
132
|
+
>
|
|
133
|
+
<CloseCircle :size="18" />
|
|
134
|
+
</button>
|
|
135
|
+
</div>
|
|
136
|
+
<div v-if="$slots.actions" class="mt-3 flex flex-wrap items-center gap-2">
|
|
137
|
+
<slot name="actions" layout="inline" />
|
|
138
|
+
</div>
|
|
139
|
+
</div>
|
|
140
|
+
<div class="min-h-0 flex-1 overflow-y-auto p-4" :aria-busy="busy ? 'true' : void 0">
|
|
141
|
+
<slot />
|
|
142
|
+
</div>
|
|
143
|
+
<span role="status" class="sr-only">{{ busy ? t("shared.detailsheet.state.loading") : "" }}</span>
|
|
144
|
+
</aside>
|
|
145
|
+
</Transition>
|
|
146
|
+
</Teleport>
|
|
147
|
+
|
|
148
|
+
<!-- Overlay (< 1024 px) ------------------------------------------------ -->
|
|
149
|
+
<Sheet v-if="!wide" :open="open" @update:open="(v) => {
|
|
150
|
+
if (!v) close();
|
|
151
|
+
}">
|
|
152
|
+
<!-- The studio SheetContent draws its own close button, labelled in
|
|
153
|
+
English; ours sits in the header and speaks the host's language, so
|
|
154
|
+
that one is hidden. -->
|
|
155
|
+
<SheetContent
|
|
156
|
+
side="right"
|
|
157
|
+
:aria-describedby="undefined"
|
|
158
|
+
class="w-full gap-0 p-0 sm:max-w-md [&>button.absolute]:hidden motion-reduce:animate-none motion-reduce:transition-none"
|
|
159
|
+
@close-auto-focus="onCloseAutoFocus"
|
|
160
|
+
>
|
|
161
|
+
<div v-swipe-close="close" class="flex shrink-0 justify-center pt-2 md:hidden">
|
|
162
|
+
<span class="h-1.5 w-10 rounded-full bg-black/15" />
|
|
163
|
+
</div>
|
|
164
|
+
<SheetTitle class="sr-only">{{ label }}</SheetTitle>
|
|
165
|
+
<div class="flex shrink-0 items-start gap-2 border-b border-black/[0.06] p-3">
|
|
166
|
+
<button
|
|
167
|
+
type="button"
|
|
168
|
+
class="flex size-10 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground"
|
|
169
|
+
:aria-label="t('shared.detailsheet.action.back')"
|
|
170
|
+
@click="close"
|
|
171
|
+
>
|
|
172
|
+
<AltArrowLeft :size="20" weight="Bold" />
|
|
173
|
+
</button>
|
|
174
|
+
<div class="min-w-0 flex-1 self-center">
|
|
175
|
+
<slot name="header" />
|
|
176
|
+
</div>
|
|
177
|
+
<template v-if="canStep">
|
|
178
|
+
<button
|
|
179
|
+
type="button"
|
|
180
|
+
class="flex size-10 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground aria-disabled:cursor-default aria-disabled:opacity-40 aria-disabled:hover:bg-transparent aria-disabled:hover:text-muted-foreground"
|
|
181
|
+
:aria-label="t('shared.detailsheet.action.previous')"
|
|
182
|
+
:title="t('shared.detailsheet.action.previous')"
|
|
183
|
+
aria-keyshortcuts="ArrowUp"
|
|
184
|
+
:aria-disabled="canStep.prev ? void 0 : 'true'"
|
|
185
|
+
@click="stepBy(-1)"
|
|
186
|
+
>
|
|
187
|
+
<AltArrowUp :size="20" weight="Bold" />
|
|
188
|
+
</button>
|
|
189
|
+
<button
|
|
190
|
+
type="button"
|
|
191
|
+
class="flex size-10 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground aria-disabled:cursor-default aria-disabled:opacity-40 aria-disabled:hover:bg-transparent aria-disabled:hover:text-muted-foreground"
|
|
192
|
+
:aria-label="t('shared.detailsheet.action.next')"
|
|
193
|
+
:title="t('shared.detailsheet.action.next')"
|
|
194
|
+
aria-keyshortcuts="ArrowDown"
|
|
195
|
+
:aria-disabled="canStep.next ? void 0 : 'true'"
|
|
196
|
+
@click="stepBy(1)"
|
|
197
|
+
>
|
|
198
|
+
<AltArrowDown :size="20" weight="Bold" />
|
|
199
|
+
</button>
|
|
200
|
+
</template>
|
|
201
|
+
</div>
|
|
202
|
+
<div class="min-h-0 flex-1 overflow-y-auto p-4" :aria-busy="busy ? 'true' : void 0">
|
|
203
|
+
<slot />
|
|
204
|
+
</div>
|
|
205
|
+
<span role="status" class="sr-only">{{ busy ? t("shared.detailsheet.state.loading") : "" }}</span>
|
|
206
|
+
<div v-if="$slots.actions" class="flex shrink-0 items-center gap-2 border-t border-black/[0.06] bg-white p-3 pb-[max(0.75rem,env(safe-area-inset-bottom))]">
|
|
207
|
+
<slot name="actions" layout="bar" />
|
|
208
|
+
</div>
|
|
209
|
+
</SheetContent>
|
|
210
|
+
</Sheet>
|
|
211
|
+
</template>
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
type __VLS_Props = {
|
|
2
|
+
open: boolean;
|
|
3
|
+
/** Accessible name of the panel — normally the record's title. */
|
|
4
|
+
label: string;
|
|
5
|
+
/** The body is still fetching: `aria-busy` plus a spoken "loading". */
|
|
6
|
+
busy?: boolean;
|
|
7
|
+
/** Panel width in the wide layout. */
|
|
8
|
+
width?: string;
|
|
9
|
+
/** Distance from the viewport top in the wide layout — clears the top bar. */
|
|
10
|
+
top?: string;
|
|
11
|
+
/** Where focus goes on close. Defaults to the element focused at open. */
|
|
12
|
+
returnFocus?: () => HTMLElement | null | undefined;
|
|
13
|
+
/** Which neighbours exist — draws the previous/next buttons. Omit for none. */
|
|
14
|
+
canStep?: {
|
|
15
|
+
prev: boolean;
|
|
16
|
+
next: boolean;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
declare var __VLS_13: {}, __VLS_30: {
|
|
20
|
+
layout: string;
|
|
21
|
+
}, __VLS_32: {}, __VLS_61: {}, __VLS_73: {}, __VLS_75: {
|
|
22
|
+
layout: string;
|
|
23
|
+
};
|
|
24
|
+
type __VLS_Slots = {} & {
|
|
25
|
+
header?: (props: typeof __VLS_13) => any;
|
|
26
|
+
} & {
|
|
27
|
+
actions?: (props: typeof __VLS_30) => any;
|
|
28
|
+
} & {
|
|
29
|
+
default?: (props: typeof __VLS_32) => any;
|
|
30
|
+
} & {
|
|
31
|
+
header?: (props: typeof __VLS_61) => any;
|
|
32
|
+
} & {
|
|
33
|
+
default?: (props: typeof __VLS_73) => any;
|
|
34
|
+
} & {
|
|
35
|
+
actions?: (props: typeof __VLS_75) => any;
|
|
36
|
+
};
|
|
37
|
+
declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
38
|
+
"update:open": (open: boolean) => any;
|
|
39
|
+
step: (dir: 1 | -1) => any;
|
|
40
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
41
|
+
"onUpdate:open"?: ((open: boolean) => any) | undefined;
|
|
42
|
+
onStep?: ((dir: 1 | -1) => any) | undefined;
|
|
43
|
+
}>, {
|
|
44
|
+
busy: boolean;
|
|
45
|
+
width: string;
|
|
46
|
+
top: string;
|
|
47
|
+
returnFocus: () => HTMLElement | null | undefined;
|
|
48
|
+
canStep: {
|
|
49
|
+
prev: boolean;
|
|
50
|
+
next: boolean;
|
|
51
|
+
};
|
|
52
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
53
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
54
|
+
declare const _default: typeof __VLS_export;
|
|
55
|
+
export default _default;
|
|
56
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
57
|
+
new (): {
|
|
58
|
+
$slots: S;
|
|
59
|
+
};
|
|
60
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
type __VLS_Props = {
|
|
2
|
+
title?: string | null;
|
|
3
|
+
description?: string | null;
|
|
4
|
+
/** One paragraph, split into headline and subtitle at its first sentence. */
|
|
5
|
+
text?: string | null;
|
|
6
|
+
};
|
|
7
|
+
declare var __VLS_1: {};
|
|
8
|
+
type __VLS_Slots = {} & {
|
|
9
|
+
default?: (props: typeof __VLS_1) => any;
|
|
10
|
+
};
|
|
11
|
+
declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
12
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
13
|
+
declare const _default: typeof __VLS_export;
|
|
14
|
+
export default _default;
|
|
15
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
16
|
+
new (): {
|
|
17
|
+
$slots: S;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { splitNotice } from "../../lib/notice";
|
|
3
|
+
const props = defineProps({
|
|
4
|
+
title: { type: [String, null], required: false },
|
|
5
|
+
description: { type: [String, null], required: false },
|
|
6
|
+
text: { type: [String, null], required: false }
|
|
7
|
+
});
|
|
8
|
+
const parts = computed(() => {
|
|
9
|
+
if (props.title) return { title: props.title, description: props.description || null };
|
|
10
|
+
const split = splitNotice(props.text || props.description || "");
|
|
11
|
+
return { title: split.title, description: split.description };
|
|
12
|
+
});
|
|
13
|
+
</script>
|
|
14
|
+
|
|
15
|
+
<template>
|
|
16
|
+
<div v-if="parts.title || parts.description" class="min-w-0 text-left" data-slot="empty-note">
|
|
17
|
+
<p v-if="parts.title" class="text-sm font-medium text-foreground">
|
|
18
|
+
{{ parts.title }}
|
|
19
|
+
</p>
|
|
20
|
+
<p v-if="parts.description" class="mt-0.5 text-xs text-muted-foreground">
|
|
21
|
+
{{ parts.description }}
|
|
22
|
+
</p>
|
|
23
|
+
<slot />
|
|
24
|
+
</div>
|
|
25
|
+
</template>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
type __VLS_Props = {
|
|
2
|
+
title?: string | null;
|
|
3
|
+
description?: string | null;
|
|
4
|
+
/** One paragraph, split into headline and subtitle at its first sentence. */
|
|
5
|
+
text?: string | null;
|
|
6
|
+
};
|
|
7
|
+
declare var __VLS_1: {};
|
|
8
|
+
type __VLS_Slots = {} & {
|
|
9
|
+
default?: (props: typeof __VLS_1) => any;
|
|
10
|
+
};
|
|
11
|
+
declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
12
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
13
|
+
declare const _default: typeof __VLS_export;
|
|
14
|
+
export default _default;
|
|
15
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
16
|
+
new (): {
|
|
17
|
+
$slots: S;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
@@ -34,19 +34,20 @@ type __VLS_Props = {
|
|
|
34
34
|
placement: string;
|
|
35
35
|
};
|
|
36
36
|
};
|
|
37
|
-
declare var
|
|
37
|
+
declare var __VLS_7: {}, __VLS_79: {}, __VLS_81: {};
|
|
38
38
|
type __VLS_Slots = {} & {
|
|
39
|
-
'pill-icon'?: (props: typeof
|
|
39
|
+
'pill-icon'?: (props: typeof __VLS_7) => any;
|
|
40
40
|
} & {
|
|
41
|
-
default?: (props: typeof
|
|
41
|
+
default?: (props: typeof __VLS_79) => any;
|
|
42
42
|
} & {
|
|
43
|
-
footer?: (props: typeof
|
|
43
|
+
footer?: (props: typeof __VLS_81) => any;
|
|
44
44
|
};
|
|
45
|
-
declare const
|
|
45
|
+
declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
|
|
46
46
|
bottomClass: string;
|
|
47
47
|
widthClass: string;
|
|
48
48
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
49
|
-
declare const
|
|
49
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
50
|
+
declare const _default: typeof __VLS_export;
|
|
50
51
|
export default _default;
|
|
51
52
|
type __VLS_WithSlots<T, S> = T & {
|
|
52
53
|
new (): {
|
|
@@ -34,19 +34,20 @@ type __VLS_Props = {
|
|
|
34
34
|
placement: string;
|
|
35
35
|
};
|
|
36
36
|
};
|
|
37
|
-
declare var
|
|
37
|
+
declare var __VLS_7: {}, __VLS_79: {}, __VLS_81: {};
|
|
38
38
|
type __VLS_Slots = {} & {
|
|
39
|
-
'pill-icon'?: (props: typeof
|
|
39
|
+
'pill-icon'?: (props: typeof __VLS_7) => any;
|
|
40
40
|
} & {
|
|
41
|
-
default?: (props: typeof
|
|
41
|
+
default?: (props: typeof __VLS_79) => any;
|
|
42
42
|
} & {
|
|
43
|
-
footer?: (props: typeof
|
|
43
|
+
footer?: (props: typeof __VLS_81) => any;
|
|
44
44
|
};
|
|
45
|
-
declare const
|
|
45
|
+
declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
|
|
46
46
|
bottomClass: string;
|
|
47
47
|
widthClass: string;
|
|
48
48
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
49
|
-
declare const
|
|
49
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
50
|
+
declare const _default: typeof __VLS_export;
|
|
50
51
|
export default _default;
|
|
51
52
|
type __VLS_WithSlots<T, S> = T & {
|
|
52
53
|
new (): {
|
|
@@ -4,7 +4,7 @@ type __VLS_Props = {
|
|
|
4
4
|
disabled?: boolean;
|
|
5
5
|
showPreviews?: boolean;
|
|
6
6
|
};
|
|
7
|
-
declare const
|
|
7
|
+
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
8
8
|
"update:triggerMode": (value: string) => any;
|
|
9
9
|
"update:previewsEnabled": (value: boolean) => any;
|
|
10
10
|
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
@@ -14,4 +14,5 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
|
|
|
14
14
|
disabled: boolean;
|
|
15
15
|
showPreviews: boolean;
|
|
16
16
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
17
|
+
declare const _default: typeof __VLS_export;
|
|
17
18
|
export default _default;
|
|
@@ -4,7 +4,7 @@ type __VLS_Props = {
|
|
|
4
4
|
disabled?: boolean;
|
|
5
5
|
showPreviews?: boolean;
|
|
6
6
|
};
|
|
7
|
-
declare const
|
|
7
|
+
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
8
8
|
"update:triggerMode": (value: string) => any;
|
|
9
9
|
"update:previewsEnabled": (value: boolean) => any;
|
|
10
10
|
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
@@ -14,4 +14,5 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
|
|
|
14
14
|
disabled: boolean;
|
|
15
15
|
showPreviews: boolean;
|
|
16
16
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
17
|
+
declare const _default: typeof __VLS_export;
|
|
17
18
|
export default _default;
|
|
@@ -7,7 +7,14 @@ type __VLS_Props = {
|
|
|
7
7
|
up?: boolean;
|
|
8
8
|
/** Muted line under the value (e.g. "vs last month"). */
|
|
9
9
|
sub?: string;
|
|
10
|
+
/**
|
|
11
|
+
* Keep the sub line to one line and cut it with an ellipsis; the caller puts
|
|
12
|
+
* the full text in a tooltip (the Commerce tiles, Michael 19.10.: „kompakter,
|
|
13
|
+
* der Untertitel … bricht um“).
|
|
14
|
+
*/
|
|
15
|
+
subOneLine?: boolean;
|
|
10
16
|
to?: string;
|
|
11
17
|
};
|
|
12
|
-
declare const
|
|
18
|
+
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
19
|
+
declare const _default: typeof __VLS_export;
|
|
13
20
|
export default _default;
|
|
@@ -7,26 +7,27 @@ defineProps({
|
|
|
7
7
|
delta: { type: String, required: false },
|
|
8
8
|
up: { type: Boolean, required: false },
|
|
9
9
|
sub: { type: String, required: false },
|
|
10
|
+
subOneLine: { type: Boolean, required: false },
|
|
10
11
|
to: { type: String, required: false }
|
|
11
12
|
});
|
|
12
13
|
</script>
|
|
13
14
|
|
|
14
15
|
<template>
|
|
16
|
+
<!-- The home dashboard's KPI card (KpiStrip), shared: 2-layer glass, mono
|
|
17
|
+
caps label, big figure, change + note in one line, centred. The icon is
|
|
18
|
+
no longer drawn — the dashboard design has none (Michael 12.10.). -->
|
|
15
19
|
<component
|
|
16
20
|
:is="to ? NuxtLink : 'div'"
|
|
17
21
|
:to="to"
|
|
18
22
|
class="block rounded-lg border border-gray-400/10 outline-1 outline-white/30"
|
|
19
23
|
:class="to ? 'transition-transform hover:-translate-y-0.5' : ''"
|
|
20
24
|
>
|
|
21
|
-
<div class="relative h-full overflow-hidden rounded-lg bg-white p-4">
|
|
22
|
-
<div class="
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
<div v-if="delta || sub" class="mt-1.5 text-xs">
|
|
28
|
-
<span v-if="delta" class="font-medium tabular-nums" :class="up ? 'text-emerald-600' : 'text-rose-600'">{{ delta }}</span>
|
|
29
|
-
<span v-if="sub" class="text-muted-foreground" :class="delta ? 'ml-1' : ''">{{ sub }}</span>
|
|
25
|
+
<div class="relative flex h-full flex-col justify-start overflow-hidden rounded-lg bg-white p-4">
|
|
26
|
+
<div class="text-mono line-clamp-2 leading-[1.4] text-muted-foreground">{{ label }}</div>
|
|
27
|
+
<div class="mt-1 truncate text-2xl font-semibold tabular-nums text-[#0B0522]">{{ value }}</div>
|
|
28
|
+
<div v-if="delta || sub" class="mt-1 flex min-w-0 items-start gap-1 text-sm">
|
|
29
|
+
<span v-if="delta" class="shrink-0 font-medium tabular-nums" :class="up ? 'text-emerald-600' : 'text-rose-600'">{{ delta }}</span>
|
|
30
|
+
<span v-if="sub" class="text-muted-foreground" :class="subOneLine ? 'min-w-0 truncate' : 'line-clamp-2'">{{ delta ? "\xB7 " : "" }}{{ sub }}</span>
|
|
30
31
|
</div>
|
|
31
32
|
</div>
|
|
32
33
|
</component>
|
|
@@ -7,7 +7,14 @@ type __VLS_Props = {
|
|
|
7
7
|
up?: boolean;
|
|
8
8
|
/** Muted line under the value (e.g. "vs last month"). */
|
|
9
9
|
sub?: string;
|
|
10
|
+
/**
|
|
11
|
+
* Keep the sub line to one line and cut it with an ellipsis; the caller puts
|
|
12
|
+
* the full text in a tooltip (the Commerce tiles, Michael 19.10.: „kompakter,
|
|
13
|
+
* der Untertitel … bricht um“).
|
|
14
|
+
*/
|
|
15
|
+
subOneLine?: boolean;
|
|
10
16
|
to?: string;
|
|
11
17
|
};
|
|
12
|
-
declare const
|
|
18
|
+
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
19
|
+
declare const _default: typeof __VLS_export;
|
|
13
20
|
export default _default;
|
|
@@ -24,12 +24,13 @@ type __VLS_Slots = {} & {
|
|
|
24
24
|
} & {
|
|
25
25
|
aside?: (props: typeof __VLS_5) => any;
|
|
26
26
|
};
|
|
27
|
-
declare const
|
|
27
|
+
declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
|
|
28
28
|
railOpen: boolean;
|
|
29
29
|
railWidth: string;
|
|
30
30
|
asideWidth: string;
|
|
31
31
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
32
|
-
declare const
|
|
32
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
33
|
+
declare const _default: typeof __VLS_export;
|
|
33
34
|
export default _default;
|
|
34
35
|
type __VLS_WithSlots<T, S> = T & {
|
|
35
36
|
new (): {
|
|
@@ -24,12 +24,13 @@ type __VLS_Slots = {} & {
|
|
|
24
24
|
} & {
|
|
25
25
|
aside?: (props: typeof __VLS_5) => any;
|
|
26
26
|
};
|
|
27
|
-
declare const
|
|
27
|
+
declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
|
|
28
28
|
railOpen: boolean;
|
|
29
29
|
railWidth: string;
|
|
30
30
|
asideWidth: string;
|
|
31
31
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
32
|
-
declare const
|
|
32
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
33
|
+
declare const _default: typeof __VLS_export;
|
|
33
34
|
export default _default;
|
|
34
35
|
type __VLS_WithSlots<T, S> = T & {
|
|
35
36
|
new (): {
|
|
@@ -5,16 +5,17 @@ type __VLS_Props = {
|
|
|
5
5
|
title: string;
|
|
6
6
|
description?: string;
|
|
7
7
|
};
|
|
8
|
-
declare var
|
|
8
|
+
declare var __VLS_6: {}, __VLS_8: {}, __VLS_10: {};
|
|
9
9
|
type __VLS_Slots = {} & {
|
|
10
|
-
title?: (props: typeof
|
|
10
|
+
title?: (props: typeof __VLS_6) => any;
|
|
11
11
|
} & {
|
|
12
|
-
actions?: (props: typeof
|
|
12
|
+
actions?: (props: typeof __VLS_8) => any;
|
|
13
13
|
} & {
|
|
14
|
-
tabs?: (props: typeof
|
|
14
|
+
tabs?: (props: typeof __VLS_10) => any;
|
|
15
15
|
};
|
|
16
|
-
declare const
|
|
17
|
-
declare const
|
|
16
|
+
declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
17
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
18
|
+
declare const _default: typeof __VLS_export;
|
|
18
19
|
export default _default;
|
|
19
20
|
type __VLS_WithSlots<T, S> = T & {
|
|
20
21
|
new (): {
|
|
@@ -7,8 +7,14 @@ defineProps({
|
|
|
7
7
|
</script>
|
|
8
8
|
|
|
9
9
|
<template>
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
<!-- Opaque, in the shell's ground: a see-through header let the record's
|
|
11
|
+
content run visibly behind its title on scroll (customers-09; tried
|
|
12
|
+
translucent again 13.10., dropped). The fallback keeps it opaque in a
|
|
13
|
+
host that defines no shell token. -->
|
|
14
|
+
<div class="sticky top-0 z-20 border-b border-black/[0.06] bg-[var(--color-shell,#f3f1fa)]">
|
|
15
|
+
<!-- Phone: the title keeps its own row and the actions wrap below it
|
|
16
|
+
(R3/R5) instead of squeezing the title to nothing. -->
|
|
17
|
+
<div class="flex min-h-14 items-center gap-2 px-4 pt-4 pb-3" data-rx-header-row>
|
|
12
18
|
<component
|
|
13
19
|
:is="icon"
|
|
14
20
|
v-if="icon"
|
|
@@ -16,13 +22,18 @@ defineProps({
|
|
|
16
22
|
:stroke-width="2"
|
|
17
23
|
class="shrink-0 text-foreground/70"
|
|
18
24
|
/>
|
|
19
|
-
<h1 class="text-xl font-medium text-[#0B0522] truncate">
|
|
25
|
+
<h1 class="min-w-0 text-xl font-medium text-[#0B0522] truncate">
|
|
20
26
|
<slot name="title">{{ title }}</slot>
|
|
21
27
|
</h1>
|
|
22
28
|
|
|
23
29
|
<div class="flex-1" />
|
|
24
30
|
|
|
25
|
-
|
|
31
|
+
<!-- One rhythm for every page: 8px between buttons, and the 32px
|
|
32
|
+
buttons tucked into the 28px title line so the header's hairline
|
|
33
|
+
meets the sidebar's whatever a page puts here (Michael 13.10.). -->
|
|
34
|
+
<div v-if="$slots.actions" class="-my-0.5 flex shrink-0 items-center gap-2">
|
|
35
|
+
<slot name="actions" />
|
|
36
|
+
</div>
|
|
26
37
|
</div>
|
|
27
38
|
|
|
28
39
|
<div v-if="$slots.tabs" class="flex items-center gap-1 px-3 pb-2 overflow-x-auto">
|
|
@@ -5,16 +5,17 @@ type __VLS_Props = {
|
|
|
5
5
|
title: string;
|
|
6
6
|
description?: string;
|
|
7
7
|
};
|
|
8
|
-
declare var
|
|
8
|
+
declare var __VLS_6: {}, __VLS_8: {}, __VLS_10: {};
|
|
9
9
|
type __VLS_Slots = {} & {
|
|
10
|
-
title?: (props: typeof
|
|
10
|
+
title?: (props: typeof __VLS_6) => any;
|
|
11
11
|
} & {
|
|
12
|
-
actions?: (props: typeof
|
|
12
|
+
actions?: (props: typeof __VLS_8) => any;
|
|
13
13
|
} & {
|
|
14
|
-
tabs?: (props: typeof
|
|
14
|
+
tabs?: (props: typeof __VLS_10) => any;
|
|
15
15
|
};
|
|
16
|
-
declare const
|
|
17
|
-
declare const
|
|
16
|
+
declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
17
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
18
|
+
declare const _default: typeof __VLS_export;
|
|
18
19
|
export default _default;
|
|
19
20
|
type __VLS_WithSlots<T, S> = T & {
|
|
20
21
|
new (): {
|