@sentropic/design-system-vue 0.36.44 → 0.36.46
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/AppShell.d.ts +93 -0
- package/dist/AppShell.d.ts.map +1 -0
- package/dist/AppShell.js +34 -0
- package/dist/AppShell.js.map +1 -0
- package/dist/Badge.d.ts +34 -0
- package/dist/Badge.d.ts.map +1 -1
- package/dist/Badge.js +3 -1
- package/dist/Badge.js.map +1 -1
- package/dist/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible.js +6 -0
- package/dist/Collapsible.js.map +1 -1
- package/dist/ContextPanel.d.ts +49 -0
- package/dist/ContextPanel.d.ts.map +1 -0
- package/dist/ContextPanel.js +19 -0
- package/dist/ContextPanel.js.map +1 -0
- package/dist/Drawer.d.ts +1 -1
- package/dist/Drawer.d.ts.map +1 -1
- package/dist/MenuTriggerButton.d.ts +1 -1
- package/dist/NavDrawer.d.ts +6 -0
- package/dist/NavDrawer.d.ts.map +1 -0
- package/dist/NavDrawer.js +10 -0
- package/dist/NavDrawer.js.map +1 -0
- package/dist/NavItem.d.ts +189 -0
- package/dist/NavItem.d.ts.map +1 -0
- package/dist/NavItem.js +121 -0
- package/dist/NavItem.js.map +1 -0
- package/dist/NavRail.d.ts +61 -0
- package/dist/NavRail.d.ts.map +1 -0
- package/dist/NavRail.js +27 -0
- package/dist/NavRail.js.map +1 -0
- package/dist/NavSection.d.ts +109 -0
- package/dist/NavSection.d.ts.map +1 -0
- package/dist/NavSection.js +104 -0
- package/dist/NavSection.js.map +1 -0
- package/dist/NavShell.d.ts +105 -0
- package/dist/NavShell.d.ts.map +1 -0
- package/dist/NavShell.js +34 -0
- package/dist/NavShell.js.map +1 -0
- package/dist/SelectableRow.d.ts +11 -0
- package/dist/SelectableRow.d.ts.map +1 -1
- package/dist/SelectableRow.js +25 -6
- package/dist/SelectableRow.js.map +1 -1
- package/dist/Typography.d.ts +1 -1
- package/dist/UtilityPanel.d.ts +72 -0
- package/dist/UtilityPanel.d.ts.map +1 -0
- package/dist/UtilityPanel.js +21 -0
- package/dist/UtilityPanel.js.map +1 -0
- package/dist/index.d.ts +17 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1079 -508
- package/package.json +1 -1
package/dist/NavItem.js
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { defineComponent, h, ref, watch } from "vue";
|
|
2
|
+
import { classNames } from "./classNames.js";
|
|
3
|
+
import { SelectableRow } from "./SelectableRow.js";
|
|
4
|
+
import { ColorSwatch } from "./ColorSwatch.js";
|
|
5
|
+
import { StatusDot } from "./StatusDot.js";
|
|
6
|
+
import { Badge } from "./Badge.js";
|
|
7
|
+
const DEPTH_INDENT = ["0rem", "0.75rem", "1.5rem", "2.25rem"];
|
|
8
|
+
/**
|
|
9
|
+
* NavItem — l'ANATOMIE DE RANGÉE CANONIQUE du système de navigation (vague 2).
|
|
10
|
+
* La brique que tout rail/drawer instancie : tête (pastille/icône) + titre +
|
|
11
|
+
* caption muette + queue (bulle de compte) + sélection + profondeur
|
|
12
|
+
* typographique + séparateur optionnel.
|
|
13
|
+
*
|
|
14
|
+
* Zéro-entropie : NavItem NE RÉIMPLÉMENTE RIEN. Il COMPOSE SelectableRow (qui
|
|
15
|
+
* possède déjà leading/trailing/caption, la sélection, le rôle ARIA dérivé du
|
|
16
|
+
* conteneur et la propagation du roving-tabindex) et réutilise les primitives
|
|
17
|
+
* vague 1 :
|
|
18
|
+
* • ColorSwatch → tête quand `swatch.color` (couleur arbitraire inline)
|
|
19
|
+
* • StatusDot → tête quand `swatch.tone` (point sémantique)
|
|
20
|
+
* • Badge → queue (shape="circle" size="sm", tabular-nums) pour `count`
|
|
21
|
+
* Style PROPRE token-only scopé ; AUCUN hex en dur.
|
|
22
|
+
*
|
|
23
|
+
* Slots : `leading` (prime sur `swatch`), `trailing` (prime sur `count`).
|
|
24
|
+
*/
|
|
25
|
+
export const NavItem = defineComponent({
|
|
26
|
+
name: "NavItem",
|
|
27
|
+
props: {
|
|
28
|
+
value: { type: String, default: undefined },
|
|
29
|
+
title: { type: String, required: true },
|
|
30
|
+
caption: { type: String, default: undefined },
|
|
31
|
+
depth: { type: Number, default: 0 },
|
|
32
|
+
swatch: { type: Object, default: undefined },
|
|
33
|
+
count: { type: Number, default: undefined },
|
|
34
|
+
status: { type: String, default: "neutral" },
|
|
35
|
+
selected: { type: Boolean, default: false },
|
|
36
|
+
disabled: { type: Boolean, default: false },
|
|
37
|
+
href: { type: String, default: undefined },
|
|
38
|
+
divider: { type: Boolean, default: false },
|
|
39
|
+
onSelect: {
|
|
40
|
+
type: Function,
|
|
41
|
+
default: undefined,
|
|
42
|
+
},
|
|
43
|
+
class: { type: String, default: undefined },
|
|
44
|
+
},
|
|
45
|
+
emits: {
|
|
46
|
+
select: (_selected) => true,
|
|
47
|
+
},
|
|
48
|
+
setup(props, { slots, attrs, emit }) {
|
|
49
|
+
// Sélection standalone : SelectableRow vue est CONTRÔLÉ (il n'auto-toggle
|
|
50
|
+
// pas), donc NavItem détient l'état interne et le rebascule à la rangée.
|
|
51
|
+
const internalSelected = ref(props.selected);
|
|
52
|
+
watch(() => props.selected, (next) => {
|
|
53
|
+
internalSelected.value = next;
|
|
54
|
+
});
|
|
55
|
+
function handleSelect(next) {
|
|
56
|
+
internalSelected.value = next;
|
|
57
|
+
props.onSelect?.(next);
|
|
58
|
+
emit("select", next);
|
|
59
|
+
}
|
|
60
|
+
return () => {
|
|
61
|
+
// Profondeur bornée [0..3] : une valeur hors-borne ne casse pas la classe.
|
|
62
|
+
const safeDepth = Math.min(Math.max(Math.trunc(Number(props.depth) || 0), 0), 3);
|
|
63
|
+
// Le count alimente un aria-label explicite « N title » (un compte nu est
|
|
64
|
+
// ambigu pour un lecteur d'écran — cf. la doc de Badge).
|
|
65
|
+
const countLabel = props.count != null ? `${props.count} ${props.title}` : undefined;
|
|
66
|
+
const wrapperClasses = classNames("st-navItem", `st-navItem--depth${safeDepth}`, props.status !== "neutral" ? `st-navItem--status-${props.status}` : undefined, props.class);
|
|
67
|
+
// Indentation de profondeur : une var additive sur le wrapper, à fallback
|
|
68
|
+
// littéral par palier (aucun hex). La rangée hérite via la cascade.
|
|
69
|
+
const depthStyle = `--st-navItem-indent: var(--st-component-navItem-depth${safeDepth}-indent, ${DEPTH_INDENT[safeDepth]});`;
|
|
70
|
+
// Tête : leading (slot) prime sur swatch ; ColorSwatch pour une couleur
|
|
71
|
+
// arbitraire, sinon StatusDot pour un ton sémantique.
|
|
72
|
+
const leadingSlot = slots.leading
|
|
73
|
+
? slots.leading
|
|
74
|
+
: props.swatch
|
|
75
|
+
? () => props.swatch.color
|
|
76
|
+
? h(ColorSwatch, {
|
|
77
|
+
color: props.swatch.color,
|
|
78
|
+
shape: props.swatch.shape ?? "square",
|
|
79
|
+
size: 14,
|
|
80
|
+
})
|
|
81
|
+
: h(StatusDot, { tone: props.swatch.tone ?? "neutral", size: 8 })
|
|
82
|
+
: undefined;
|
|
83
|
+
// Queue : trailing (slot) prime sur count. Badge circle/sm aligné sur le
|
|
84
|
+
// status de la rangée, aria-label explicite.
|
|
85
|
+
const trailingSlot = slots.trailing
|
|
86
|
+
? slots.trailing
|
|
87
|
+
: props.count != null
|
|
88
|
+
? () => h(Badge, {
|
|
89
|
+
shape: "circle",
|
|
90
|
+
size: "sm",
|
|
91
|
+
tone: props.status,
|
|
92
|
+
"aria-label": countLabel,
|
|
93
|
+
}, { default: () => props.count })
|
|
94
|
+
: undefined;
|
|
95
|
+
const rowSlots = {
|
|
96
|
+
default: () => h("span", { class: "st-navItem__title" }, props.title),
|
|
97
|
+
};
|
|
98
|
+
if (leadingSlot)
|
|
99
|
+
rowSlots.leading = leadingSlot;
|
|
100
|
+
if (trailingSlot)
|
|
101
|
+
rowSlots.trailing = trailingSlot;
|
|
102
|
+
if (props.caption) {
|
|
103
|
+
rowSlots.caption = () => h("span", { class: "st-navItem__caption" }, props.caption);
|
|
104
|
+
}
|
|
105
|
+
const children = [
|
|
106
|
+
h(SelectableRow, {
|
|
107
|
+
selected: internalSelected.value,
|
|
108
|
+
value: props.value,
|
|
109
|
+
href: props.href,
|
|
110
|
+
disabled: props.disabled,
|
|
111
|
+
onSelect: handleSelect,
|
|
112
|
+
}, rowSlots),
|
|
113
|
+
];
|
|
114
|
+
if (props.divider) {
|
|
115
|
+
children.push(h("hr", { class: "st-navItem__divider", "aria-hidden": "true" }));
|
|
116
|
+
}
|
|
117
|
+
return h("div", { ...attrs, class: wrapperClasses, style: depthStyle }, children);
|
|
118
|
+
};
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
//# sourceMappingURL=NavItem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NavItem.js","sourceRoot":"","sources":["../src/NavItem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAc,MAAM,KAAK,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAkDnC,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAU,CAAC;AAEvE;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,eAAe,CAAC;IACrC,IAAI,EAAE,SAAS;IACf,KAAK,EAAE;QACL,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE;QAC3C,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;QACvC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE;QAC7C,KAAK,EAAE,EAAE,IAAI,EAAE,MAA4B,EAAE,OAAO,EAAE,CAAC,EAAE;QACzD,MAAM,EAAE,EAAE,IAAI,EAAE,MAA6B,EAAE,OAAO,EAAE,SAAS,EAAE;QACnE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE;QAC3C,MAAM,EAAE,EAAE,IAAI,EAAE,MAA6B,EAAE,OAAO,EAAE,SAAS,EAAE;QACnE,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE;QAC3C,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE;QAC3C,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE;QAC1C,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE;QAC1C,QAAQ,EAAE;YACR,IAAI,EAAE,QAAwD;YAC9D,OAAO,EAAE,SAAS;SACnB;QACD,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE;KAC5C;IACD,KAAK,EAAE;QACL,MAAM,EAAE,CAAC,SAAkB,EAAE,EAAE,CAAC,IAAI;KACrC;IACD,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;QACjC,0EAA0E;QAC1E,yEAAyE;QACzE,MAAM,gBAAgB,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7C,KAAK,CACH,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,EACpB,CAAC,IAAI,EAAE,EAAE;YACP,gBAAgB,CAAC,KAAK,GAAG,IAAI,CAAC;QAChC,CAAC,CACF,CAAC;QAEF,SAAS,YAAY,CAAC,IAAa;YACjC,gBAAgB,CAAC,KAAK,GAAG,IAAI,CAAC;YAC9B,KAAK,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC;YACvB,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACvB,CAAC;QAED,OAAO,GAAG,EAAE;YACV,2EAA2E;YAC3E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CACxB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EACjD,CAAC,CACc,CAAC;YAElB,0EAA0E;YAC1E,yDAAyD;YACzD,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YAErF,MAAM,cAAc,GAAG,UAAU,CAC/B,YAAY,EACZ,oBAAoB,SAAS,EAAE,EAC/B,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,sBAAsB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,EAC7E,KAAK,CAAC,KAAK,CACZ,CAAC;YAEF,0EAA0E;YAC1E,oEAAoE;YACpE,MAAM,UAAU,GAAG,wDAAwD,SAAS,YAAY,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC;YAE5H,wEAAwE;YACxE,sDAAsD;YACtD,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO;gBAC/B,CAAC,CAAC,KAAK,CAAC,OAAO;gBACf,CAAC,CAAC,KAAK,CAAC,MAAM;oBACZ,CAAC,CAAC,GAAG,EAAE,CACH,KAAK,CAAC,MAAO,CAAC,KAAK;wBACjB,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;4BACb,KAAK,EAAE,KAAK,CAAC,MAAO,CAAC,KAAK;4BAC1B,KAAK,EAAE,KAAK,CAAC,MAAO,CAAC,KAAK,IAAI,QAAQ;4BACtC,IAAI,EAAE,EAAE;yBACT,CAAC;wBACJ,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,MAAO,CAAC,IAAI,IAAI,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;oBACxE,CAAC,CAAC,SAAS,CAAC;YAEhB,yEAAyE;YACzE,6CAA6C;YAC7C,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ;gBACjC,CAAC,CAAC,KAAK,CAAC,QAAQ;gBAChB,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI;oBACnB,CAAC,CAAC,GAAG,EAAE,CACH,CAAC,CACC,KAAK,EACL;wBACE,KAAK,EAAE,QAAQ;wBACf,IAAI,EAAE,IAAI;wBACV,IAAI,EAAE,KAAK,CAAC,MAAM;wBAClB,YAAY,EAAE,UAAU;qBACzB,EACD,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAC/B;oBACL,CAAC,CAAC,SAAS,CAAC;YAEhB,MAAM,QAAQ,GAAkC;gBAC9C,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC;aACtE,CAAC;YACF,IAAI,WAAW;gBAAE,QAAQ,CAAC,OAAO,GAAG,WAAW,CAAC;YAChD,IAAI,YAAY;gBAAE,QAAQ,CAAC,QAAQ,GAAG,YAAY,CAAC;YACnD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAClB,QAAQ,CAAC,OAAO,GAAG,GAAG,EAAE,CACtB,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YAC/D,CAAC;YAED,MAAM,QAAQ,GAAY;gBACxB,CAAC,CACC,aAAa,EACb;oBACE,QAAQ,EAAE,gBAAgB,CAAC,KAAK;oBAChC,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,QAAQ,EAAE,YAAY;iBACvB,EACD,QAAQ,CACT;aACF,CAAC;YAEF,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAClB,QAAQ,CAAC,IAAI,CACX,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CACjE,CAAC;YACJ,CAAC;YAED,OAAO,CAAC,CACN,KAAK,EACL,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE,EACtD,QAAQ,CACT,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { type PropType } from "vue";
|
|
2
|
+
export interface NavRailItem {
|
|
3
|
+
id: string;
|
|
4
|
+
label: unknown;
|
|
5
|
+
href?: string;
|
|
6
|
+
active?: boolean;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
badge?: unknown;
|
|
9
|
+
icon?: unknown;
|
|
10
|
+
}
|
|
11
|
+
export type NavRailProps = {
|
|
12
|
+
items?: NavRailItem[];
|
|
13
|
+
label?: string;
|
|
14
|
+
activeItemId?: string;
|
|
15
|
+
class?: string;
|
|
16
|
+
};
|
|
17
|
+
export declare const NavRail: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
18
|
+
items: {
|
|
19
|
+
type: PropType<NavRailItem[]>;
|
|
20
|
+
default: () => never[];
|
|
21
|
+
};
|
|
22
|
+
label: {
|
|
23
|
+
type: StringConstructor;
|
|
24
|
+
default: string;
|
|
25
|
+
};
|
|
26
|
+
activeItemId: {
|
|
27
|
+
type: StringConstructor;
|
|
28
|
+
default: undefined;
|
|
29
|
+
};
|
|
30
|
+
class: {
|
|
31
|
+
type: StringConstructor;
|
|
32
|
+
default: undefined;
|
|
33
|
+
};
|
|
34
|
+
}>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
35
|
+
[key: string]: any;
|
|
36
|
+
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, "itemSelect"[], "itemSelect", import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
37
|
+
items: {
|
|
38
|
+
type: PropType<NavRailItem[]>;
|
|
39
|
+
default: () => never[];
|
|
40
|
+
};
|
|
41
|
+
label: {
|
|
42
|
+
type: StringConstructor;
|
|
43
|
+
default: string;
|
|
44
|
+
};
|
|
45
|
+
activeItemId: {
|
|
46
|
+
type: StringConstructor;
|
|
47
|
+
default: undefined;
|
|
48
|
+
};
|
|
49
|
+
class: {
|
|
50
|
+
type: StringConstructor;
|
|
51
|
+
default: undefined;
|
|
52
|
+
};
|
|
53
|
+
}>> & Readonly<{
|
|
54
|
+
onItemSelect?: ((...args: any[]) => any) | undefined;
|
|
55
|
+
}>, {
|
|
56
|
+
items: NavRailItem[];
|
|
57
|
+
class: string;
|
|
58
|
+
label: string;
|
|
59
|
+
activeItemId: string;
|
|
60
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
61
|
+
//# sourceMappingURL=NavRail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NavRail.d.ts","sourceRoot":"","sources":["../src/NavRail.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,QAAQ,EAAE,MAAM,KAAK,CAAC;AAGxD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,OAAO;;cAGQ,QAAQ,CAAC,WAAW,EAAE,CAAC;;;;;;;;;;;;;;;;;;;cAAvB,QAAQ,CAAC,WAAW,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;;4EAoBjD,CAAC"}
|
package/dist/NavRail.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { defineComponent, h } from "vue";
|
|
2
|
+
import { classNames } from "./classNames.js";
|
|
3
|
+
export const NavRail = defineComponent({
|
|
4
|
+
name: "NavRail",
|
|
5
|
+
props: {
|
|
6
|
+
items: { type: Array, default: () => [] },
|
|
7
|
+
label: { type: String, default: "Primary navigation" },
|
|
8
|
+
activeItemId: { type: String, default: undefined },
|
|
9
|
+
class: { type: String, default: undefined },
|
|
10
|
+
},
|
|
11
|
+
emits: ["itemSelect"],
|
|
12
|
+
setup(props, { slots, emit, attrs }) {
|
|
13
|
+
return () => h("nav", { ...attrs, class: classNames("st-navRail", props.class), "aria-label": props.label }, [
|
|
14
|
+
h("div", { class: "st-navRail__items" }, [
|
|
15
|
+
...props.items.map((item) => {
|
|
16
|
+
const active = item.active === true || item.id === props.activeItemId;
|
|
17
|
+
const content = [item.icon ? h("span", { class: "st-navRail__icon" }, String(item.icon)) : null, h("span", { class: "st-navRail__label" }, item.label), item.badge != null ? h("span", { class: "st-navRail__badge" }, String(item.badge)) : null];
|
|
18
|
+
const common = { key: item.id, class: classNames("st-navRail__item", active && "st-navRail__item--active"), "aria-current": active ? "page" : undefined, onClick: () => !item.disabled && emit("itemSelect", item.id) };
|
|
19
|
+
return item.href && !item.disabled ? h("a", { ...common, href: item.href }, content) : h("button", { ...common, type: "button", disabled: item.disabled }, content);
|
|
20
|
+
}),
|
|
21
|
+
slots.default?.(),
|
|
22
|
+
]),
|
|
23
|
+
slots.footer ? h("footer", { class: "st-navRail__footer" }, slots.footer()) : null,
|
|
24
|
+
]);
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=NavRail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NavRail.js","sourceRoot":"","sources":["../src/NavRail.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { type VNode } from "vue";
|
|
2
|
+
/** Niveau de titre porté par l'Overline d'en-tête de section. `h2`/`h3` quand la
|
|
3
|
+
* section est une vraie région titrée d'un rail/drawer ; choisis selon la
|
|
4
|
+
* profondeur du sommaire. */
|
|
5
|
+
export type NavSectionHeadingLevel = "h2" | "h3";
|
|
6
|
+
export type NavSectionProps = {
|
|
7
|
+
/** Libellé de la section, rendu via Overline (small-caps muet). */
|
|
8
|
+
label: string;
|
|
9
|
+
/** Compteur optionnel → Badge circle en queue de l'en-tête. */
|
|
10
|
+
count?: number;
|
|
11
|
+
/** Si true, l'en-tête devient le trigger d'un Collapsible (aria-expanded)
|
|
12
|
+
* qui montre/cache le contenu. Sinon : groupe titré statique. */
|
|
13
|
+
collapsible?: boolean;
|
|
14
|
+
/** État d'ouverture quand `collapsible`. */
|
|
15
|
+
open?: boolean;
|
|
16
|
+
/** Niveau de titre de l'Overline quand la section n'est pas repliable. */
|
|
17
|
+
as?: NavSectionHeadingLevel;
|
|
18
|
+
/** Notifié à chaque bascule d'ouverture (section repliable). */
|
|
19
|
+
onToggle?: (open: boolean) => void;
|
|
20
|
+
class?: string;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* NavSection — EN-TÊTE DE GROUPE d'un rail / drawer (« COMMUNITIES »,
|
|
24
|
+
* « SIGNAUX », « Pastilles », « Zonage / Potentiel », « DOCUMENTATION »).
|
|
25
|
+
* Donne la hiérarchie typographique qui manque à une liste plate + un foyer
|
|
26
|
+
* normé pour l'action locale. ZÉRO-ENTROPIE : on RÉUTILISE les primitives déjà
|
|
27
|
+
* livrées —
|
|
28
|
+
* • Overline → le libellé small-caps muet (rendu en h2/h3 pour la sémantique
|
|
29
|
+
* de titre quand la section n'est PAS repliable) ;
|
|
30
|
+
* • Badge shape="circle" → le compteur de section en queue d'en-tête ;
|
|
31
|
+
* • Collapsible → le disclosure (trigger aria-expanded + région
|
|
32
|
+
* aria-labelledby) quand `collapsible`.
|
|
33
|
+
* On ne réimplémente NI disclosure NI libellé. Style token-only scopé, aucun hex.
|
|
34
|
+
*
|
|
35
|
+
* Slots : `default` (contenu de la section, rendu dans la région) ; `action`
|
|
36
|
+
* (emplacement normé d'une action de section, aligné à droite de l'en-tête,
|
|
37
|
+
* NON rendu quand `collapsible`).
|
|
38
|
+
*/
|
|
39
|
+
export declare const NavSection: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
40
|
+
label: {
|
|
41
|
+
type: StringConstructor;
|
|
42
|
+
required: true;
|
|
43
|
+
};
|
|
44
|
+
count: {
|
|
45
|
+
type: NumberConstructor;
|
|
46
|
+
default: undefined;
|
|
47
|
+
};
|
|
48
|
+
collapsible: {
|
|
49
|
+
type: BooleanConstructor;
|
|
50
|
+
default: boolean;
|
|
51
|
+
};
|
|
52
|
+
open: {
|
|
53
|
+
type: BooleanConstructor;
|
|
54
|
+
default: boolean;
|
|
55
|
+
};
|
|
56
|
+
as: {
|
|
57
|
+
type: () => NavSectionHeadingLevel;
|
|
58
|
+
default: string;
|
|
59
|
+
};
|
|
60
|
+
onToggle: {
|
|
61
|
+
type: () => (open: boolean) => void;
|
|
62
|
+
default: undefined;
|
|
63
|
+
};
|
|
64
|
+
class: {
|
|
65
|
+
type: StringConstructor;
|
|
66
|
+
default: undefined;
|
|
67
|
+
};
|
|
68
|
+
}>, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
69
|
+
[key: string]: any;
|
|
70
|
+
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, "toggle"[], "toggle", import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
71
|
+
label: {
|
|
72
|
+
type: StringConstructor;
|
|
73
|
+
required: true;
|
|
74
|
+
};
|
|
75
|
+
count: {
|
|
76
|
+
type: NumberConstructor;
|
|
77
|
+
default: undefined;
|
|
78
|
+
};
|
|
79
|
+
collapsible: {
|
|
80
|
+
type: BooleanConstructor;
|
|
81
|
+
default: boolean;
|
|
82
|
+
};
|
|
83
|
+
open: {
|
|
84
|
+
type: BooleanConstructor;
|
|
85
|
+
default: boolean;
|
|
86
|
+
};
|
|
87
|
+
as: {
|
|
88
|
+
type: () => NavSectionHeadingLevel;
|
|
89
|
+
default: string;
|
|
90
|
+
};
|
|
91
|
+
onToggle: {
|
|
92
|
+
type: () => (open: boolean) => void;
|
|
93
|
+
default: undefined;
|
|
94
|
+
};
|
|
95
|
+
class: {
|
|
96
|
+
type: StringConstructor;
|
|
97
|
+
default: undefined;
|
|
98
|
+
};
|
|
99
|
+
}>> & Readonly<{
|
|
100
|
+
onToggle?: ((...args: any[]) => any) | undefined;
|
|
101
|
+
}>, {
|
|
102
|
+
open: boolean;
|
|
103
|
+
class: string;
|
|
104
|
+
onToggle: (open: boolean) => void;
|
|
105
|
+
as: NavSectionHeadingLevel;
|
|
106
|
+
count: number;
|
|
107
|
+
collapsible: boolean;
|
|
108
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
109
|
+
//# sourceMappingURL=NavSection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NavSection.d.ts","sourceRoot":"","sources":["../src/NavSection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,KAAK,EAAE,MAAM,KAAK,CAAC;AAMjE;;6BAE6B;AAC7B,MAAM,MAAM,sBAAsB,GAAG,IAAI,GAAG,IAAI,CAAC;AAEjD,MAAM,MAAM,eAAe,GAAG;IAC5B,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;qEACiE;IACjE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4CAA4C;IAC5C,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,0EAA0E;IAC1E,EAAE,CAAC,EAAE,sBAAsB,CAAC;IAC5B,gEAAgE;IAChE,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAIF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;cAOG,MAAM,sBAAsB;;;;cAEnB,MAAM,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;cAFtC,MAAM,sBAAsB;;;;cAEnB,MAAM,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI;;;;;;;;;;;;qBAAhB,OAAO,KAAK,IAAI;;;;4EAyG9D,CAAC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { defineComponent, h, ref, watch } from "vue";
|
|
2
|
+
import { classNames } from "./classNames.js";
|
|
3
|
+
import { Badge } from "./Badge.js";
|
|
4
|
+
import { Collapsible } from "./Collapsible.js";
|
|
5
|
+
import { Overline } from "./Overline.js";
|
|
6
|
+
let navSectionCounter = 0;
|
|
7
|
+
/**
|
|
8
|
+
* NavSection — EN-TÊTE DE GROUPE d'un rail / drawer (« COMMUNITIES »,
|
|
9
|
+
* « SIGNAUX », « Pastilles », « Zonage / Potentiel », « DOCUMENTATION »).
|
|
10
|
+
* Donne la hiérarchie typographique qui manque à une liste plate + un foyer
|
|
11
|
+
* normé pour l'action locale. ZÉRO-ENTROPIE : on RÉUTILISE les primitives déjà
|
|
12
|
+
* livrées —
|
|
13
|
+
* • Overline → le libellé small-caps muet (rendu en h2/h3 pour la sémantique
|
|
14
|
+
* de titre quand la section n'est PAS repliable) ;
|
|
15
|
+
* • Badge shape="circle" → le compteur de section en queue d'en-tête ;
|
|
16
|
+
* • Collapsible → le disclosure (trigger aria-expanded + région
|
|
17
|
+
* aria-labelledby) quand `collapsible`.
|
|
18
|
+
* On ne réimplémente NI disclosure NI libellé. Style token-only scopé, aucun hex.
|
|
19
|
+
*
|
|
20
|
+
* Slots : `default` (contenu de la section, rendu dans la région) ; `action`
|
|
21
|
+
* (emplacement normé d'une action de section, aligné à droite de l'en-tête,
|
|
22
|
+
* NON rendu quand `collapsible`).
|
|
23
|
+
*/
|
|
24
|
+
export const NavSection = defineComponent({
|
|
25
|
+
name: "NavSection",
|
|
26
|
+
props: {
|
|
27
|
+
label: { type: String, required: true },
|
|
28
|
+
count: { type: Number, default: undefined },
|
|
29
|
+
collapsible: { type: Boolean, default: false },
|
|
30
|
+
open: { type: Boolean, default: true },
|
|
31
|
+
as: { type: String, default: "h3" },
|
|
32
|
+
onToggle: {
|
|
33
|
+
type: Function,
|
|
34
|
+
default: undefined,
|
|
35
|
+
},
|
|
36
|
+
class: { type: String, default: undefined },
|
|
37
|
+
},
|
|
38
|
+
emits: ["toggle"],
|
|
39
|
+
setup(props, { slots, attrs, emit }) {
|
|
40
|
+
const uid = `st-navSection-${(navSectionCounter += 1)}`;
|
|
41
|
+
// `open` est une valeur INITIALE (mirroir de `bind:open` svelte) : la section
|
|
42
|
+
// gère son propre état d'ouverture et le re-synchronise si le prop change.
|
|
43
|
+
const internalOpen = ref(props.open);
|
|
44
|
+
watch(() => props.open, (next) => {
|
|
45
|
+
internalOpen.value = next;
|
|
46
|
+
});
|
|
47
|
+
return () => {
|
|
48
|
+
const hasCount = typeof props.count === "number";
|
|
49
|
+
const rootClasses = classNames("st-navSection", props.collapsible ? "st-navSection--collapsible" : "st-navSection--static", props.class);
|
|
50
|
+
const countBadge = (className) => h(Badge, {
|
|
51
|
+
shape: "circle",
|
|
52
|
+
size: "sm",
|
|
53
|
+
class: className,
|
|
54
|
+
"aria-label": `${props.count} éléments`,
|
|
55
|
+
}, { default: () => props.count });
|
|
56
|
+
if (props.collapsible) {
|
|
57
|
+
// Repliable : l'en-tête EST le trigger du Collapsible. Le compteur passe
|
|
58
|
+
// par son slot `trailing` (entre le titre et le chevron) ; on annonce le
|
|
59
|
+
// tout aux lecteurs d'écran via aria-label. L'action de section n'a pas
|
|
60
|
+
// sa place dans un trigger (un bouton dans un bouton).
|
|
61
|
+
const collapsibleSlots = {
|
|
62
|
+
default: () => slots.default?.(),
|
|
63
|
+
};
|
|
64
|
+
if (hasCount) {
|
|
65
|
+
collapsibleSlots.trailing = () => countBadge();
|
|
66
|
+
}
|
|
67
|
+
return h(Collapsible, {
|
|
68
|
+
...attrs,
|
|
69
|
+
open: internalOpen.value,
|
|
70
|
+
title: props.label,
|
|
71
|
+
"aria-label": hasCount ? `${props.label}, ${props.count}` : props.label,
|
|
72
|
+
class: rootClasses,
|
|
73
|
+
onToggle: (open) => {
|
|
74
|
+
internalOpen.value = open;
|
|
75
|
+
props.onToggle?.(open);
|
|
76
|
+
emit("toggle", open);
|
|
77
|
+
},
|
|
78
|
+
}, collapsibleSlots);
|
|
79
|
+
}
|
|
80
|
+
// Statique : groupe titré par l'Overline (h2/h3). Le contenu est relié au
|
|
81
|
+
// titre via aria-labelledby — la liste devient une vraie région titrée.
|
|
82
|
+
const overlineChildren = [props.label];
|
|
83
|
+
if (hasCount) {
|
|
84
|
+
overlineChildren.push(countBadge("st-navSection__count"));
|
|
85
|
+
}
|
|
86
|
+
const headerChildren = [
|
|
87
|
+
h(Overline, { as: props.as, id: `${uid}-label`, class: "st-navSection__label" }, { default: () => overlineChildren }),
|
|
88
|
+
];
|
|
89
|
+
if (slots.action) {
|
|
90
|
+
headerChildren.push(h("span", { class: "st-navSection__action" }, slots.action()));
|
|
91
|
+
}
|
|
92
|
+
return h("section", {
|
|
93
|
+
...attrs,
|
|
94
|
+
class: rootClasses,
|
|
95
|
+
role: "group",
|
|
96
|
+
"aria-labelledby": `${uid}-label`,
|
|
97
|
+
}, [
|
|
98
|
+
h("div", { class: "st-navSection__header" }, headerChildren),
|
|
99
|
+
h("div", { class: "st-navSection__body" }, slots.default?.()),
|
|
100
|
+
]);
|
|
101
|
+
};
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
//# sourceMappingURL=NavSection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NavSection.js","sourceRoot":"","sources":["../src/NavSection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { type PropType } from "vue";
|
|
2
|
+
export type NavShellVariant = "rail" | "drawer";
|
|
3
|
+
export type NavShellSide = "left" | "right" | "bottom";
|
|
4
|
+
export type NavShellProps = {
|
|
5
|
+
variant?: NavShellVariant;
|
|
6
|
+
title?: string;
|
|
7
|
+
subtitle?: string;
|
|
8
|
+
back?: boolean;
|
|
9
|
+
backLabel?: string;
|
|
10
|
+
label?: string;
|
|
11
|
+
open?: boolean;
|
|
12
|
+
side?: NavShellSide;
|
|
13
|
+
class?: string;
|
|
14
|
+
};
|
|
15
|
+
export declare const NavShell: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
16
|
+
variant: {
|
|
17
|
+
type: PropType<NavShellVariant>;
|
|
18
|
+
default: string;
|
|
19
|
+
};
|
|
20
|
+
title: {
|
|
21
|
+
type: StringConstructor;
|
|
22
|
+
default: undefined;
|
|
23
|
+
};
|
|
24
|
+
subtitle: {
|
|
25
|
+
type: StringConstructor;
|
|
26
|
+
default: undefined;
|
|
27
|
+
};
|
|
28
|
+
back: {
|
|
29
|
+
type: BooleanConstructor;
|
|
30
|
+
default: boolean;
|
|
31
|
+
};
|
|
32
|
+
backLabel: {
|
|
33
|
+
type: StringConstructor;
|
|
34
|
+
default: string;
|
|
35
|
+
};
|
|
36
|
+
label: {
|
|
37
|
+
type: StringConstructor;
|
|
38
|
+
default: undefined;
|
|
39
|
+
};
|
|
40
|
+
open: {
|
|
41
|
+
type: BooleanConstructor;
|
|
42
|
+
default: boolean;
|
|
43
|
+
};
|
|
44
|
+
side: {
|
|
45
|
+
type: PropType<NavShellSide>;
|
|
46
|
+
default: string;
|
|
47
|
+
};
|
|
48
|
+
class: {
|
|
49
|
+
type: StringConstructor;
|
|
50
|
+
default: undefined;
|
|
51
|
+
};
|
|
52
|
+
}>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
53
|
+
[key: string]: any;
|
|
54
|
+
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("close" | "back")[], "close" | "back", import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
55
|
+
variant: {
|
|
56
|
+
type: PropType<NavShellVariant>;
|
|
57
|
+
default: string;
|
|
58
|
+
};
|
|
59
|
+
title: {
|
|
60
|
+
type: StringConstructor;
|
|
61
|
+
default: undefined;
|
|
62
|
+
};
|
|
63
|
+
subtitle: {
|
|
64
|
+
type: StringConstructor;
|
|
65
|
+
default: undefined;
|
|
66
|
+
};
|
|
67
|
+
back: {
|
|
68
|
+
type: BooleanConstructor;
|
|
69
|
+
default: boolean;
|
|
70
|
+
};
|
|
71
|
+
backLabel: {
|
|
72
|
+
type: StringConstructor;
|
|
73
|
+
default: string;
|
|
74
|
+
};
|
|
75
|
+
label: {
|
|
76
|
+
type: StringConstructor;
|
|
77
|
+
default: undefined;
|
|
78
|
+
};
|
|
79
|
+
open: {
|
|
80
|
+
type: BooleanConstructor;
|
|
81
|
+
default: boolean;
|
|
82
|
+
};
|
|
83
|
+
side: {
|
|
84
|
+
type: PropType<NavShellSide>;
|
|
85
|
+
default: string;
|
|
86
|
+
};
|
|
87
|
+
class: {
|
|
88
|
+
type: StringConstructor;
|
|
89
|
+
default: undefined;
|
|
90
|
+
};
|
|
91
|
+
}>> & Readonly<{
|
|
92
|
+
onClose?: ((...args: any[]) => any) | undefined;
|
|
93
|
+
onBack?: ((...args: any[]) => any) | undefined;
|
|
94
|
+
}>, {
|
|
95
|
+
open: boolean;
|
|
96
|
+
class: string;
|
|
97
|
+
label: string;
|
|
98
|
+
title: string;
|
|
99
|
+
variant: NavShellVariant;
|
|
100
|
+
subtitle: string;
|
|
101
|
+
back: boolean;
|
|
102
|
+
backLabel: string;
|
|
103
|
+
side: NavShellSide;
|
|
104
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
105
|
+
//# sourceMappingURL=NavShell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NavShell.d.ts","sourceRoot":"","sources":["../src/NavShell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,QAAQ,EAAE,MAAM,KAAK,CAAC;AAIxD,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,QAAQ,CAAC;AAChD,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEvD,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,QAAQ;;cAGU,QAAQ,CAAC,eAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAO5B,QAAQ,CAAC,YAAY,CAAC;;;;;;;;;;;cAPnB,QAAQ,CAAC,eAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAO5B,QAAQ,CAAC,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;4EAmBhD,CAAC"}
|
package/dist/NavShell.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { defineComponent, h } from "vue";
|
|
2
|
+
import { Drawer } from "./Drawer.js";
|
|
3
|
+
import { classNames } from "./classNames.js";
|
|
4
|
+
export const NavShell = defineComponent({
|
|
5
|
+
name: "NavShell",
|
|
6
|
+
props: {
|
|
7
|
+
variant: { type: String, default: "rail" },
|
|
8
|
+
title: { type: String, default: undefined },
|
|
9
|
+
subtitle: { type: String, default: undefined },
|
|
10
|
+
back: { type: Boolean, default: false },
|
|
11
|
+
backLabel: { type: String, default: "Back" },
|
|
12
|
+
label: { type: String, default: undefined },
|
|
13
|
+
open: { type: Boolean, default: false },
|
|
14
|
+
side: { type: String, default: "left" },
|
|
15
|
+
class: { type: String, default: undefined },
|
|
16
|
+
},
|
|
17
|
+
emits: ["back", "close"],
|
|
18
|
+
setup(props, { slots, emit, attrs }) {
|
|
19
|
+
const content = () => [
|
|
20
|
+
props.back || props.title || props.subtitle
|
|
21
|
+
? h("header", { class: "st-navShell__header" }, [
|
|
22
|
+
props.back ? h("button", { type: "button", class: "st-navShell__back", "aria-label": props.backLabel, onClick: () => emit("back") }, "←") : null,
|
|
23
|
+
props.title || props.subtitle ? h("div", { class: "st-navShell__heading" }, [props.title ? h("p", { class: "st-navShell__title" }, props.title) : null, props.subtitle ? h("p", { class: "st-navShell__subtitle" }, props.subtitle) : null]) : null,
|
|
24
|
+
])
|
|
25
|
+
: null,
|
|
26
|
+
slots.search ? h("div", { class: "st-navShell__search" }, slots.search()) : null,
|
|
27
|
+
h("div", { class: "st-navShell__body" }, slots.default?.()),
|
|
28
|
+
];
|
|
29
|
+
return () => props.variant === "drawer"
|
|
30
|
+
? h(Drawer, { open: props.open, title: props.title ?? props.label ?? "Navigation", placement: props.side, class: classNames("st-navShell st-navShell--drawer", props.class), onClose: () => emit("close") }, { default: content, footer: slots.footer })
|
|
31
|
+
: h("aside", { ...attrs, class: classNames("st-navShell st-navShell--rail", props.class), "aria-label": props.label ?? props.title }, [...content(), slots.footer ? h("footer", { class: "st-navShell__footer" }, slots.footer()) : null]);
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=NavShell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NavShell.js","sourceRoot":"","sources":["../src/NavShell.ts"],"names":[],"mappings":"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"}
|
package/dist/SelectableRow.d.ts
CHANGED
|
@@ -42,6 +42,8 @@ export type SelectableRowProps = {
|
|
|
42
42
|
disabled?: boolean;
|
|
43
43
|
/** Stable value, surfaced as `data-value` and used by the list for `value`. */
|
|
44
44
|
value?: string;
|
|
45
|
+
/** Native link target. When set on a standalone row, the row renders as an anchor. */
|
|
46
|
+
href?: string;
|
|
45
47
|
/**
|
|
46
48
|
* ARIA role for the standalone row. Defaults to "option" so a lone row still
|
|
47
49
|
* reads as a selectable item. Inside a list the role is forced to "option".
|
|
@@ -81,6 +83,10 @@ export declare const SelectableRow: import("vue").DefineComponent<import("vue").
|
|
|
81
83
|
type: StringConstructor;
|
|
82
84
|
default: undefined;
|
|
83
85
|
};
|
|
86
|
+
href: {
|
|
87
|
+
type: StringConstructor;
|
|
88
|
+
default: undefined;
|
|
89
|
+
};
|
|
84
90
|
role: {
|
|
85
91
|
type: StringConstructor;
|
|
86
92
|
default: string;
|
|
@@ -114,6 +120,10 @@ export declare const SelectableRow: import("vue").DefineComponent<import("vue").
|
|
|
114
120
|
type: StringConstructor;
|
|
115
121
|
default: undefined;
|
|
116
122
|
};
|
|
123
|
+
href: {
|
|
124
|
+
type: StringConstructor;
|
|
125
|
+
default: undefined;
|
|
126
|
+
};
|
|
117
127
|
role: {
|
|
118
128
|
type: StringConstructor;
|
|
119
129
|
default: string;
|
|
@@ -133,6 +143,7 @@ export declare const SelectableRow: import("vue").DefineComponent<import("vue").
|
|
|
133
143
|
onSelect: (selected: boolean) => void;
|
|
134
144
|
disabled: boolean;
|
|
135
145
|
role: string;
|
|
146
|
+
href: string;
|
|
136
147
|
value: string;
|
|
137
148
|
selected: boolean;
|
|
138
149
|
accentBar: boolean;
|