@sentropic/design-system-vue 0.36.57 → 0.36.59

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,30 +1,144 @@
1
- import { defineComponent, h } from "vue";
1
+ import { defineComponent, h, onUnmounted, ref, watch } from "vue";
2
2
  import { classNames } from "./classNames.js";
3
3
  import { Menu } from "./Menu.js";
4
+ // Anchor spacing between panel and trigger.
5
+ const MENU_POPOVER_GAP = 4;
6
+ // Anti-overflow margin between the panel and the viewport edge.
7
+ const MENU_POPOVER_VIEWPORT_MARGIN = 8;
8
+ // Height floor: below this threshold we keep a usable scrollable window
9
+ // rather than a crushed menu (rare case of a trigger glued to the edge).
10
+ const MENU_POPOVER_MIN_HEIGHT = 160;
11
+ function menuPopoverIsWithin(event, node) {
12
+ if (!node)
13
+ return false;
14
+ const path = typeof event.composedPath === "function"
15
+ ? event.composedPath()
16
+ : [];
17
+ if (path.includes(node))
18
+ return true;
19
+ const target = event.target;
20
+ return Boolean(target && node.contains(target));
21
+ }
4
22
  export const MenuPopover = defineComponent({
5
23
  name: "MenuPopover",
6
24
  props: {
7
25
  items: { type: Array, default: () => [] },
8
- open: { type: Boolean, default: true },
26
+ open: { type: Boolean, default: undefined },
27
+ trigger: { type: Object, default: null },
9
28
  placement: { type: String, default: "bottom-start" },
29
+ align: { type: String, default: undefined },
10
30
  label: { type: String, default: undefined },
11
31
  class: { type: String, default: undefined },
32
+ closeOnOutside: { type: Boolean, default: true },
33
+ closeOnEscape: { type: Boolean, default: true },
12
34
  },
13
- setup(props, { slots, attrs }) {
35
+ emits: ["update:open"],
36
+ setup(props, { emit, slots, attrs }) {
37
+ const localOpen = ref(props.open ?? false);
38
+ const panelRef = ref(null);
39
+ const top = ref(0);
40
+ const left = ref(0);
41
+ const maxHeight = ref(0);
42
+ const alignEnd = ref(false);
43
+ const alignCenter = ref(false);
44
+ const isOpen = () => (props.open !== undefined ? props.open : localOpen.value);
45
+ const setOpen = (value) => {
46
+ if (props.open === undefined)
47
+ localOpen.value = value;
48
+ emit("update:open", value);
49
+ };
50
+ function computePosition() {
51
+ const trigger = props.trigger;
52
+ if (!trigger)
53
+ return;
54
+ const rect = trigger.getBoundingClientRect();
55
+ const verticalUp = props.placement === "top-start" || props.placement === "top-end";
56
+ const horizontalEnd = props.placement === "bottom-end" || props.placement === "top-end";
57
+ const resolvedAlign = props.align ?? (horizontalEnd ? "end" : "start");
58
+ alignEnd.value = resolvedAlign === "end";
59
+ alignCenter.value = resolvedAlign === "center";
60
+ if (verticalUp) {
61
+ // Panel bottom edge sits above the trigger (transform handles the
62
+ // flip); available space is what's ABOVE the trigger.
63
+ top.value = rect.top + window.scrollY - MENU_POPOVER_GAP;
64
+ maxHeight.value = Math.max(rect.top - MENU_POPOVER_GAP - MENU_POPOVER_VIEWPORT_MARGIN, MENU_POPOVER_MIN_HEIGHT);
65
+ }
66
+ else {
67
+ top.value = rect.bottom + window.scrollY + MENU_POPOVER_GAP;
68
+ // Space actually available BELOW the trigger — `max-height: 100vh`
69
+ // alone ignores the panel's offset and overflows past the bottom edge.
70
+ maxHeight.value = Math.max(window.innerHeight - rect.bottom - MENU_POPOVER_GAP - MENU_POPOVER_VIEWPORT_MARGIN, MENU_POPOVER_MIN_HEIGHT);
71
+ }
72
+ if (resolvedAlign === "end") {
73
+ left.value = rect.right + window.scrollX;
74
+ }
75
+ else if (resolvedAlign === "center") {
76
+ left.value = rect.left + window.scrollX + rect.width / 2;
77
+ }
78
+ else {
79
+ left.value = rect.left + window.scrollX;
80
+ }
81
+ }
82
+ let stopPositionTracking = null;
83
+ let stopCloseHandlers = null;
84
+ const teardown = () => {
85
+ stopPositionTracking?.();
86
+ stopPositionTracking = null;
87
+ stopCloseHandlers?.();
88
+ stopCloseHandlers = null;
89
+ };
90
+ watch(() => isOpen(), (openNow) => {
91
+ teardown();
92
+ if (!openNow)
93
+ return;
94
+ computePosition();
95
+ const onScroll = () => computePosition();
96
+ const onResize = () => computePosition();
97
+ window.addEventListener("scroll", onScroll, true);
98
+ window.addEventListener("resize", onResize);
99
+ stopPositionTracking = () => {
100
+ window.removeEventListener("scroll", onScroll, true);
101
+ window.removeEventListener("resize", onResize);
102
+ };
103
+ const onPointerDown = (event) => {
104
+ if (!props.closeOnOutside)
105
+ return;
106
+ if (menuPopoverIsWithin(event, panelRef.value))
107
+ return;
108
+ if (menuPopoverIsWithin(event, props.trigger))
109
+ return;
110
+ setOpen(false);
111
+ };
112
+ const onKeyDown = (event) => {
113
+ if (!props.closeOnEscape)
114
+ return;
115
+ if (event.key === "Escape") {
116
+ event.preventDefault();
117
+ setOpen(false);
118
+ }
119
+ };
120
+ window.addEventListener("pointerdown", onPointerDown);
121
+ window.addEventListener("keydown", onKeyDown);
122
+ stopCloseHandlers = () => {
123
+ window.removeEventListener("pointerdown", onPointerDown);
124
+ window.removeEventListener("keydown", onKeyDown);
125
+ };
126
+ }, { immediate: true });
127
+ onUnmounted(teardown);
14
128
  return () => {
129
+ if (!isOpen())
130
+ return null;
131
+ const style = { top: `${top.value}px`, left: `${left.value}px` };
132
+ if (maxHeight.value)
133
+ style.maxHeight = `${maxHeight.value}px`;
15
134
  return h("div", {
16
135
  ...attrs,
136
+ ref: panelRef,
17
137
  role: "dialog",
18
138
  "aria-label": props.label,
19
- class: classNames("st-menuPopover", `st-menuPopover--${props.placement}`, props.class),
20
- }, [
21
- slots.trigger?.(),
22
- props.open
23
- ? h("div", { class: "st-menuPopover__content" }, props.items && props.items.length
24
- ? h(Menu, { items: props.items, role: "presentation" })
25
- : slots.default?.())
26
- : null,
27
- ]);
139
+ class: classNames("st-menuPopover", `st-menuPopover--${props.placement}`, alignEnd.value ? "st-menuPopover--alignEnd" : null, alignCenter.value ? "st-menuPopover--alignCenter" : null, props.class),
140
+ style,
141
+ }, props.items && props.items.length ? h(Menu, { items: props.items, role: "presentation" }) : slots.default?.());
28
142
  };
29
143
  },
30
144
  });
@@ -1 +1 @@
1
- {"version":3,"file":"MenuPopover.js","sourceRoot":"","sources":["../src/MenuPopover.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAgBjC,MAAM,CAAC,MAAM,WAAW,GAAG,eAAe,CAAC;IACzC,IAAI,EAAE,aAAa;IACnB,KAAK,EAAE;QACL,KAAK,EAAE,EAAE,IAAI,EAAE,KAAyB,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;QAC7D,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;QACtC,SAAS,EAAE,EAAE,IAAI,EAAE,MAAoC,EAAE,OAAO,EAAE,cAAc,EAAE;QAClF,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE;QAC3C,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE;KAC5C;IACD,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;QAC3B,OAAO,GAAG,EAAE;YACV,OAAO,CAAC,CACN,KAAK,EACL;gBACE,GAAG,KAAK;gBACR,IAAI,EAAE,QAAQ;gBACd,YAAY,EAAE,KAAK,CAAC,KAAK;gBACzB,KAAK,EAAE,UAAU,CACf,gBAAgB,EAChB,mBAAmB,KAAK,CAAC,SAAS,EAAE,EACpC,KAAK,CAAC,KAAK,CACZ;aACF,EACD;gBACE,KAAK,CAAC,OAAO,EAAE,EAAE;gBACjB,KAAK,CAAC,IAAI;oBACR,CAAC,CAAC,CAAC,CACC,KAAK,EACL,EAAE,KAAK,EAAE,yBAAyB,EAAE,EACpC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM;wBAC/B,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;wBACvD,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CACtB;oBACH,CAAC,CAAC,IAAI;aACT,CACF,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"MenuPopover.js","sourceRoot":"","sources":["../src/MenuPopover.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,KAAK,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAsBjC,4CAA4C;AAC5C,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAC3B,gEAAgE;AAChE,MAAM,4BAA4B,GAAG,CAAC,CAAC;AACvC,wEAAwE;AACxE,yEAAyE;AACzE,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAEpC,SAAS,mBAAmB,CAAC,KAAY,EAAE,IAAgC;IACzE,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,IAAI,GACR,OAAQ,KAAwD,CAAC,YAAY,KAAK,UAAU;QAC1F,CAAC,CAAE,KAAuD,CAAC,YAAY,EAAE;QACzE,CAAC,CAAC,EAAE,CAAC;IACT,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB,CAAC;IAC3C,OAAO,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,eAAe,CAAC;IACzC,IAAI,EAAE,aAAa;IACnB,KAAK,EAAE;QACL,KAAK,EAAE,EAAE,IAAI,EAAE,KAAyB,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;QAC7D,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE;QAC3C,OAAO,EAAE,EAAE,IAAI,EAAE,MAA6C,EAAE,OAAO,EAAE,IAAI,EAAE;QAC/E,SAAS,EAAE,EAAE,IAAI,EAAE,MAAoC,EAAE,OAAO,EAAE,cAAc,EAAE;QAClF,KAAK,EAAE,EAAE,IAAI,EAAE,MAA4C,EAAE,OAAO,EAAE,SAAS,EAAE;QACjF,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE;QAC3C,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE;QAC3C,cAAc,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;QAChD,aAAa,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;KAChD;IACD,KAAK,EAAE,CAAC,aAAa,CAAC;IACtB,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE;QACjC,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,GAAG,CAAqB,IAAI,CAAC,CAAC;QAE/C,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACnB,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QAC5B,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QAE/B,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC/E,MAAM,OAAO,GAAG,CAAC,KAAc,EAAE,EAAE;YACjC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;gBAAE,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC;YACtD,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QAC7B,CAAC,CAAC;QAEF,SAAS,eAAe;YACtB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;YAC9B,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrB,MAAM,IAAI,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;YAC7C,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,KAAK,WAAW,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC;YACpF,MAAM,aAAa,GAAG,KAAK,CAAC,SAAS,KAAK,YAAY,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC;YACxF,MAAM,aAAa,GAAqB,KAAK,CAAC,KAAK,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAEzF,QAAQ,CAAC,KAAK,GAAG,aAAa,KAAK,KAAK,CAAC;YACzC,WAAW,CAAC,KAAK,GAAG,aAAa,KAAK,QAAQ,CAAC;YAE/C,IAAI,UAAU,EAAE,CAAC;gBACf,kEAAkE;gBAClE,sDAAsD;gBACtD,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,OAAO,GAAG,gBAAgB,CAAC;gBACzD,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,gBAAgB,GAAG,4BAA4B,EAAE,uBAAuB,CAAC,CAAC;YAClH,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,GAAG,gBAAgB,CAAC;gBAC5D,mEAAmE;gBACnE,uEAAuE;gBACvE,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CACxB,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,GAAG,gBAAgB,GAAG,4BAA4B,EAClF,uBAAuB,CACxB,CAAC;YACJ,CAAC;YAED,IAAI,aAAa,KAAK,KAAK,EAAE,CAAC;gBAC5B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC;YAC3C,CAAC;iBAAM,IAAI,aAAa,KAAK,QAAQ,EAAE,CAAC;gBACtC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;YAC3D,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;YAC1C,CAAC;QACH,CAAC;QAED,IAAI,oBAAoB,GAAwB,IAAI,CAAC;QACrD,IAAI,iBAAiB,GAAwB,IAAI,CAAC;QAElD,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,oBAAoB,EAAE,EAAE,CAAC;YACzB,oBAAoB,GAAG,IAAI,CAAC;YAC5B,iBAAiB,EAAE,EAAE,CAAC;YACtB,iBAAiB,GAAG,IAAI,CAAC;QAC3B,CAAC,CAAC;QAEF,KAAK,CACH,GAAG,EAAE,CAAC,MAAM,EAAE,EACd,CAAC,OAAO,EAAE,EAAE;YACV,QAAQ,EAAE,CAAC;YACX,IAAI,CAAC,OAAO;gBAAE,OAAO;YAErB,eAAe,EAAE,CAAC;YAClB,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,eAAe,EAAE,CAAC;YACzC,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,eAAe,EAAE,CAAC;YACzC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;YAClD,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC5C,oBAAoB,GAAG,GAAG,EAAE;gBAC1B,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;gBACrD,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACjD,CAAC,CAAC;YAEF,MAAM,aAAa,GAAG,CAAC,KAAmB,EAAE,EAAE;gBAC5C,IAAI,CAAC,KAAK,CAAC,cAAc;oBAAE,OAAO;gBAClC,IAAI,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC;oBAAE,OAAO;gBACvD,IAAI,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;oBAAE,OAAO;gBACtD,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC,CAAC;YACF,MAAM,SAAS,GAAG,CAAC,KAAoB,EAAE,EAAE;gBACzC,IAAI,CAAC,KAAK,CAAC,aAAa;oBAAE,OAAO;gBACjC,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;oBAC3B,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,OAAO,CAAC,KAAK,CAAC,CAAC;gBACjB,CAAC;YACH,CAAC,CAAC;YACF,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;YACtD,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAC9C,iBAAiB,GAAG,GAAG,EAAE;gBACvB,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;gBACzD,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YACnD,CAAC,CAAC;QACJ,CAAC,EACD,EAAE,SAAS,EAAE,IAAI,EAAE,CACpB,CAAC;QAEF,WAAW,CAAC,QAAQ,CAAC,CAAC;QAEtB,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,MAAM,EAAE;gBAAE,OAAO,IAAI,CAAC;YAE3B,MAAM,KAAK,GAA2B,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,KAAK,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACzF,IAAI,SAAS,CAAC,KAAK;gBAAE,KAAK,CAAC,SAAS,GAAG,GAAG,SAAS,CAAC,KAAK,IAAI,CAAC;YAE9D,OAAO,CAAC,CACN,KAAK,EACL;gBACE,GAAG,KAAK;gBACR,GAAG,EAAE,QAAQ;gBACb,IAAI,EAAE,QAAQ;gBACd,YAAY,EAAE,KAAK,CAAC,KAAK;gBACzB,KAAK,EAAE,UAAU,CACf,gBAAgB,EAChB,mBAAmB,KAAK,CAAC,SAAS,EAAE,EACpC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,IAAI,EAClD,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,IAAI,EACxD,KAAK,CAAC,KAAK,CACZ;gBACD,KAAK;aACN,EACD,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAC9G,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,50 @@
1
+ export type PanelSectionProps = {
2
+ id: string;
3
+ label: string;
4
+ class?: string;
5
+ };
6
+ /**
7
+ * One collapsible region inside a {@link PanelStack}. Registers itself with
8
+ * the parent stack (via provide/inject) on mount, in DOM order, so the stack
9
+ * can resolve its scroll-owner fallbacks. A PanelSection outside a PanelStack
10
+ * (no injected context) falls back to a fully expanded, scroll-owning,
11
+ * non-primary section so it still renders sanely in isolation — but the
12
+ * component is designed to always live inside a stack.
13
+ *
14
+ * Content (default slot) is mounted once and only ever hidden/resized via
15
+ * CSS classes on collapse — never removed from the DOM — so a chat session,
16
+ * map or other stateful widget survives collapse/expand without remounting.
17
+ * Slots: default (content), actions (header-trailing controls).
18
+ */
19
+ export declare const PanelSection: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
20
+ id: {
21
+ type: StringConstructor;
22
+ required: true;
23
+ };
24
+ label: {
25
+ type: StringConstructor;
26
+ required: true;
27
+ };
28
+ class: {
29
+ type: StringConstructor;
30
+ default: undefined;
31
+ };
32
+ }>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
33
+ [key: string]: any;
34
+ }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
35
+ id: {
36
+ type: StringConstructor;
37
+ required: true;
38
+ };
39
+ label: {
40
+ type: StringConstructor;
41
+ required: true;
42
+ };
43
+ class: {
44
+ type: StringConstructor;
45
+ default: undefined;
46
+ };
47
+ }>> & Readonly<{}>, {
48
+ class: string;
49
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
50
+ //# sourceMappingURL=PanelSection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PanelSection.d.ts","sourceRoot":"","sources":["../src/PanelSection.ts"],"names":[],"mappings":"AAcA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4EAqHvB,CAAC"}
@@ -0,0 +1,102 @@
1
+ import { defineComponent, h, inject, onBeforeUnmount, onMounted, ref, watch, } from "vue";
2
+ import { ChevronDown } from "lucide-vue-next";
3
+ import { classNames } from "./classNames.js";
4
+ import { PANEL_STACK_KEY } from "./PanelStack.js";
5
+ /**
6
+ * One collapsible region inside a {@link PanelStack}. Registers itself with
7
+ * the parent stack (via provide/inject) on mount, in DOM order, so the stack
8
+ * can resolve its scroll-owner fallbacks. A PanelSection outside a PanelStack
9
+ * (no injected context) falls back to a fully expanded, scroll-owning,
10
+ * non-primary section so it still renders sanely in isolation — but the
11
+ * component is designed to always live inside a stack.
12
+ *
13
+ * Content (default slot) is mounted once and only ever hidden/resized via
14
+ * CSS classes on collapse — never removed from the DOM — so a chat session,
15
+ * map or other stateful widget survives collapse/expand without remounting.
16
+ * Slots: default (content), actions (header-trailing controls).
17
+ */
18
+ export const PanelSection = defineComponent({
19
+ name: "PanelSection",
20
+ props: {
21
+ id: { type: String, required: true },
22
+ label: { type: String, required: true },
23
+ class: { type: String, default: undefined },
24
+ },
25
+ setup(props, { slots, attrs }) {
26
+ const stack = inject(PANEL_STACK_KEY, undefined);
27
+ const rootEl = ref(null);
28
+ const headerEl = ref(null);
29
+ // Register with the parent stack (mount order) so it can fall back to
30
+ // "the first section" whenever nothing else designates a scroll owner
31
+ // (unset or stale `expanded`/`primary`) — see PanelStack.ts's `register`.
32
+ // Same register-in-onMounted / return-the-unregister-callback idiom as
33
+ // SelectableRow.
34
+ let unregister = null;
35
+ function doRegister() {
36
+ unregister?.();
37
+ unregister = null;
38
+ if (stack && rootEl.value && headerEl.value) {
39
+ unregister = stack.register(props.id, rootEl.value, headerEl.value);
40
+ }
41
+ }
42
+ onMounted(() => doRegister());
43
+ // Re-register under the new id if it ever changes while mounted.
44
+ watch(() => props.id, () => doRegister());
45
+ onBeforeUnmount(() => {
46
+ unregister?.();
47
+ unregister = null;
48
+ });
49
+ function onTriggerClick() {
50
+ stack?.toggle(props.id);
51
+ }
52
+ return () => {
53
+ const triggerId = `st-panelSection-trigger-${props.id}`;
54
+ const regionId = `st-panelSection-region-${props.id}`;
55
+ const isPrimary = stack?.isPrimary(props.id) ?? false;
56
+ const expanded = stack?.isExpanded(props.id) ?? true;
57
+ const scrollOwner = stack?.isScrollOwner(props.id) ?? true;
58
+ const rootClasses = classNames("st-panelSection", scrollOwner && "st-panelSection--scrollOwner", props.class);
59
+ const bodyClasses = classNames("st-panelSection__body", scrollOwner
60
+ ? "st-panelSection__body--scrollOwner"
61
+ : !expanded
62
+ ? "st-panelSection__body--collapsed"
63
+ : null);
64
+ const headingChild = isPrimary
65
+ ? h("span", { class: "st-panelSection__title st-panelSection__title--primary", id: triggerId }, props.label)
66
+ : h("button", {
67
+ type: "button",
68
+ class: "st-panelSection__trigger",
69
+ "aria-expanded": expanded ? "true" : "false",
70
+ "aria-controls": regionId,
71
+ id: triggerId,
72
+ onClick: onTriggerClick,
73
+ }, [
74
+ h("span", { class: "st-panelSection__title" }, props.label),
75
+ h("span", {
76
+ class: classNames("st-panelSection__icon", expanded && "st-panelSection__icon--expanded"),
77
+ "aria-hidden": "true",
78
+ }, [h(ChevronDown, { size: 18, strokeWidth: 2.25, "aria-hidden": "true" })]),
79
+ ]);
80
+ return h("div", {
81
+ ...attrs,
82
+ class: rootClasses,
83
+ "data-panel-section-id": props.id,
84
+ ref: rootEl,
85
+ }, [
86
+ h("div", { class: "st-panelSection__header", ref: headerEl }, [
87
+ h("h3", { class: "st-panelSection__heading" }, [headingChild]),
88
+ slots.actions ? h("div", { class: "st-panelSection__actions" }, slots.actions()) : null,
89
+ ]),
90
+ // Mounted once, always — collapsing is purely a class/CSS concern
91
+ // (sizing + hiding this region), never a conditional block.
92
+ h("div", {
93
+ class: bodyClasses,
94
+ role: "region",
95
+ id: regionId,
96
+ "aria-labelledby": triggerId,
97
+ }, slots.default?.()),
98
+ ]);
99
+ };
100
+ },
101
+ });
102
+ //# sourceMappingURL=PanelSection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PanelSection.js","sourceRoot":"","sources":["../src/PanelSection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,158 @@
1
+ import { type InjectionKey, type PropType } from "vue";
2
+ export type PanelStackShape = "split-primary" | "sticky-item";
3
+ /**
4
+ * Bound ratified by the chat consumer lane: beyond 4 sections, stacking
5
+ * collapsible regions in a pane capped at 640px makes scrolling unmanageable
6
+ * and the single-owner rule becomes untenable. Enforced as a dev-time
7
+ * `console.warn` in `register()` (this package's established convention —
8
+ * see NavActionStack/WaterfallChart — is to warn and degrade, never throw or
9
+ * silently truncate); exported here so the bound is also visible through
10
+ * types/docs to a consumer reading `PanelStackProps`.
11
+ */
12
+ export declare const PANEL_STACK_MAX_SECTIONS = 4;
13
+ export type PanelStackProps = {
14
+ /** "sticky-item" (default): one section expanded at a time, all headers stay visible.
15
+ "split-primary": the `primary` section is always expanded and owns the scroll;
16
+ the others are content-sized disclosures. */
17
+ shape?: PanelStackShape;
18
+ /** Accessible name for the stack region. */
19
+ label?: string;
20
+ /** sticky-item, controlled: id of the expanded section. */
21
+ expanded?: string | null;
22
+ /** sticky-item, uncontrolled seed. */
23
+ defaultExpanded?: string | null;
24
+ onExpandedChange?: (id: string | null) => void;
25
+ /**
26
+ * split-primary: id of the section that owns the scroll. Falls back to the
27
+ * first EXPANDED section (DOM order) when unset or stale, and — if nothing
28
+ * is expanded — to the first registered section, so the stack never
29
+ * degrades to zero scroll owners.
30
+ */
31
+ primary?: string;
32
+ /** Usable floor for the primary section, in px. While the primary sits above it the
33
+ primary absorbs overflow; once it would drop below, a secondary auto-collapses
34
+ instead of compressing the primary further. Default 160. */
35
+ primaryMinHeight?: number;
36
+ class?: string;
37
+ };
38
+ /**
39
+ * Context contract shared with PanelSection. Every shape-dependent branch
40
+ * (sticky-item vs split-primary) is decided HERE and only here — PanelSection
41
+ * never reads `shape`, it only calls these four functions/callback. If the
42
+ * consumer-lane contract for these two shapes changes, this is the one place
43
+ * to touch.
44
+ */
45
+ export declare const PANEL_STACK_KEY: InjectionKey<PanelStackContext>;
46
+ export type PanelStackContext = {
47
+ /** Is this section the (non-collapsible) primary of a split-primary stack? */
48
+ isPrimary: (id: string) => boolean;
49
+ /** Is this section currently expanded (body visible, content-sized or scrolling)? */
50
+ isExpanded: (id: string) => boolean;
51
+ /** Is this section's body THE single scroll owner right now (flex:1 1 0, overflow:auto)? */
52
+ isScrollOwner: (id: string) => boolean;
53
+ /** Header was activated (click / Space / Enter on the disclosure button). */
54
+ toggle: (id: string) => void;
55
+ /**
56
+ * Register a section's root AND header element, in mount/DOM order;
57
+ * returns an unregister callback. NOT just bookkeeping — the stack falls
58
+ * back to the first registered section as the scroll owner whenever
59
+ * nothing else designates one (unset/stale `expanded` or `primary`), so
60
+ * the invariant "exactly one scroll owner whenever the stack has ≥1
61
+ * section" holds even for a misconfigured or dynamically-changing stack.
62
+ * `headerEl` is used only by split-primary's auto-collapse measurement
63
+ * (the header of whichever section is CURRENTLY primary is observed for
64
+ * its height); sticky-item ignores it.
65
+ */
66
+ register: (id: string, rootEl: HTMLElement, headerEl: HTMLElement) => () => void;
67
+ };
68
+ export declare const PRIMARY_MIN_BLOCK_SIZE_PX = 160;
69
+ /**
70
+ * Stacks several PanelSection children inside ONE panel so a docked chat can
71
+ * share a pane with other content. The invariant is the whole point: exactly
72
+ * one element in the stack has `overflow: auto` at any moment, and the stack
73
+ * itself NEVER scrolls — see PanelStack.svelte (the frozen reference this
74
+ * component mirrors) and styles.css's `.st-panelStack` rule.
75
+ */
76
+ export declare const PanelStack: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
77
+ shape: {
78
+ type: PropType<PanelStackShape>;
79
+ default: string;
80
+ };
81
+ label: {
82
+ type: StringConstructor;
83
+ default: undefined;
84
+ };
85
+ expanded: {
86
+ type: PropType<string | null>;
87
+ default: undefined;
88
+ };
89
+ defaultExpanded: {
90
+ type: PropType<string | null>;
91
+ default: null;
92
+ };
93
+ onExpandedChange: {
94
+ type: PropType<(id: string | null) => void>;
95
+ default: undefined;
96
+ };
97
+ primary: {
98
+ type: StringConstructor;
99
+ default: undefined;
100
+ };
101
+ primaryMinHeight: {
102
+ type: NumberConstructor;
103
+ default: undefined;
104
+ };
105
+ class: {
106
+ type: StringConstructor;
107
+ default: undefined;
108
+ };
109
+ }>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
110
+ [key: string]: any;
111
+ }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
112
+ expandedChange: (_id: string | null) => true;
113
+ }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
114
+ shape: {
115
+ type: PropType<PanelStackShape>;
116
+ default: string;
117
+ };
118
+ label: {
119
+ type: StringConstructor;
120
+ default: undefined;
121
+ };
122
+ expanded: {
123
+ type: PropType<string | null>;
124
+ default: undefined;
125
+ };
126
+ defaultExpanded: {
127
+ type: PropType<string | null>;
128
+ default: null;
129
+ };
130
+ onExpandedChange: {
131
+ type: PropType<(id: string | null) => void>;
132
+ default: undefined;
133
+ };
134
+ primary: {
135
+ type: StringConstructor;
136
+ default: undefined;
137
+ };
138
+ primaryMinHeight: {
139
+ type: NumberConstructor;
140
+ default: undefined;
141
+ };
142
+ class: {
143
+ type: StringConstructor;
144
+ default: undefined;
145
+ };
146
+ }>> & Readonly<{
147
+ onExpandedChange?: ((_id: string | null) => any) | undefined;
148
+ }>, {
149
+ class: string;
150
+ label: string;
151
+ shape: PanelStackShape;
152
+ expanded: string | null;
153
+ primary: string;
154
+ defaultExpanded: string | null;
155
+ onExpandedChange: (id: string | null) => void;
156
+ primaryMinHeight: number;
157
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
158
+ //# sourceMappingURL=PanelStack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PanelStack.d.ts","sourceRoot":"","sources":["../src/PanelStack.ts"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,YAAY,EACjB,KAAK,QAAQ,EACd,MAAM,KAAK,CAAC;AAGb,MAAM,MAAM,eAAe,GAAG,eAAe,GAAG,aAAa,CAAC;AAE9D;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C,MAAM,MAAM,eAAe,GAAG;IAC5B;;oDAEgD;IAChD,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,sCAAsC;IACtC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gBAAgB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC/C;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;mEAE+D;IAC/D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAKF;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,EAAE,YAAY,CAAC,iBAAiB,CAA4B,CAAC;AAEzF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,8EAA8E;IAC9E,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IACnC,qFAAqF;IACrF,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IACpC,4FAA4F;IAC5F,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC,6EAA6E;IAC7E,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B;;;;;;;;;;OAUG;IACH,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,KAAK,MAAM,IAAI,CAAC;CAClF,CAAC;AA4BF,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAE7C;;;;;;GAMG;AACH,eAAO,MAAM,UAAU;;cAGM,QAAQ,CAAC,eAAe,CAAC;;;;;;;;cAEtB,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC;;;;cAChB,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC;;;;cAEtC,QAAQ,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;;;;;;;;;;;;;;;;;;0BAQnC,MAAM,GAAG,IAAI;;;cAbV,QAAQ,CAAC,eAAe,CAAC;;;;;;;;cAEtB,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC;;;;cAChB,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC;;;;cAEtC,QAAQ,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;2BAAvB,MAAM,GAAG,IAAI,KAAK,IAAI;;4EAsY1D,CAAC"}