@sentropic/design-system-vue 0.36.56 → 0.36.58

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.
@@ -1,7 +1,9 @@
1
- import { type PropType } from "vue";
1
+ import { type PropType, type VNode } from "vue";
2
2
  export type AppShellVariant = "site" | "workspace";
3
3
  export type AppShellUtilityMode = "reserve" | "overlay" | "floating";
4
4
  export type AppShellUtilitySide = "left" | "right" | "bottom";
5
+ export type AppShellPanelCollapse = "stack" | "accordion";
6
+ export type AppShellPanelKey = "navigationPanel" | "contextPanel" | "utilityPanel";
5
7
  export type AppShellProps = {
6
8
  variant?: AppShellVariant;
7
9
  mainId?: string;
@@ -10,6 +12,37 @@ export type AppShellProps = {
10
12
  utilityLabel?: string;
11
13
  utilityMode?: AppShellUtilityMode;
12
14
  utilitySide?: AppShellUtilitySide;
15
+ /**
16
+ * Below the 48rem breakpoint, `"stack"` (default) keeps today's behaviour —
17
+ * panels stack full-width in document order, always expanded. `"accordion"`
18
+ * degrades each present panel to a keyboard-accessible disclosure (collapsed
19
+ * by default) instead of squeezing the main content. Desktop (>48rem)
20
+ * rendering is IDENTICAL in both modes — side panels stay side-by-side
21
+ * columns. Panel content is mounted once regardless of mode/breakpoint;
22
+ * collapsing hides/sizes the region rather than destroying it, so stateful
23
+ * widgets (maps, live panels…) mounted in a panel never remount.
24
+ */
25
+ panelCollapse?: AppShellPanelCollapse;
26
+ /** Disclosure label for `primaryRail` when `panelCollapse="accordion"`. */
27
+ primaryRailLabel?: string;
28
+ /** Disclosure label for `navigationPanel` when `panelCollapse="accordion"`. Defaults to `navigationLabel`. */
29
+ navigationPanelLabel?: string;
30
+ /** Disclosure label for `contextPanel` when `panelCollapse="accordion"`. Defaults to `contextLabel`. */
31
+ contextPanelLabel?: string;
32
+ /** Disclosure label for `utilityPanel` when `panelCollapse="accordion"`. Defaults to `utilityLabel`. */
33
+ utilityPanelLabel?: string;
34
+ /** Enables drag-to-resize handles on side panels above 48rem. Default false — zero regression. */
35
+ panelResize?: boolean;
36
+ /** Controlled panel widths in px. When provided the component never mutates width itself. */
37
+ panelWidths?: Partial<Record<AppShellPanelKey, number>>;
38
+ /** Seeds uncontrolled widths in px. */
39
+ defaultPanelWidths?: Partial<Record<AppShellPanelKey, number>>;
40
+ /** Fired on every committed resize. Persistence is the CONSUMER's job — the DS stays presentational. */
41
+ onPanelResize?: (key: AppShellPanelKey, width: number) => void;
42
+ /** Lower clamp in px. Default 180. */
43
+ panelMinWidth?: number;
44
+ /** Upper clamp in px. Default 640. */
45
+ panelMaxWidth?: number;
13
46
  class?: string;
14
47
  };
15
48
  export declare const AppShell: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
@@ -41,13 +74,57 @@ export declare const AppShell: import("vue").DefineComponent<import("vue").Extra
41
74
  type: PropType<AppShellUtilitySide>;
42
75
  default: string;
43
76
  };
77
+ panelCollapse: {
78
+ type: PropType<AppShellPanelCollapse>;
79
+ default: string;
80
+ };
81
+ primaryRailLabel: {
82
+ type: StringConstructor;
83
+ default: string;
84
+ };
85
+ navigationPanelLabel: {
86
+ type: StringConstructor;
87
+ default: undefined;
88
+ };
89
+ contextPanelLabel: {
90
+ type: StringConstructor;
91
+ default: undefined;
92
+ };
93
+ utilityPanelLabel: {
94
+ type: StringConstructor;
95
+ default: undefined;
96
+ };
97
+ panelResize: {
98
+ type: BooleanConstructor;
99
+ default: boolean;
100
+ };
101
+ panelWidths: {
102
+ type: () => Partial<Record<AppShellPanelKey, number>>;
103
+ default: undefined;
104
+ };
105
+ defaultPanelWidths: {
106
+ type: () => Partial<Record<AppShellPanelKey, number>>;
107
+ default: undefined;
108
+ };
109
+ onPanelResize: {
110
+ type: () => (key: AppShellPanelKey, width: number) => void;
111
+ default: undefined;
112
+ };
113
+ panelMinWidth: {
114
+ type: NumberConstructor;
115
+ default: number;
116
+ };
117
+ panelMaxWidth: {
118
+ type: NumberConstructor;
119
+ default: number;
120
+ };
44
121
  class: {
45
122
  type: StringConstructor;
46
123
  default: undefined;
47
124
  };
48
- }>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
125
+ }>, () => VNode<import("vue").RendererNode, import("vue").RendererElement, {
49
126
  [key: string]: any;
50
- }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
127
+ }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, "panelResize"[], "panelResize", import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
51
128
  variant: {
52
129
  type: PropType<AppShellVariant>;
53
130
  default: string;
@@ -76,12 +153,59 @@ export declare const AppShell: import("vue").DefineComponent<import("vue").Extra
76
153
  type: PropType<AppShellUtilitySide>;
77
154
  default: string;
78
155
  };
156
+ panelCollapse: {
157
+ type: PropType<AppShellPanelCollapse>;
158
+ default: string;
159
+ };
160
+ primaryRailLabel: {
161
+ type: StringConstructor;
162
+ default: string;
163
+ };
164
+ navigationPanelLabel: {
165
+ type: StringConstructor;
166
+ default: undefined;
167
+ };
168
+ contextPanelLabel: {
169
+ type: StringConstructor;
170
+ default: undefined;
171
+ };
172
+ utilityPanelLabel: {
173
+ type: StringConstructor;
174
+ default: undefined;
175
+ };
176
+ panelResize: {
177
+ type: BooleanConstructor;
178
+ default: boolean;
179
+ };
180
+ panelWidths: {
181
+ type: () => Partial<Record<AppShellPanelKey, number>>;
182
+ default: undefined;
183
+ };
184
+ defaultPanelWidths: {
185
+ type: () => Partial<Record<AppShellPanelKey, number>>;
186
+ default: undefined;
187
+ };
188
+ onPanelResize: {
189
+ type: () => (key: AppShellPanelKey, width: number) => void;
190
+ default: undefined;
191
+ };
192
+ panelMinWidth: {
193
+ type: NumberConstructor;
194
+ default: number;
195
+ };
196
+ panelMaxWidth: {
197
+ type: NumberConstructor;
198
+ default: number;
199
+ };
79
200
  class: {
80
201
  type: StringConstructor;
81
202
  default: undefined;
82
203
  };
83
- }>> & Readonly<{}>, {
204
+ }>> & Readonly<{
205
+ onPanelResize?: ((...args: any[]) => any) | undefined;
206
+ }>, {
84
207
  class: string;
208
+ panelResize: boolean;
85
209
  variant: AppShellVariant;
86
210
  mainId: string;
87
211
  navigationLabel: string;
@@ -89,5 +213,15 @@ export declare const AppShell: import("vue").DefineComponent<import("vue").Extra
89
213
  utilityLabel: string;
90
214
  utilityMode: AppShellUtilityMode;
91
215
  utilitySide: AppShellUtilitySide;
216
+ panelCollapse: AppShellPanelCollapse;
217
+ primaryRailLabel: string;
218
+ navigationPanelLabel: string;
219
+ contextPanelLabel: string;
220
+ utilityPanelLabel: string;
221
+ panelWidths: Partial<Record<AppShellPanelKey, number>>;
222
+ defaultPanelWidths: Partial<Record<AppShellPanelKey, number>>;
223
+ onPanelResize: (key: AppShellPanelKey, width: number) => void;
224
+ panelMinWidth: number;
225
+ panelMaxWidth: number;
92
226
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
93
227
  //# sourceMappingURL=AppShell.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AppShell.d.ts","sourceRoot":"","sources":["../src/AppShell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,QAAQ,EAAE,MAAM,KAAK,CAAC;AAGxD,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,WAAW,CAAC;AACnD,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;AACrE,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE9D,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,QAAQ;;cAGU,QAAQ,CAAC,eAAe,CAAC;;;;;;;;;;;;;;;;;;;;cAKrB,QAAQ,CAAC,mBAAmB,CAAC;;;;cAC7B,QAAQ,CAAC,mBAAmB,CAAC;;;;;;;;;;;cANjC,QAAQ,CAAC,eAAe,CAAC;;;;;;;;;;;;;;;;;;;;cAKrB,QAAQ,CAAC,mBAAmB,CAAC;;;;cAC7B,QAAQ,CAAC,mBAAmB,CAAC;;;;;;;;;;;;;;;;4EAqB9D,CAAC"}
1
+ {"version":3,"file":"AppShell.d.ts","sourceRoot":"","sources":["../src/AppShell.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,QAAQ,EAAY,KAAK,KAAK,EAAE,MAAM,KAAK,CAAC;AAInF,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,WAAW,CAAC;AACnD,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;AACrE,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAC9D,MAAM,MAAM,qBAAqB,GAAG,OAAO,GAAG,WAAW,CAAC;AAC1D,MAAM,MAAM,gBAAgB,GAAG,iBAAiB,GAAG,cAAc,GAAG,cAAc,CAAC;AAEnF,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC;;;;;;;;;OASG;IACH,aAAa,CAAC,EAAE,qBAAqB,CAAC;IACtC,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,8GAA8G;IAC9G,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,wGAAwG;IACxG,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,wGAAwG;IACxG,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kGAAkG;IAClG,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,6FAA6F;IAC7F,WAAW,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC;IACxD,uCAAuC;IACvC,kBAAkB,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/D,wGAAwG;IACxG,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/D,sCAAsC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sCAAsC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AA2BF,eAAO,MAAM,QAAQ;;cAGU,QAAQ,CAAC,eAAe,CAAC;;;;;;;;;;;;;;;;;;;;cAKrB,QAAQ,CAAC,mBAAmB,CAAC;;;;cAC7B,QAAQ,CAAC,mBAAmB,CAAC;;;;cAC3B,QAAQ,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;cAMjC,MAAM,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;;;;cACxC,MAAM,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;;;;cAEtD,MAAM,CAAC,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI;;;;;;;;;;;;;;;;;;;cAhBxD,QAAQ,CAAC,eAAe,CAAC;;;;;;;;;;;;;;;;;;;;cAKrB,QAAQ,CAAC,mBAAmB,CAAC;;;;cAC7B,QAAQ,CAAC,mBAAmB,CAAC;;;;cAC3B,QAAQ,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;cAMjC,MAAM,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;;;;cACxC,MAAM,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;;;;cAEtD,MAAM,CAAC,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAAxC,gBAAgB,SAAS,MAAM,KAAK,IAAI;;;4EAuTrF,CAAC"}
package/dist/AppShell.js CHANGED
@@ -1,5 +1,29 @@
1
- import { defineComponent, h } from "vue";
1
+ import { defineComponent, h, ref } from "vue";
2
+ import { ChevronDown } from "lucide-vue-next";
2
3
  import { classNames } from "./classNames.js";
4
+ // CSS custom property each resizable panel is sized by (see the
5
+ // `.st-appShell__navigationPanel` / `__contextPanel` / `__utilityPanel` rules
6
+ // in styles.css) — setting it inline on the shell root is the intended resize
7
+ // mechanism, it simply out-specificities the token-driven default declared
8
+ // there.
9
+ const PANEL_VAR = {
10
+ navigationPanel: "--st-appShell-navigation-width",
11
+ contextPanel: "--st-appShell-context-width",
12
+ utilityPanel: "--st-appShell-utility-width",
13
+ };
14
+ // Nominal px equivalent of each panel's own CSS-token default — used ONLY as
15
+ // a display/ARIA fallback (aria-valuenow, drag-start anchor) before any width
16
+ // has ever been supplied or committed. Never written back as an inline
17
+ // style, so a themed override of the underlying token is never fought until
18
+ // the consumer/user actually establishes a concrete width.
19
+ // NOTE: `primaryRail` is intentionally NOT a resizable panel — it is a
20
+ // fixed-width icon rail (à la VS Code's activity bar), not a splittable
21
+ // pane; see `AppShellPanelKey` above.
22
+ const PANEL_NOMINAL_PX = {
23
+ navigationPanel: 320,
24
+ contextPanel: 352,
25
+ utilityPanel: 384,
26
+ };
3
27
  export const AppShell = defineComponent({
4
28
  name: "AppShell",
5
29
  props: {
@@ -10,21 +34,281 @@ export const AppShell = defineComponent({
10
34
  utilityLabel: { type: String, default: "Utility panel" },
11
35
  utilityMode: { type: String, default: "reserve" },
12
36
  utilitySide: { type: String, default: "right" },
37
+ panelCollapse: { type: String, default: "stack" },
38
+ primaryRailLabel: { type: String, default: "Primary rail" },
39
+ navigationPanelLabel: { type: String, default: undefined },
40
+ contextPanelLabel: { type: String, default: undefined },
41
+ utilityPanelLabel: { type: String, default: undefined },
42
+ panelResize: { type: Boolean, default: false },
43
+ panelWidths: { type: Object, default: undefined },
44
+ defaultPanelWidths: { type: Object, default: undefined },
45
+ onPanelResize: {
46
+ type: Function,
47
+ default: undefined,
48
+ },
49
+ panelMinWidth: { type: Number, default: 180 },
50
+ panelMaxWidth: { type: Number, default: 640 },
13
51
  class: { type: String, default: undefined },
14
52
  },
15
- setup(props, { slots, attrs }) {
53
+ emits: ["panelResize"],
54
+ setup(props, { slots, attrs, emit }) {
55
+ // Uncontrolled per-panel disclosure state (v1) — each accordion panel
56
+ // starts collapsed. Desktop rendering never reads these (CSS scopes the
57
+ // collapse to `@media (max-width: 48rem)`), so they have zero effect
58
+ // above the breakpoint.
59
+ const primaryRailPanelOpen = ref(false);
60
+ const navigationPanelOpen = ref(false);
61
+ const contextPanelOpen = ref(false);
62
+ const utilityPanelOpen = ref(false);
63
+ // ── Resizable panels (panelResize) ──────────────────────────────────────
64
+ // Controlled/uncontrolled mirrors RangeSlider.ts: `panelWidths` present
65
+ // (even as `{}`) means controlled — the component reads it but never
66
+ // writes it; otherwise widths live in `internalWidths`, seeded ONCE (at
67
+ // setup time) from `defaultPanelWidths`.
68
+ const internalWidths = ref({ ...props.defaultPanelWidths });
69
+ const navigationPanelEl = ref(null);
70
+ const contextPanelEl = ref(null);
71
+ const utilityPanelEl = ref(null);
72
+ function isWidthControlled() {
73
+ return props.panelWidths !== undefined;
74
+ }
75
+ function widthFor(key) {
76
+ const source = isWidthControlled() ? props.panelWidths : internalWidths.value;
77
+ return source?.[key];
78
+ }
79
+ function clampWidth(n) {
80
+ return Math.min(Math.max(n, props.panelMinWidth), props.panelMaxWidth);
81
+ }
82
+ // Current width for rendering/ARIA — always a concrete, clamped number so
83
+ // aria-valuenow is never NaN and is always within [aria-valuemin, aria-valuemax].
84
+ function displayWidth(key) {
85
+ return clampWidth(widthFor(key) ?? PANEL_NOMINAL_PX[key]);
86
+ }
87
+ function panelElFor(key) {
88
+ if (key === "navigationPanel")
89
+ return navigationPanelEl.value;
90
+ if (key === "contextPanel")
91
+ return contextPanelEl.value;
92
+ return utilityPanelEl.value;
93
+ }
94
+ function commitWidth(key, next) {
95
+ const clamped = clampWidth(next);
96
+ if (!isWidthControlled())
97
+ internalWidths.value = { ...internalWidths.value, [key]: clamped };
98
+ // `emit("panelResize")` already routes to an `onPanelResize` handler prop
99
+ // (Vue maps emitted events to their `onX` listeners), so calling
100
+ // `props.onPanelResize` here as well would fire the callback twice.
101
+ // Emit only.
102
+ emit("panelResize", key, clamped);
103
+ }
104
+ // Pointer-drag bookkeeping — plain (non-reactive) fields, never read from
105
+ // the render function, only from the pointer handlers below.
106
+ let dragKey = null;
107
+ let dragPositive = true;
108
+ let dragStartX = 0;
109
+ let dragStartWidth = 0;
110
+ function onHandlePointerDown(event, key, positive) {
111
+ const handle = event.currentTarget;
112
+ handle.setPointerCapture?.(event.pointerId);
113
+ dragKey = key;
114
+ dragPositive = positive;
115
+ dragStartX = event.clientX;
116
+ const measured = panelElFor(key)?.getBoundingClientRect().width ?? 0;
117
+ dragStartWidth = measured > 0 ? measured : displayWidth(key);
118
+ event.preventDefault();
119
+ }
120
+ function onHandlePointerMove(event) {
121
+ if (dragKey === null)
122
+ return;
123
+ const dx = event.clientX - dragStartX;
124
+ const delta = dragPositive ? dx : -dx;
125
+ commitWidth(dragKey, dragStartWidth + delta);
126
+ }
127
+ function onHandlePointerUp(event) {
128
+ if (dragKey === null)
129
+ return;
130
+ const handle = event.currentTarget;
131
+ if (handle.hasPointerCapture?.(event.pointerId))
132
+ handle.releasePointerCapture?.(event.pointerId);
133
+ dragKey = null;
134
+ }
135
+ // Arrow keys move the splitter itself (WAI-ARIA window-splitter pattern):
136
+ // for a "positive" (left-edge) panel, moving the splitter right grows it;
137
+ // for a "negative" (right-edge) panel, moving the splitter right shrinks
138
+ // it. Home/End always jump to the absolute clamp bounds.
139
+ function onHandleKeydown(event, key, positive) {
140
+ const current = displayWidth(key);
141
+ let next;
142
+ switch (event.key) {
143
+ case "ArrowLeft":
144
+ next = current + (positive ? -16 : 16);
145
+ break;
146
+ case "ArrowRight":
147
+ next = current + (positive ? 16 : -16);
148
+ break;
149
+ case "Home":
150
+ next = props.panelMinWidth;
151
+ break;
152
+ case "End":
153
+ next = props.panelMaxWidth;
154
+ break;
155
+ default:
156
+ return;
157
+ }
158
+ event.preventDefault();
159
+ commitWidth(key, next);
160
+ }
161
+ function renderResizeHandle(key, positive, ariaLabel) {
162
+ return h("div", {
163
+ class: "st-appShell__resizeHandle",
164
+ role: "separator",
165
+ "aria-orientation": "vertical",
166
+ tabindex: 0,
167
+ "aria-valuenow": displayWidth(key),
168
+ "aria-valuemin": props.panelMinWidth,
169
+ "aria-valuemax": props.panelMaxWidth,
170
+ "aria-label": `Resize ${ariaLabel}`,
171
+ onPointerdown: (event) => onHandlePointerDown(event, key, positive),
172
+ onPointermove: onHandlePointerMove,
173
+ onPointerup: onHandlePointerUp,
174
+ onPointercancel: onHandlePointerUp,
175
+ onKeydown: (event) => onHandleKeydown(event, key, positive),
176
+ });
177
+ }
178
+ // Renders a panel's `<aside>`. In `"accordion"` mode it wraps the slot
179
+ // content in a disclosure `<button>` + a SINGLE always-mounted
180
+ // `st-appShell__panelRegion` — the region is never conditionally
181
+ // unmounted, only resized/hidden via CSS, so panel content never
182
+ // remounts when it collapses/expands.
183
+ function renderPanel(opts) {
184
+ const { asideClass, ariaLabel, key, label, isOpen, toggle, content, elRef, resizeHandle } = opts;
185
+ const triggerId = `st-appShell-${key}-trigger`;
186
+ const regionId = `st-appShell-${key}-region`;
187
+ const asideProps = { class: asideClass, "aria-label": ariaLabel };
188
+ if (elRef)
189
+ asideProps.ref = elRef;
190
+ if (props.panelCollapse !== "accordion") {
191
+ const children = resizeHandle ? [...content, resizeHandle] : content;
192
+ return h("aside", asideProps, children);
193
+ }
194
+ const open = isOpen();
195
+ const children = [
196
+ h("button", {
197
+ type: "button",
198
+ class: "st-appShell__panelDisclosure",
199
+ "aria-expanded": open ? "true" : "false",
200
+ "aria-controls": regionId,
201
+ id: triggerId,
202
+ onClick: toggle,
203
+ }, [
204
+ h("span", { class: "st-appShell__panelDisclosureLabel" }, label),
205
+ h("span", {
206
+ class: classNames("st-appShell__panelDisclosureIcon", open && "st-appShell__panelDisclosureIcon--expanded"),
207
+ }, [h(ChevronDown, { size: 16, "aria-hidden": "true" })]),
208
+ ]),
209
+ h("div", {
210
+ class: classNames("st-appShell__panelRegion", !open && "st-appShell__panelRegion--collapsed"),
211
+ id: regionId,
212
+ role: "region",
213
+ "aria-labelledby": triggerId,
214
+ }, content),
215
+ ];
216
+ if (resizeHandle)
217
+ children.push(resizeHandle);
218
+ return h("aside", asideProps, children);
219
+ }
16
220
  return () => {
17
221
  if (props.variant === "site") {
18
222
  return h("div", { ...attrs, class: classNames("st-appShell st-appShell--site", props.class), "data-st-app-shell-variant": "site" }, slots.default?.());
19
223
  }
20
- return h("div", { ...attrs, class: classNames("st-appShell st-appShell--workspace", props.class), "data-st-app-shell-variant": "workspace", "data-utility-mode": props.utilityMode, "data-utility-side": props.utilitySide }, [
224
+ const navigationPanelLabelResolved = props.navigationPanelLabel ?? props.navigationLabel;
225
+ const contextPanelLabelResolved = props.contextPanelLabel ?? props.contextLabel;
226
+ const utilityPanelLabelResolved = props.utilityPanelLabel ?? props.utilityLabel;
227
+ // Only the CSS vars for panels with an explicit (controlled or
228
+ // committed) width are emitted — an untouched panel keeps deferring to
229
+ // its token default (styles.css), so a theme's own width override is
230
+ // never silently overridden just because `panelResize` is on.
231
+ let panelStyle;
232
+ if (props.panelResize) {
233
+ const style = {};
234
+ for (const key of Object.keys(PANEL_VAR)) {
235
+ const width = widthFor(key);
236
+ if (width !== undefined)
237
+ style[PANEL_VAR[key]] = `${clampWidth(width)}px`;
238
+ }
239
+ panelStyle = Object.keys(style).length ? style : undefined;
240
+ }
241
+ // `utilityPanel` mirrors a left panel (grow-on-drag-right) unless it
242
+ // sits on the right edge; the "bottom" side never renders a handle at
243
+ // all, so its `positive` value is never read.
244
+ const utilityPositive = props.utilitySide !== "right";
245
+ return h("div", {
246
+ ...attrs,
247
+ class: classNames("st-appShell st-appShell--workspace", props.class),
248
+ "data-st-app-shell-variant": "workspace",
249
+ "data-utility-mode": props.utilityMode,
250
+ "data-utility-side": props.utilitySide,
251
+ "data-panel-collapse": props.panelCollapse,
252
+ style: panelStyle,
253
+ }, [
21
254
  slots.topChrome ? h("div", { class: "st-appShell__topChrome" }, slots.topChrome()) : null,
22
255
  h("div", { class: "st-appShell__body" }, [
23
- slots.primaryRail ? h("aside", { class: "st-appShell__primaryRail", "aria-label": "Primary rail" }, slots.primaryRail()) : null,
24
- slots.navigationPanel ? h("aside", { class: "st-appShell__navigationPanel", "aria-label": props.navigationLabel }, slots.navigationPanel()) : null,
256
+ slots.primaryRail
257
+ ? renderPanel({
258
+ asideClass: "st-appShell__primaryRail",
259
+ ariaLabel: "Primary rail",
260
+ key: "primaryRail",
261
+ label: props.primaryRailLabel,
262
+ isOpen: () => primaryRailPanelOpen.value,
263
+ toggle: () => (primaryRailPanelOpen.value = !primaryRailPanelOpen.value),
264
+ content: slots.primaryRail(),
265
+ // No resize handle here: `primaryRail` is a fixed-width icon
266
+ // rail (à la VS Code's activity bar), not a resizable panel —
267
+ // see `AppShellPanelKey`.
268
+ })
269
+ : null,
270
+ slots.navigationPanel
271
+ ? renderPanel({
272
+ asideClass: "st-appShell__navigationPanel",
273
+ ariaLabel: props.navigationLabel,
274
+ key: "navigationPanel",
275
+ label: navigationPanelLabelResolved,
276
+ isOpen: () => navigationPanelOpen.value,
277
+ toggle: () => (navigationPanelOpen.value = !navigationPanelOpen.value),
278
+ content: slots.navigationPanel(),
279
+ elRef: navigationPanelEl,
280
+ resizeHandle: props.panelResize ? renderResizeHandle("navigationPanel", true, props.navigationLabel) : null,
281
+ })
282
+ : null,
25
283
  h("main", { class: "st-appShell__main", id: props.mainId }, slots.main?.() ?? slots.default?.()),
26
- slots.contextPanel ? h("aside", { class: "st-appShell__contextPanel", "aria-label": props.contextLabel }, slots.contextPanel()) : null,
27
- slots.utilityPanel ? h("aside", { class: "st-appShell__utilityPanel", "aria-label": props.utilityLabel }, slots.utilityPanel()) : null,
284
+ slots.contextPanel
285
+ ? renderPanel({
286
+ asideClass: "st-appShell__contextPanel",
287
+ ariaLabel: props.contextLabel,
288
+ key: "contextPanel",
289
+ label: contextPanelLabelResolved,
290
+ isOpen: () => contextPanelOpen.value,
291
+ toggle: () => (contextPanelOpen.value = !contextPanelOpen.value),
292
+ content: slots.contextPanel(),
293
+ elRef: contextPanelEl,
294
+ resizeHandle: props.panelResize ? renderResizeHandle("contextPanel", false, props.contextLabel) : null,
295
+ })
296
+ : null,
297
+ slots.utilityPanel
298
+ ? renderPanel({
299
+ asideClass: "st-appShell__utilityPanel",
300
+ ariaLabel: props.utilityLabel,
301
+ key: "utilityPanel",
302
+ label: utilityPanelLabelResolved,
303
+ isOpen: () => utilityPanelOpen.value,
304
+ toggle: () => (utilityPanelOpen.value = !utilityPanelOpen.value),
305
+ content: slots.utilityPanel(),
306
+ elRef: utilityPanelEl,
307
+ resizeHandle: props.panelResize && props.utilitySide !== "bottom"
308
+ ? renderResizeHandle("utilityPanel", utilityPositive, props.utilityLabel)
309
+ : null,
310
+ })
311
+ : null,
28
312
  ]),
29
313
  slots.bottomPanel ? h("section", { class: "st-appShell__bottomPanel", "aria-label": "Workspace tools" }, slots.bottomPanel()) : null,
30
314
  ]);
@@ -1 +1 @@
1
- {"version":3,"file":"AppShell.js","sourceRoot":"","sources":["../src/AppShell.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AppShell.js","sourceRoot":"","sources":["../src/AppShell.ts"],"names":[],"mappings":"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"}
@@ -284,7 +284,7 @@ export declare const BarChart: import("vue").DefineComponent<import("vue").Extra
284
284
  onSelect: (key: string) => void;
285
285
  height: number;
286
286
  width: number;
287
- orientation: "horizontal" | "vertical";
287
+ orientation: "vertical" | "horizontal";
288
288
  scale: ChartScale;
289
289
  annotations: ChartAnnotation[];
290
290
  dataLabels: DataLabelsProp;
@@ -69,6 +69,6 @@ export declare const BulletChart: import("vue").DefineComponent<import("vue").Ex
69
69
  data: BulletChartDatum[];
70
70
  height: number;
71
71
  width: number;
72
- orientation: "horizontal" | "vertical";
72
+ orientation: "vertical" | "horizontal";
73
73
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
74
74
  //# sourceMappingURL=BulletChart.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Calendar.d.ts","sourceRoot":"","sources":["../src/Calendar.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;AAI3E,MAAM,MAAM,aAAa,GAAG;IAC1B,wEAAwE;IACxE,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC1C,+CAA+C;IAC/C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAwCF,eAAO,MAAM,QAAQ;;cAI6B,MAAM,aAAa;;;;cAIlC,MAAM,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI;;;;;;;;;;;;;;;;cAMnC,MAAM,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;cAVG,MAAM,aAAa;;;;cAIlC,MAAM,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI;;;;;;;;;;;;;;;;cAMnC,MAAM,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBANE,aAAa,KAAK,IAAI;;;;;;;;;;4EAybrE,CAAC"}
1
+ {"version":3,"file":"Calendar.d.ts","sourceRoot":"","sources":["../src/Calendar.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;AAI3E,MAAM,MAAM,aAAa,GAAG;IAC1B,wEAAwE;IACxE,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC1C,+CAA+C;IAC/C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAwCF,eAAO,MAAM,QAAQ;;cAI6B,MAAM,aAAa;;;;cAIlC,MAAM,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI;;;;;;;;;;;;;;;;cAMnC,MAAM,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;cAVG,MAAM,aAAa;;;;cAIlC,MAAM,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI;;;;;;;;;;;;;;;;cAMnC,MAAM,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBANE,aAAa,KAAK,IAAI;;;;;;;;;;4EA2brE,CAAC"}
package/dist/Calendar.js CHANGED
@@ -285,8 +285,10 @@ export const Calendar = defineComponent({
285
285
  if (props.value === undefined)
286
286
  internal.value = next;
287
287
  emit("update:modelValue", next);
288
+ // `emit("change")` already routes to an `onChange` handler prop (Vue maps
289
+ // emitted events to their `onX` listeners), so calling `props.onChange`
290
+ // here as well would fire the callback twice. Emit only.
288
291
  emit("change", next);
289
- props.onChange?.(next);
290
292
  };
291
293
  return () => {
292
294
  const activeValue = props.value ?? internal.value;