@kerfjs/ui 5.0.0-beta.76 → 5.0.0-beta.77

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.
Files changed (101) hide show
  1. package/README.md +12 -0
  2. package/ai/component-catalog.json +212 -19
  3. package/ai/component-composition.json +122 -11
  4. package/ai/components/nav-stack.md +1 -0
  5. package/ai/components/select.md +1 -0
  6. package/ai/components/split-view.md +1 -0
  7. package/ai/components/text.md +4 -2
  8. package/ai/components/toolbar-control-group.md +20 -3
  9. package/ai/components/toolbar-text.md +19 -4
  10. package/ai/components/toolbar.md +10 -4
  11. package/ai/public-api-signatures-v1.md +51 -7
  12. package/ai/skill.md +26 -2
  13. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  14. package/dist/catalog.js +5 -5
  15. package/dist/{chunk-ZVYA6TLR.js → chunk-4Y4L5YEI.js} +3 -1
  16. package/dist/chunk-4Y4L5YEI.js.map +1 -0
  17. package/dist/{chunk-7QWIJEK5.js → chunk-6VQPLV3O.js} +3 -3
  18. package/dist/{chunk-7QWIJEK5.js.map → chunk-6VQPLV3O.js.map} +1 -1
  19. package/dist/{chunk-IVLTEBBT.js → chunk-M6BWQMQY.js} +2 -2
  20. package/dist/{chunk-IVLTEBBT.js.map → chunk-M6BWQMQY.js.map} +1 -1
  21. package/dist/{chunk-72LLWYP2.js → chunk-NVKRZ5DI.js} +1 -1
  22. package/dist/chunk-NVKRZ5DI.js.map +1 -0
  23. package/dist/{chunk-GO2CZX4M.js → chunk-RRCD3A6G.js} +13 -5
  24. package/dist/chunk-RRCD3A6G.js.map +1 -0
  25. package/dist/{chunk-5PAVAR4B.js → chunk-VHXHLZ6R.js} +10 -1
  26. package/dist/chunk-VHXHLZ6R.js.map +1 -0
  27. package/dist/chunk-WJN3V2H5.js +256 -0
  28. package/dist/chunk-WJN3V2H5.js.map +1 -0
  29. package/dist/{chunk-SJY7KC45.js → chunk-Z4EPMX25.js} +3 -3
  30. package/dist/{chunk-SJY7KC45.js.map → chunk-Z4EPMX25.js.map} +1 -1
  31. package/dist/{chunk-HGSTMZZ6.js → chunk-Z6PE5T7N.js} +2 -2
  32. package/dist/{chunk-HGSTMZZ6.js.map → chunk-Z6PE5T7N.js.map} +1 -1
  33. package/dist/collapsible-panel.js +2 -2
  34. package/dist/index.d.ts +3 -2
  35. package/dist/index.js +6 -5
  36. package/dist/list-header.d.ts +1 -0
  37. package/dist/list-header.js +1 -1
  38. package/dist/nav-stack.d.ts +1 -0
  39. package/dist/nav-stack.js +1 -1
  40. package/dist/select-register.js +3 -0
  41. package/dist/select-register.js.map +1 -1
  42. package/dist/select.d.ts +1 -0
  43. package/dist/select.js +1 -1
  44. package/dist/split-view.js +1 -1
  45. package/dist/styles/components/actions/toolbar/toolbar.css +32 -0
  46. package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +51 -0
  47. package/dist/styles/components/actions/toolbar-text/toolbar-text.css +11 -0
  48. package/dist/styles/components/navigation/nav-stack/nav-stack.css +11 -0
  49. package/dist/styles/components/typography/text/text.css +19 -0
  50. package/dist/styles/nav-stack.css +11 -0
  51. package/dist/styles/text.css +19 -0
  52. package/dist/styles/toolbar-control-group.css +51 -0
  53. package/dist/styles/toolbar-text.css +11 -0
  54. package/dist/styles/toolbar.css +32 -0
  55. package/dist/text.d.ts +5 -2
  56. package/dist/text.js +1 -1
  57. package/dist/toolbar-control-group.d.ts +14 -2
  58. package/dist/toolbar-control-group.js +1 -1
  59. package/dist/toolbar-text.d.ts +10 -2
  60. package/dist/toolbar-text.js +1 -1
  61. package/dist/wire-nav-stack.js +58 -22
  62. package/dist/wire-nav-stack.js.map +1 -1
  63. package/dist/wire-toolbar-visibility.d.ts +13 -0
  64. package/dist/wire-toolbar-visibility.js +3 -0
  65. package/dist/wire-toolbar-visibility.js.map +1 -0
  66. package/dist/workbench.js +1 -1
  67. package/docs/accessibility.md +15 -0
  68. package/docs/collapsible-panel.md +4 -0
  69. package/docs/component-contract.md +31 -0
  70. package/docs/component-selection.md +55 -1
  71. package/docs/design/templates/toolbar/width-visibility-320-dark.svg +1 -0
  72. package/docs/design/templates/toolbar/width-visibility-320.svg +1 -0
  73. package/docs/design/templates/toolbar/width-visibility-600-dark.svg +1 -0
  74. package/docs/design/templates/toolbar/width-visibility-600.svg +1 -0
  75. package/docs/design/templates/toolbar-control-group/icon-tile-brand-dark.svg +1 -0
  76. package/docs/design/templates/toolbar-control-group/icon-tile-brand.svg +1 -0
  77. package/docs/design/templates/toolbar-control-group/icon-tile-danger-dark.svg +1 -0
  78. package/docs/design/templates/toolbar-control-group/icon-tile-danger.svg +1 -0
  79. package/docs/design/templates/toolbar-control-group/icon-tile-neutral-dark.svg +1 -0
  80. package/docs/design/templates/toolbar-control-group/icon-tile-neutral.svg +1 -0
  81. package/docs/design/templates/toolbar-control-group/icon-tile-success-dark.svg +1 -0
  82. package/docs/design/templates/toolbar-control-group/icon-tile-success.svg +1 -0
  83. package/docs/design/templates/toolbar-control-group/icon-tile-warning-dark.svg +1 -0
  84. package/docs/design/templates/toolbar-control-group/icon-tile-warning.svg +1 -0
  85. package/docs/design/templates/toolbar-control-group-dark.svg +1 -1
  86. package/docs/design/templates/toolbar-control-group.svg +1 -1
  87. package/docs/design/templates/toolbar-dark.svg +1 -1
  88. package/docs/design/templates/toolbar-text/dark-tone-dark.svg +1 -0
  89. package/docs/design/templates/toolbar-text/dark-tone.svg +1 -0
  90. package/docs/design/templates/toolbar-text-dark.svg +1 -1
  91. package/docs/design/templates/toolbar-text.svg +1 -1
  92. package/docs/design/templates/toolbar.svg +1 -1
  93. package/docs/design/templates.md +2 -0
  94. package/docs/layout.md +12 -1
  95. package/docs/nav-stack.md +5 -1
  96. package/llms.txt +24 -0
  97. package/package.json +5 -1
  98. package/dist/chunk-5PAVAR4B.js.map +0 -1
  99. package/dist/chunk-72LLWYP2.js.map +0 -1
  100. package/dist/chunk-GO2CZX4M.js.map +0 -1
  101. package/dist/chunk-ZVYA6TLR.js.map +0 -1
@@ -0,0 +1,256 @@
1
+ // src/wiring/wire-toolbar-visibility.ts
2
+ var HIDE_BELOW = "data-hide-below";
3
+ var SHOW_BELOW = "data-show-below";
4
+ var HIDDEN = "data-toolbar-width-hidden";
5
+ var PROBE = "data-toolbar-visibility-probe";
6
+ var LENGTH = "--kui-toolbar-visibility-length";
7
+ var ITEM = `[data-component="toolbar-control-group"][${HIDE_BELOW}], [data-component="toolbar-control-group"][${SHOW_BELOW}], [data-component="toolbar-text"][${HIDE_BELOW}], [data-component="toolbar-text"][${SHOW_BELOW}]`;
8
+ var controllers = /* @__PURE__ */ new WeakMap();
9
+ function wireToolbarVisibility(root) {
10
+ const document = root.nodeType === 9 ? root : root.ownerDocument;
11
+ let register = controllers.get(document);
12
+ if (!register) {
13
+ register = createController(document);
14
+ controllers.set(document, register);
15
+ }
16
+ return register(root);
17
+ }
18
+ function createController(document) {
19
+ const view = document.defaultView;
20
+ const registrations = /* @__PURE__ */ new Set();
21
+ const measurements = /* @__PURE__ */ new Map();
22
+ const written = /* @__PURE__ */ new Map();
23
+ const observed = /* @__PURE__ */ new Set();
24
+ let disposed = false;
25
+ let refreshing = false;
26
+ const normalizedStyle = document.createElement("div").style;
27
+ function setStyle(element, property, value) {
28
+ normalizedStyle.removeProperty(property);
29
+ normalizedStyle.setProperty(property, value);
30
+ const normalized = normalizedStyle.getPropertyValue(property);
31
+ if (element.style.getPropertyValue(property) === normalized && element.style.getPropertyPriority(property) === "")
32
+ return;
33
+ if (normalized === "") element.style.removeProperty(property);
34
+ else element.style.setProperty(property, normalized);
35
+ }
36
+ function write(element, hidden) {
37
+ let previous = written.get(element);
38
+ if (!previous) {
39
+ previous = { original: element.getAttribute(HIDDEN), value: null };
40
+ written.set(element, previous);
41
+ }
42
+ const value = hidden ? "true" : null;
43
+ if (element.getAttribute(HIDDEN) !== value) {
44
+ if (value === null) element.removeAttribute(HIDDEN);
45
+ else element.setAttribute(HIDDEN, value);
46
+ }
47
+ previous.value = value;
48
+ }
49
+ function restore(element) {
50
+ const previous = written.get(element);
51
+ if (element.getAttribute(HIDDEN) === previous.value) {
52
+ if (previous.original === null) element.removeAttribute(HIDDEN);
53
+ else element.setAttribute(HIDDEN, previous.original);
54
+ }
55
+ written.delete(element);
56
+ }
57
+ function contentWidth(toolbar) {
58
+ const style = view.getComputedStyle(toolbar);
59
+ const inset = (property) => parseFloat(style.getPropertyValue(property)) || 0;
60
+ const padding = inset("padding-left") + inset("padding-right");
61
+ const border = inset("border-left-width") + inset("border-right-width");
62
+ const width = parseFloat(style.width);
63
+ return Math.max(
64
+ 0,
65
+ Number.isFinite(width) ? width - (style.boxSizing === "border-box" ? padding + border : 0) : toolbar.getBoundingClientRect().width - padding - border
66
+ );
67
+ }
68
+ function createMeasurement(toolbar) {
69
+ const box = document.createElement("div");
70
+ box.setAttribute(PROBE, "");
71
+ box.setAttribute("aria-hidden", "true");
72
+ const hide = document.createElement("div");
73
+ const show = document.createElement("div");
74
+ box.append(hide, show);
75
+ toolbar.append(box);
76
+ return { toolbar, box, hide, show };
77
+ }
78
+ function resolveLength(probe, value) {
79
+ if (value === null) return null;
80
+ setStyle(probe, LENGTH, value);
81
+ const left = view.getComputedStyle(probe).left;
82
+ if (!/^-?(?:\d+(?:\.\d+)?|\.\d+)px$/.test(left)) return null;
83
+ const pixels = parseFloat(left);
84
+ return Number.isFinite(pixels) && pixels >= 0 ? pixels : null;
85
+ }
86
+ function copyContext(item, measurement, width) {
87
+ const style = view.getComputedStyle(item);
88
+ const { box } = measurement;
89
+ setStyle(box, "width", `${width}px`);
90
+ for (const property of [
91
+ "font-size",
92
+ "font-family",
93
+ "font-weight",
94
+ "font-style",
95
+ "font-stretch",
96
+ "font-variant",
97
+ "font-feature-settings",
98
+ "font-variation-settings",
99
+ "font-size-adjust",
100
+ "font-kerning",
101
+ "line-height"
102
+ ])
103
+ setStyle(box, property, style.getPropertyValue(property));
104
+ const properties = /* @__PURE__ */ new Set();
105
+ for (let index = 0; index < style.length; index++) {
106
+ const name = style.item(index);
107
+ if (!name.startsWith("--")) continue;
108
+ properties.add(name);
109
+ setStyle(box, name, style.getPropertyValue(name));
110
+ }
111
+ for (let index = box.style.length - 1; index >= 0; index--) {
112
+ const name = box.style.item(index);
113
+ if (name.startsWith("--") && !properties.has(name))
114
+ box.style.removeProperty(name);
115
+ }
116
+ }
117
+ function refresh() {
118
+ if (disposed || refreshing || !view) return;
119
+ refreshing = true;
120
+ try {
121
+ const items = /* @__PURE__ */ new Set();
122
+ for (const { root } of registrations) {
123
+ root.querySelectorAll(ITEM).forEach((item) => items.add(item));
124
+ if (root.nodeType === 1 && root.matches(ITEM))
125
+ items.add(root);
126
+ }
127
+ const wanted = /* @__PURE__ */ new Set();
128
+ const marked = /* @__PURE__ */ new Set();
129
+ for (const item of items) {
130
+ const toolbar = item.closest('[data-component="toolbar"]');
131
+ if (!toolbar) continue;
132
+ let measurement = measurements.get(item);
133
+ if (measurement?.toolbar !== toolbar || measurement.box.parentElement !== toolbar) {
134
+ measurement?.box.remove();
135
+ measurement = createMeasurement(toolbar);
136
+ measurements.set(item, measurement);
137
+ }
138
+ const width = contentWidth(toolbar);
139
+ copyContext(item, measurement, width);
140
+ const hideValue = item.getAttribute(HIDE_BELOW);
141
+ const showValue = item.getAttribute(SHOW_BELOW);
142
+ const hide = resolveLength(measurement.hide, hideValue);
143
+ const show = resolveLength(measurement.show, showValue);
144
+ const valid = (hideValue === null || hide !== null) && (showValue === null || show !== null) && !(hide !== null && show !== null && hide >= show);
145
+ const hidden = valid && (hide !== null && width < hide || show !== null && width >= show);
146
+ write(item, hidden);
147
+ marked.add(item);
148
+ const status = item.nextElementSibling;
149
+ if (status instanceof view.HTMLElement && item.matches(
150
+ '[data-component="toolbar-control-group"][data-busy="true"]'
151
+ ) && status.matches(
152
+ '.kui-toolbar-control-group__busy-status[role="status"]'
153
+ )) {
154
+ write(
155
+ status,
156
+ hidden || view.getComputedStyle(item).display === "none"
157
+ );
158
+ marked.add(status);
159
+ }
160
+ wanted.add(toolbar);
161
+ wanted.add(measurement.hide);
162
+ wanted.add(measurement.show);
163
+ }
164
+ for (const [item, measurement] of measurements)
165
+ if (!items.has(item) || item.closest('[data-component="toolbar"]') !== measurement.toolbar) {
166
+ measurement.box.remove();
167
+ measurements.delete(item);
168
+ }
169
+ for (const element of written.keys())
170
+ if (!marked.has(element)) restore(element);
171
+ for (const element of observed)
172
+ if (!wanted.has(element)) {
173
+ resizeObserver?.unobserve(element);
174
+ observed.delete(element);
175
+ }
176
+ for (const element of wanted)
177
+ if (!observed.has(element)) {
178
+ resizeObserver?.observe(element);
179
+ observed.add(element);
180
+ }
181
+ } finally {
182
+ refreshing = false;
183
+ }
184
+ }
185
+ const resizeObserver = view?.ResizeObserver ? new view.ResizeObserver(refresh) : null;
186
+ const mutationObserver = view?.MutationObserver ? new view.MutationObserver((records) => {
187
+ const internal = (node) => node.nodeType === 1 && (node.hasAttribute(PROBE) || Boolean(node.closest(`[${PROBE}]`)));
188
+ if (records.some(
189
+ (record) => record.type === "childList" && [...record.removedNodes].some(
190
+ (node) => node.nodeType === 1 && node.hasAttribute(PROBE)
191
+ ) || !internal(record.target) && (record.type !== "childList" || [...record.addedNodes, ...record.removedNodes].some(
192
+ (node) => !internal(node)
193
+ ))
194
+ ))
195
+ refresh();
196
+ }) : null;
197
+ mutationObserver?.observe(document.documentElement, {
198
+ subtree: true,
199
+ childList: true,
200
+ attributes: true,
201
+ attributeFilter: [
202
+ HIDE_BELOW,
203
+ SHOW_BELOW,
204
+ HIDDEN,
205
+ "class",
206
+ "style",
207
+ "data-component",
208
+ "data-busy",
209
+ "data-expanded",
210
+ "data-visibility",
211
+ "data-size",
212
+ "data-tone"
213
+ ]
214
+ });
215
+ const media = [
216
+ "(prefers-color-scheme: dark)",
217
+ "(prefers-contrast: more)",
218
+ "(prefers-contrast: less)",
219
+ "(forced-colors: active)",
220
+ "(prefers-reduced-motion: reduce)",
221
+ "(pointer: coarse)",
222
+ "(hover: hover)"
223
+ ].flatMap((query) => view?.matchMedia ? [view.matchMedia(query)] : []);
224
+ for (const preference of media)
225
+ preference.addEventListener("change", refresh);
226
+ document.fonts?.addEventListener("loadingdone", refresh);
227
+ view?.addEventListener("resize", refresh);
228
+ return (root) => {
229
+ const registration = { root };
230
+ registrations.add(registration);
231
+ refresh();
232
+ return () => {
233
+ if (!registrations.delete(registration)) return;
234
+ if (registrations.size) refresh();
235
+ else {
236
+ disposed = true;
237
+ mutationObserver?.disconnect();
238
+ resizeObserver?.disconnect();
239
+ for (const preference of media)
240
+ preference.removeEventListener("change", refresh);
241
+ document.fonts?.removeEventListener("loadingdone", refresh);
242
+ view?.removeEventListener("resize", refresh);
243
+ for (const measurement of measurements.values())
244
+ measurement.box.remove();
245
+ for (const element of written.keys()) restore(element);
246
+ measurements.clear();
247
+ observed.clear();
248
+ controllers.delete(document);
249
+ }
250
+ };
251
+ };
252
+ }
253
+
254
+ export { wireToolbarVisibility };
255
+
256
+ //# sourceMappingURL=chunk-WJN3V2H5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/wiring/wire-toolbar-visibility.ts"],"names":[],"mappings":"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","file":"chunk-WJN3V2H5.js","sourcesContent":["type Root = HTMLElement | Document;\n\nconst HIDE_BELOW = 'data-hide-below';\nconst SHOW_BELOW = 'data-show-below';\nconst HIDDEN = 'data-toolbar-width-hidden';\nconst PROBE = 'data-toolbar-visibility-probe';\nconst LENGTH = '--kui-toolbar-visibility-length';\nconst ITEM = `[data-component=\"toolbar-control-group\"][${HIDE_BELOW}], [data-component=\"toolbar-control-group\"][${SHOW_BELOW}], [data-component=\"toolbar-text\"][${HIDE_BELOW}], [data-component=\"toolbar-text\"][${SHOW_BELOW}]`;\n\ninterface Measurement {\n toolbar: HTMLElement;\n box: HTMLDivElement;\n hide: HTMLDivElement;\n show: HTMLDivElement;\n}\n\ninterface WrittenAttribute {\n original: string | null;\n value: string | null;\n}\n\nconst controllers = new WeakMap<Document, (root: Root) => () => void>();\n\n/**\n * Wire ToolbarText and ToolbarControlGroup width thresholds below root.\n * Below is strict: hideBelow hides at width < threshold; showBelow hides at\n * width >= threshold. Percentages use the closest Toolbar's content box;\n * em and custom properties use the item's own inherited context. Invalid,\n * negative, unresolved, or contradictory thresholds leave the item visible.\n * This helper changes only a component-owned visibility marker. Existing\n * CSS visibility policies still apply. Dispose with the owning application.\n */\nexport function wireToolbarVisibility(root: Root): () => void {\n const document =\n root.nodeType === 9 ? (root as Document) : root.ownerDocument!;\n let register = controllers.get(document);\n if (!register) {\n register = createController(document);\n controllers.set(document, register);\n }\n return register(root);\n}\n\nfunction createController(document: Document) {\n const view = document.defaultView;\n const registrations = new Set<{ root: Root }>();\n const measurements = new Map<HTMLElement, Measurement>();\n const written = new Map<HTMLElement, WrittenAttribute>();\n const observed = new Set<Element>();\n let disposed = false;\n let refreshing = false;\n const normalizedStyle = document.createElement('div').style;\n\n function setStyle(element: HTMLElement, property: string, value: string) {\n // CSSOM can normalize computed font/token values on assignment. Compare\n // that serialization, preserving meaningful blank custom-property tokens.\n normalizedStyle.removeProperty(property);\n normalizedStyle.setProperty(property, value);\n const normalized = normalizedStyle.getPropertyValue(property);\n if (\n element.style.getPropertyValue(property) === normalized &&\n element.style.getPropertyPriority(property) === ''\n )\n return;\n if (normalized === '') element.style.removeProperty(property);\n else element.style.setProperty(property, normalized);\n }\n\n function write(element: HTMLElement, hidden: boolean) {\n let previous = written.get(element);\n if (!previous) {\n previous = { original: element.getAttribute(HIDDEN), value: null };\n written.set(element, previous);\n }\n const value = hidden ? 'true' : null;\n if (element.getAttribute(HIDDEN) !== value) {\n if (value === null) element.removeAttribute(HIDDEN);\n else element.setAttribute(HIDDEN, value);\n }\n previous.value = value;\n }\n\n function restore(element: HTMLElement) {\n const previous = written.get(element)!;\n if (element.getAttribute(HIDDEN) === previous.value) {\n if (previous.original === null) element.removeAttribute(HIDDEN);\n else element.setAttribute(HIDDEN, previous.original);\n }\n written.delete(element);\n }\n\n function contentWidth(toolbar: HTMLElement) {\n const style = view!.getComputedStyle(toolbar);\n const inset = (property: string) =>\n parseFloat(style.getPropertyValue(property)) || 0;\n const padding = inset('padding-left') + inset('padding-right');\n const border = inset('border-left-width') + inset('border-right-width');\n const width = parseFloat(style.width);\n return Math.max(\n 0,\n Number.isFinite(width)\n ? width - (style.boxSizing === 'border-box' ? padding + border : 0)\n : toolbar.getBoundingClientRect().width - padding - border,\n );\n }\n\n function createMeasurement(toolbar: HTMLElement): Measurement {\n const box = document.createElement('div');\n box.setAttribute(PROBE, '');\n box.setAttribute('aria-hidden', 'true');\n // An out-of-flow clipped box never participates in the toolbar's grid,\n // intrinsic size or scroll overflow. Its explicit width defines % lengths.\n const hide = document.createElement('div');\n const show = document.createElement('div');\n box.append(hide, show);\n toolbar.append(box);\n return { toolbar, box, hide, show };\n }\n\n function resolveLength(\n probe: HTMLElement,\n value: string | null,\n ): number | null {\n if (value === null) return null;\n // The typed private property uses -1px as its invalid/unresolved sentinel.\n // Absolute left's used-value CSSOM alone turns invalid auto into 0px.\n setStyle(probe, LENGTH, value);\n const left = view!.getComputedStyle(probe).left;\n if (!/^-?(?:\\d+(?:\\.\\d+)?|\\.\\d+)px$/.test(left)) return null;\n const pixels = parseFloat(left);\n return Number.isFinite(pixels) && pixels >= 0 ? pixels : null;\n }\n\n function copyContext(\n item: HTMLElement,\n measurement: Measurement,\n width: number,\n ) {\n const style = view!.getComputedStyle(item);\n const { box } = measurement;\n setStyle(box, 'width', `${width}px`);\n for (const property of [\n 'font-size',\n 'font-family',\n 'font-weight',\n 'font-style',\n 'font-stretch',\n 'font-variant',\n 'font-feature-settings',\n 'font-variation-settings',\n 'font-size-adjust',\n 'font-kerning',\n 'line-height',\n ])\n setStyle(box, property, style.getPropertyValue(property));\n // The box remains outside a hidden item, but resolves tokens from that\n // item, including tokens declared on its root rather than the toolbar.\n const properties = new Set<string>();\n for (let index = 0; index < style.length; index++) {\n const name = style.item(index);\n if (!name.startsWith('--')) continue;\n properties.add(name);\n setStyle(box, name, style.getPropertyValue(name));\n }\n for (let index = box.style.length - 1; index >= 0; index--) {\n const name = box.style.item(index);\n if (name.startsWith('--') && !properties.has(name))\n box.style.removeProperty(name);\n }\n }\n\n function refresh() {\n if (disposed || refreshing || !view) return;\n refreshing = true;\n try {\n const items = new Set<HTMLElement>();\n for (const { root } of registrations) {\n root\n .querySelectorAll<HTMLElement>(ITEM)\n .forEach((item) => items.add(item));\n if (root.nodeType === 1 && (root as HTMLElement).matches(ITEM))\n items.add(root as HTMLElement);\n }\n const wanted = new Set<Element>();\n const marked = new Set<HTMLElement>();\n for (const item of items) {\n const toolbar = item.closest<HTMLElement>('[data-component=\"toolbar\"]');\n if (!toolbar) continue;\n let measurement = measurements.get(item);\n if (\n measurement?.toolbar !== toolbar ||\n measurement.box.parentElement !== toolbar\n ) {\n measurement?.box.remove();\n measurement = createMeasurement(toolbar);\n measurements.set(item, measurement);\n }\n const width = contentWidth(toolbar);\n copyContext(item, measurement, width);\n const hideValue = item.getAttribute(HIDE_BELOW);\n const showValue = item.getAttribute(SHOW_BELOW);\n const hide = resolveLength(measurement.hide, hideValue);\n const show = resolveLength(measurement.show, showValue);\n const valid =\n (hideValue === null || hide !== null) &&\n (showValue === null || show !== null) &&\n !(hide !== null && show !== null && hide >= show);\n const hidden =\n valid &&\n ((hide !== null && width < hide) || (show !== null && width >= show));\n write(item, hidden);\n marked.add(item);\n const status = item.nextElementSibling;\n if (\n status instanceof view.HTMLElement &&\n item.matches(\n '[data-component=\"toolbar-control-group\"][data-busy=\"true\"]',\n ) &&\n status.matches(\n '.kui-toolbar-control-group__busy-status[role=\"status\"]',\n )\n ) {\n write(\n status,\n hidden || view.getComputedStyle(item).display === 'none',\n );\n marked.add(status);\n }\n wanted.add(toolbar);\n wanted.add(measurement.hide);\n wanted.add(measurement.show);\n }\n for (const [item, measurement] of measurements)\n if (\n !items.has(item) ||\n item.closest('[data-component=\"toolbar\"]') !== measurement.toolbar\n ) {\n measurement.box.remove();\n measurements.delete(item);\n }\n for (const element of written.keys())\n if (!marked.has(element)) restore(element);\n for (const element of observed)\n if (!wanted.has(element)) {\n resizeObserver?.unobserve(element);\n observed.delete(element);\n }\n for (const element of wanted)\n if (!observed.has(element)) {\n resizeObserver?.observe(element);\n observed.add(element);\n }\n } finally {\n refreshing = false;\n }\n }\n\n const resizeObserver = view?.ResizeObserver\n ? new view.ResizeObserver(refresh)\n : null;\n const mutationObserver = view?.MutationObserver\n ? new view.MutationObserver((records) => {\n const internal = (node: Node) =>\n node.nodeType === 1 &&\n ((node as Element).hasAttribute(PROBE) ||\n Boolean((node as Element).closest(`[${PROBE}]`)));\n if (\n records.some(\n (record) =>\n (record.type === 'childList' &&\n [...record.removedNodes].some(\n (node) =>\n node.nodeType === 1 &&\n (node as Element).hasAttribute(PROBE),\n )) ||\n (!internal(record.target) &&\n (record.type !== 'childList' ||\n [...record.addedNodes, ...record.removedNodes].some(\n (node) => !internal(node),\n ))),\n )\n )\n refresh();\n })\n : null;\n // Ancestor theme/font changes must refresh even outside the wired subtree.\n mutationObserver?.observe(document.documentElement, {\n subtree: true,\n childList: true,\n attributes: true,\n attributeFilter: [\n HIDE_BELOW,\n SHOW_BELOW,\n HIDDEN,\n 'class',\n 'style',\n 'data-component',\n 'data-busy',\n 'data-expanded',\n 'data-visibility',\n 'data-size',\n 'data-tone',\n ],\n });\n // Preference media can change inherited tokens at a fixed viewport width.\n const media = [\n '(prefers-color-scheme: dark)',\n '(prefers-contrast: more)',\n '(prefers-contrast: less)',\n '(forced-colors: active)',\n '(prefers-reduced-motion: reduce)',\n '(pointer: coarse)',\n '(hover: hover)',\n ].flatMap((query) => (view?.matchMedia ? [view.matchMedia(query)] : []));\n for (const preference of media)\n preference.addEventListener('change', refresh);\n document.fonts?.addEventListener('loadingdone', refresh);\n view?.addEventListener('resize', refresh);\n\n return (root: Root) => {\n const registration = { root };\n registrations.add(registration);\n refresh();\n return () => {\n if (!registrations.delete(registration)) return;\n if (registrations.size) refresh();\n else {\n disposed = true;\n mutationObserver?.disconnect();\n resizeObserver?.disconnect();\n for (const preference of media)\n preference.removeEventListener('change', refresh);\n document.fonts?.removeEventListener('loadingdone', refresh);\n view?.removeEventListener('resize', refresh);\n for (const measurement of measurements.values())\n measurement.box.remove();\n for (const element of written.keys()) restore(element);\n measurements.clear();\n observed.clear();\n controllers.delete(document);\n }\n };\n };\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { ToolbarText } from './chunk-5PAVAR4B.js';
2
- import { ToolbarControlGroup } from './chunk-GO2CZX4M.js';
1
+ import { ToolbarText } from './chunk-VHXHLZ6R.js';
2
+ import { ToolbarControlGroup } from './chunk-RRCD3A6G.js';
3
3
  import { Toolbar } from './chunk-BYHGRKC3.js';
4
4
  import { LucideIcon } from './chunk-PQQQXJGV.js';
5
5
  import { ChevronLeft } from 'lucide';
@@ -120,4 +120,4 @@ function NavStack({
120
120
 
121
121
  export { NavStack };
122
122
 
123
- //# sourceMappingURL=chunk-SJY7KC45.js.map
123
+ //# sourceMappingURL=chunk-Z4EPMX25.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/navigation/nav-stack/nav-stack.tsx"],"names":[],"mappings":"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","file":"chunk-SJY7KC45.js","sourcesContent":["import { ChevronLeft } from 'lucide';\n\nimport type { KerfUiContent } from '../../../shared/content/semantic-content.js';\nimport { Toolbar, type ToolbarConfig } from '../../actions/toolbar/toolbar.js';\nimport { ToolbarControlGroup } from '../../actions/toolbar-control-group/toolbar-control-group.js';\nimport {\n type HeadingLevel,\n ToolbarText,\n type ToolbarTextSize,\n} from '../../actions/toolbar-text/toolbar-text.js';\nimport type { PaneAppearance } from '../../layout/pane/pane.js';\nimport { LucideIcon } from '../../media/lucide-icon/lucide-icon.js';\n\n/**\n * One entry in a {@link NavStack}. The app owns the stack as an array (usually a\n * signal); `NavStack` renders it and `wireNavStack` animates the transitions.\n */\nexport interface NavStackView {\n /** Stable identity for keyed reconcile and transition direction. */\n key: string;\n content: KerfUiContent;\n /** Background of this view's scrolling work surface. */\n appearance?: PaneAppearance;\n /** Title shown in the top toolbar for this view. */\n title?: string;\n /** Leading groups for this view's top toolbar, after the back control and before the title. */\n leading?: KerfUiContent;\n /** Center content for this view's top toolbar (placed per `toolbarConfig.centerAlign`). */\n center?: KerfUiContent;\n /** Trailing actions for this view's top toolbar. */\n toolbar?: KerfUiContent;\n /** Fixed chrome below this view's toolbar, above its scrolling content. */\n header?: KerfUiContent;\n /** Bottom toolbar for this view. Cross-fades with the top chrome on navigation. */\n bottomToolbar?: KerfUiContent;\n}\n\n/**\n * The top toolbar's configuration. Its `ToolbarConfig` forwards to the real\n * `Toolbar` the stack renders; by default that toolbar draws no divider and\n * claims the top and side safe-area edges the stack still touches.\n */\nexport interface NavStackToolbarConfig extends ToolbarConfig {\n /** Accessible name of the top toolbar (default: none). */\n label?: string;\n /** Size of the view title's `ToolbarText` (default `large`). */\n titleSize?: ToolbarTextSize;\n /** Expose the view title as a heading at this level (default: a plain span). */\n headingLevel?: HeadingLevel;\n}\n\nexport interface NavStackProps {\n id: string;\n /** Accessible name for the stack region. */\n label: string;\n /** The stack, root first; the last entry is the active top view. */\n views: NavStackView[];\n /** Accessible label for the icon-only back control (default \"Back\"). */\n backLabel?: string;\n /** The back control's icon (default a chevron-left `LucideIcon`). */\n backIcon?: KerfUiContent;\n /**\n * Visible text beside the back icon, such as the previous view's title\n * (default: icon only). When set, the text names the control and\n * `backLabel` is not used.\n */\n backText?: string;\n /** The top toolbar's configuration, forwarded to its `Toolbar`. */\n toolbarConfig?: NavStackToolbarConfig;\n /** Persistent last group in every view's top toolbar, supplied by a hosting panel. */\n panelToggle?: KerfUiContent;\n /** Hide the top toolbar entirely (rare — a fully custom-chrome view). */\n hideToolbar?: boolean;\n /** Optional persistent bottom toolbar used when the active view does not provide one. */\n bottomToolbar?: KerfUiContent;\n /**\n * The line under the top chrome and over the bottom toolbar, where they\n * meet the active view. `scroll` (default) shows the chrome's line only\n * while the view's content is scrolled beneath it, and the bottom\n * toolbar's only while more content lies below — never when the content\n * fits — once `wireScrollDividers` (`@kerfjs/ui/wire-scroll-dividers`) is\n * wired above the stack; unwired, neither shows. `always` shows both\n * without the wiring; `none` neither, even when wired. The line is drawn\n * inside the chrome, so no state moves the chrome or the content. A\n * `toolbarConfig.dividerSides` edge is the Toolbar's own and is unaffected.\n */\n chromeDividers?: 'scroll' | 'always' | 'none';\n className?: string;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\nconst DEFAULT_SAFE_AREA_EDGES = [\n 'block-start',\n 'inline-start',\n 'inline-end',\n] as const;\n\n/**\n * A navigation stack (iOS-style push/pop). Renders every entry stacked, the last\n * one active; `@kerfjs/ui/wire-nav-stack`'s `wireNavStack` slides the content and\n * cross-fades the chrome across a change. Its top chrome is a real `Toolbar`: the\n * back control and title lead, the active view's `leading` / `center` / `toolbar`\n * content fills the zones, and `toolbarConfig` configures it. A single-pane\n * layout is a `NavStack` with one entry. See `docs/23-app-layouts.md` §3.1.\n */\nexport function NavStack({\n id,\n label,\n views,\n backLabel = 'Back',\n backIcon,\n backText,\n toolbarConfig = {},\n panelToggle,\n hideToolbar = false,\n bottomToolbar,\n chromeDividers = 'scroll',\n className = '',\n slot,\n}: NavStackProps) {\n const topIndex = views.length - 1;\n const top = views[topIndex];\n const canPop = views.length > 1;\n return (\n <section\n class={`kui-nav-stack ${className}`.trim()}\n id={id}\n data-component=\"nav-stack\"\n data-nav-stack-id={id}\n data-depth={String(views.length)}\n data-chrome-dividers={\n chromeDividers === 'always' || chromeDividers === 'none'\n ? chromeDividers\n : undefined\n }\n aria-label={label}\n slot={slot}\n >\n {!hideToolbar && (\n <div class=\"kui-nav-stack__chrome\" data-nav-stack-chrome>\n <Toolbar\n label={toolbarConfig.label}\n dividerSides={toolbarConfig.dividerSides}\n centerAlign={toolbarConfig.centerAlign}\n responsive={toolbarConfig.responsive}\n responsiveAt={toolbarConfig.responsiveAt}\n safeAreaEdges={\n toolbarConfig.safeAreaEdges ?? DEFAULT_SAFE_AREA_EDGES\n }\n leading={\n <>\n {canPop && (\n <ToolbarControlGroup\n appearance=\"borderless\"\n shape=\"rounded\"\n content={backText ? 'mixed' : 'icon'}\n single\n >\n <button\n type=\"button\"\n class=\"kui-nav-stack__back\"\n data-nav-back\n aria-label={backText ? undefined : backLabel}\n >\n {backIcon ?? (\n <LucideIcon\n icon={ChevronLeft}\n name=\"chevron-left\"\n className=\"kui-nav-stack__back-icon\"\n />\n )}\n {backText ? <span>{backText}</span> : null}\n </button>\n </ToolbarControlGroup>\n )}\n {top?.leading}\n <ToolbarText\n text={top?.title ?? ''}\n size={toolbarConfig.titleSize ?? 'large'}\n headingLevel={toolbarConfig.headingLevel}\n fill\n />\n </>\n }\n center={top?.center}\n trailing={\n <>\n {top?.toolbar}\n {panelToggle}\n </>\n }\n />\n {top?.header && (\n <div class=\"kui-nav-stack__header\" data-nav-stack-header>\n {top.header}\n </div>\n )}\n </div>\n )}\n <div class=\"kui-nav-stack__viewport\" data-nav-stack-viewport>\n {views.map((view, index) => (\n <article\n class=\"kui-nav-stack__view\"\n data-key={view.key}\n data-nav-key={view.key}\n data-nav-active={String(index === topIndex)}\n data-appearance={\n view.appearance === 'sunken' ? 'sunken' : undefined\n }\n aria-hidden={String(index !== topIndex)}\n >\n {view.content}\n </article>\n ))}\n </div>\n {(top?.bottomToolbar ?? bottomToolbar) && (\n <footer class=\"kui-nav-stack__bottom\" data-nav-stack-bottom>\n {top?.bottomToolbar ?? bottomToolbar}\n </footer>\n )}\n </section>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/navigation/nav-stack/nav-stack.tsx"],"names":[],"mappings":"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","file":"chunk-Z4EPMX25.js","sourcesContent":["import { ChevronLeft } from 'lucide';\n\nimport type { KerfUiContent } from '../../../shared/content/semantic-content.js';\nimport { Toolbar, type ToolbarConfig } from '../../actions/toolbar/toolbar.js';\nimport { ToolbarControlGroup } from '../../actions/toolbar-control-group/toolbar-control-group.js';\nimport {\n type HeadingLevel,\n ToolbarText,\n type ToolbarTextSize,\n} from '../../actions/toolbar-text/toolbar-text.js';\nimport type { PaneAppearance } from '../../layout/pane/pane.js';\nimport { LucideIcon } from '../../media/lucide-icon/lucide-icon.js';\n\n/**\n * One entry in a {@link NavStack}. The app owns the stack as an array (usually a\n * signal); `NavStack` renders it and `wireNavStack` animates the transitions.\n */\nexport interface NavStackView {\n /** Stable identity for keyed reconcile and transition direction. */\n key: string;\n content: KerfUiContent;\n /** Background of this view's scrolling work surface. */\n appearance?: PaneAppearance;\n /** Title shown in the top toolbar for this view. */\n title?: string;\n /** Leading groups for this view's top toolbar, after the back control and before the title. */\n leading?: KerfUiContent;\n /** Center content for this view's top toolbar (placed per `toolbarConfig.centerAlign`). */\n center?: KerfUiContent;\n /** Trailing actions for this view's top toolbar. */\n toolbar?: KerfUiContent;\n /** Fixed chrome below this view's toolbar, above its scrolling content. */\n header?: KerfUiContent;\n /** Bottom toolbar for this view. Cross-fades with the top chrome on navigation. */\n bottomToolbar?: KerfUiContent;\n}\n\n/**\n * The top toolbar's configuration. Its `ToolbarConfig` forwards to the real\n * `Toolbar` the stack renders; by default that toolbar draws no divider and\n * claims the top and side safe-area edges the stack still touches.\n */\nexport interface NavStackToolbarConfig extends ToolbarConfig {\n /** Accessible name of the top toolbar (default: none). */\n label?: string;\n /** Size of the view title's `ToolbarText` (default `large`). */\n titleSize?: ToolbarTextSize;\n /** Expose the view title as a heading at this level (default: a plain span). */\n headingLevel?: HeadingLevel;\n}\n\nexport interface NavStackProps {\n id: string;\n /** Accessible name for the stack region. */\n label: string;\n /** The stack, root first; the last entry is the active top view. */\n views: NavStackView[];\n /** Accessible label for the icon-only back control (default \"Back\"). */\n backLabel?: string;\n /** The back control's icon (default a chevron-left `LucideIcon`). */\n backIcon?: KerfUiContent;\n /**\n * Visible text beside the back icon, such as the previous view's title\n * (default: icon only). When set, the text names the control and\n * `backLabel` is not used.\n */\n backText?: string;\n /** The top toolbar's configuration, forwarded to its `Toolbar`. */\n toolbarConfig?: NavStackToolbarConfig;\n /** Persistent last group in every view's top toolbar, supplied by a hosting panel. */\n panelToggle?: KerfUiContent;\n /** Hide the top toolbar entirely (rare — a fully custom-chrome view). */\n hideToolbar?: boolean;\n /** Optional persistent bottom toolbar used when the active view does not provide one. */\n bottomToolbar?: KerfUiContent;\n /**\n * The line under the top chrome and over the bottom toolbar, where they\n * meet the active view. `scroll` (default) shows the chrome's line only\n * while the view's content is scrolled beneath it, and the bottom\n * toolbar's only while more content lies below — never when the content\n * fits — once `wireScrollDividers` (`@kerfjs/ui/wire-scroll-dividers`) is\n * wired above the stack; unwired, neither shows. `always` shows both\n * without the wiring; `none` neither, even when wired. The line is drawn\n * inside the chrome, so no state moves the chrome or the content. A\n * `toolbarConfig.dividerSides` edge is the Toolbar's own and is unaffected.\n */\n chromeDividers?: 'scroll' | 'always' | 'none';\n className?: string;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\nconst DEFAULT_SAFE_AREA_EDGES = [\n 'block-start',\n 'inline-start',\n 'inline-end',\n] as const;\n\n/**\n * A navigation stack (iOS-style push/pop). Renders every entry stacked, the last\n * one active; `@kerfjs/ui/wire-nav-stack`'s `wireNavStack` slides the content and\n * cross-fades the chrome across a change. Its top chrome is a real `Toolbar`: the\n * back control and title lead, the active view's `leading` / `center` / `toolbar`\n * content fills the zones, and `toolbarConfig` configures it. A single-pane\n * layout is a `NavStack` with one entry. See `docs/23-app-layouts.md` §3.1.\n */\nexport function NavStack({\n id,\n label,\n views,\n backLabel = 'Back',\n backIcon,\n backText,\n toolbarConfig = {},\n panelToggle,\n hideToolbar = false,\n bottomToolbar,\n chromeDividers = 'scroll',\n className = '',\n slot,\n}: NavStackProps) {\n const topIndex = views.length - 1;\n const top = views[topIndex];\n const canPop = views.length > 1;\n return (\n <section\n class={`kui-nav-stack ${className}`.trim()}\n id={id}\n data-component=\"nav-stack\"\n data-nav-stack-id={id}\n data-depth={String(views.length)}\n data-chrome-dividers={\n chromeDividers === 'always' || chromeDividers === 'none'\n ? chromeDividers\n : undefined\n }\n aria-label={label}\n slot={slot}\n >\n {!hideToolbar && (\n <div class=\"kui-nav-stack__chrome\" data-nav-stack-chrome>\n <Toolbar\n label={toolbarConfig.label}\n dividerSides={toolbarConfig.dividerSides}\n centerAlign={toolbarConfig.centerAlign}\n responsive={toolbarConfig.responsive}\n responsiveAt={toolbarConfig.responsiveAt}\n safeAreaEdges={\n toolbarConfig.safeAreaEdges ?? DEFAULT_SAFE_AREA_EDGES\n }\n leading={\n <>\n {canPop && (\n <ToolbarControlGroup\n appearance=\"borderless\"\n shape=\"rounded\"\n content={backText ? 'mixed' : 'icon'}\n single\n >\n <button\n type=\"button\"\n class=\"kui-nav-stack__back\"\n data-nav-back\n aria-label={backText ? undefined : backLabel}\n >\n {backIcon ?? (\n <LucideIcon\n icon={ChevronLeft}\n name=\"chevron-left\"\n className=\"kui-nav-stack__back-icon\"\n />\n )}\n {backText ? <span>{backText}</span> : null}\n </button>\n </ToolbarControlGroup>\n )}\n {top?.leading}\n <ToolbarText\n text={top?.title ?? ''}\n size={toolbarConfig.titleSize ?? 'large'}\n headingLevel={toolbarConfig.headingLevel}\n fill\n />\n </>\n }\n center={top?.center}\n trailing={\n <>\n {top?.toolbar}\n {panelToggle}\n </>\n }\n />\n {top?.header && (\n <div class=\"kui-nav-stack__header\" data-nav-stack-header>\n {top.header}\n </div>\n )}\n </div>\n )}\n <div class=\"kui-nav-stack__viewport\" data-nav-stack-viewport>\n {views.map((view, index) => (\n <article\n class=\"kui-nav-stack__view\"\n data-key={view.key}\n data-nav-key={view.key}\n data-nav-active={String(index === topIndex)}\n data-appearance={\n view.appearance === 'sunken' ? 'sunken' : undefined\n }\n aria-hidden={String(index !== topIndex)}\n >\n {view.content}\n </article>\n ))}\n </div>\n {(top?.bottomToolbar ?? bottomToolbar) && (\n <footer class=\"kui-nav-stack__bottom\" data-nav-stack-bottom>\n {top?.bottomToolbar ?? bottomToolbar}\n </footer>\n )}\n </section>\n );\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { Pane } from './chunk-AOAW55JN.js';
2
2
  import { List } from './chunk-NVRJ7C3W.js';
3
- import { ToolbarControlGroup, isRelocatableGroup } from './chunk-GO2CZX4M.js';
3
+ import { ToolbarControlGroup, isRelocatableGroup } from './chunk-RRCD3A6G.js';
4
4
  import { Toolbar } from './chunk-BYHGRKC3.js';
5
5
  import { LucideIcon } from './chunk-PQQQXJGV.js';
6
6
  import { PanelLeftOpen, PanelLeftClose, PanelRightOpen, PanelRightClose, PanelBottomOpen, PanelBottomClose } from 'lucide';
@@ -143,4 +143,4 @@ function relocatedPanelGroups(toolbar, side, collapsed, attributes) {
143
143
 
144
144
  export { collapsiblePanelToggleIcon, composedPanelBody, panelToggleGroup, relocatedPanelGroups };
145
145
 
146
- //# sourceMappingURL=chunk-HGSTMZZ6.js.map
146
+ //# sourceMappingURL=chunk-Z6PE5T7N.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/panels/panel-toolbar.tsx"],"names":[],"mappings":"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","file":"chunk-HGSTMZZ6.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\nimport {\n PanelBottomClose,\n PanelBottomOpen,\n PanelLeftClose,\n PanelLeftOpen,\n PanelRightClose,\n PanelRightOpen,\n} from 'lucide';\n\nimport {\n Toolbar,\n type ToolbarConfig,\n} from '../../components/actions/toolbar/toolbar.js';\nimport { ToolbarControlGroup } from '../../components/actions/toolbar-control-group/toolbar-control-group.js';\nimport {\n List,\n type ListConfig,\n} from '../../components/collections/list/list.js';\nimport { Pane, type PaneConfig } from '../../components/layout/pane/pane.js';\nimport { LucideIcon } from '../../components/media/lucide-icon/lucide-icon.js';\nimport type { KerfUiContent } from '../content/semantic-content.js';\nimport { isRelocatableGroup } from './panel-toolbar-group.js';\n\n/** Which edge a collapsible panel docks to. */\nexport type PanelSide = 'left' | 'right' | 'bottom';\n\n/**\n * The standard collapse/expand icon for a panel `side` and `collapsed` state,\n * so every app's sidebars and drawers use one recognizable convention:\n * `PanelLeft*` for a left rail, `PanelRight*` for a right rail, `PanelBottom*`\n * for a bottom drawer — the `Close` glyph while open, the `Open` glyph while\n * collapsed. Exposed so an app can render its own toggle affordance.\n */\nexport function collapsiblePanelToggleIcon(\n side: PanelSide,\n collapsed: boolean,\n): { icon: Parameters<typeof LucideIcon>[0]['icon']; name: string } {\n if (side === 'left')\n return collapsed\n ? { icon: PanelLeftOpen, name: 'panel-left-open' }\n : { icon: PanelLeftClose, name: 'panel-left-close' };\n if (side === 'right')\n return collapsed\n ? { icon: PanelRightOpen, name: 'panel-right-open' }\n : { icon: PanelRightClose, name: 'panel-right-close' };\n return collapsed\n ? { icon: PanelBottomOpen, name: 'panel-bottom-open' }\n : { icon: PanelBottomClose, name: 'panel-bottom-close' };\n}\n\n/**\n * The standard collapse toggle a panel toolbar renders. The app handles the\n * button's `data-action` and flips its own `collapsed` flag.\n */\nexport interface PanelToggle {\n /** The `data-action` the toggle button carries. */\n action: string;\n /** The panel's short name, for the accessible \"Show …\" / \"Hide …\" label. */\n name: string;\n /** Accessible label while the panel is collapsed. Defaults to `Show {name}`. */\n showLabel?: string;\n /** Accessible label while the panel is open. Defaults to `Hide {name}`. */\n hideLabel?: string;\n}\n\n/**\n * A collapsible panel's top toolbar, composed so its groups follow the\n * panel's open state.\n *\n * - `title` precedes the `leading` zone. Groups may appear in any of the\n * `leading`, `center`, and `trailing` zones while the panel is open.\n * - Groups marked `relocateOnCollapse` move to the work area's toolbar while\n * the panel is collapsed, preserving their order across the three zones.\n * - `toggle` is always the last group: in the panel's toolbar while it is\n * open, and right after the relocated groups in the work area's toolbar\n * while it is collapsed.\n *\n * Relocated content renders in both places while the panel is collapsed (the\n * panel's copy is inert), so give it no `id`s. Pass groups directly or in\n * arrays so their render-time annotation remains available to the panel.\n *\n * The toolbar's configuration (`dividerSides`, `centerAlign`, `responsive`,\n * `responsiveAt`, `safeAreaEdges`) forwards to its `Toolbar`. It draws no\n * divider of its own: the panel's `Pane` draws the line under it while the\n * content is scrolled (its `chromeDividers`, wired by `wireScrollDividers`).\n */\nexport interface PanelToolbar extends ToolbarConfig {\n /** Accessible name of the panel's toolbar. */\n label: string;\n title?: KerfUiContent;\n leading?: KerfUiContent;\n center?: KerfUiContent;\n trailing?: KerfUiContent;\n toggle?: PanelToggle;\n}\n\n/** A panel's fixed bottom toolbar, below its optional footer content. */\nexport interface PanelBottomToolbar extends ToolbarConfig {\n label: string;\n leading?: KerfUiContent;\n center?: KerfUiContent;\n trailing?: KerfUiContent;\n}\n\n/** Whether panel chrome stays fixed, scrolls, or follows Pane's auto rule. */\nexport type PanelChromePlacement = 'fixed' | 'scroll' | 'auto';\n\nfunction panelChromeList(content: KerfUiContent, config?: ListConfig) {\n return (\n <List\n dividerSides={config?.dividerSides}\n gap={config?.gap}\n hAlign={config?.hAlign}\n vAlign={config?.vAlign}\n textInsets={config?.textInsets}\n controlInsets={config?.controlInsets}\n >\n {content}\n </List>\n );\n}\n\n/** Owner-specific attributes a toggle button carries (its wiring hooks). */\nexport type PanelToggleAttributes = Readonly<Record<string, string>>;\n\n/** The standard toggle, alone in a borderless group. */\nexport function panelToggleGroup(\n side: PanelSide,\n toggle: PanelToggle,\n collapsed: boolean,\n attributes: PanelToggleAttributes,\n): SafeHtml {\n const glyph = collapsiblePanelToggleIcon(side, collapsed);\n return (\n <ToolbarControlGroup label={toggle.name} appearance=\"borderless\" single>\n <button\n type=\"button\"\n {...attributes}\n data-action={toggle.action}\n aria-expanded={String(!collapsed)}\n aria-label={\n collapsed\n ? (toggle.showLabel ?? `Show ${toggle.name}`)\n : (toggle.hideLabel ?? `Hide ${toggle.name}`)\n }\n >\n <LucideIcon icon={glyph.icon} name={glyph.name} />\n </button>\n </ToolbarControlGroup>\n );\n}\n\n/**\n * The panel's own toolbar: content keeps its chosen zones and the toggle trails.\n */\nexport function composedPanelToolbar(\n toolbar: PanelToolbar,\n side: PanelSide,\n collapsed: boolean,\n attributes: PanelToggleAttributes,\n): SafeHtml {\n return (\n <Toolbar\n label={toolbar.label}\n dividerSides={toolbar.dividerSides}\n centerAlign={toolbar.centerAlign}\n responsive={toolbar.responsive}\n responsiveAt={toolbar.responsiveAt}\n safeAreaEdges={toolbar.safeAreaEdges}\n center={toolbar.center}\n leading={\n <>\n {toolbar.title}\n {toolbar.leading}\n </>\n }\n trailing={\n <>\n {toolbar.trailing}\n {toolbar.toggle\n ? panelToggleGroup(side, toolbar.toggle, collapsed, attributes)\n : null}\n </>\n }\n />\n );\n}\n\n/**\n * A toolbar panel's body: its content in a `Pane` under its composed toolbar,\n * with its optional `footer` below. The panel's `pane` configuration forwards\n * to that `Pane`; an omitted or `undefined` field keeps the `Pane` default.\n */\nexport function composedPanelBody({\n toolbar,\n side,\n collapsed,\n attributes,\n pane,\n header,\n headerList,\n headerPlacement = 'fixed',\n footer,\n footerList,\n bottomToolbar,\n footerPlacement = 'fixed',\n content,\n}: {\n toolbar: PanelToolbar;\n side: PanelSide;\n collapsed: boolean;\n attributes: PanelToggleAttributes;\n pane: PaneConfig | undefined;\n header?: KerfUiContent;\n headerList?: ListConfig;\n headerPlacement?: PanelChromePlacement;\n footer?: KerfUiContent;\n footerList?: ListConfig;\n bottomToolbar?: PanelBottomToolbar;\n footerPlacement?: PanelChromePlacement;\n content: KerfUiContent;\n}): SafeHtml {\n const panelHeader = (\n <>\n {composedPanelToolbar(toolbar, side, collapsed, attributes)}\n {header ? panelChromeList(header, headerList) : null}\n </>\n );\n const panelFooter =\n footer || bottomToolbar ? (\n <>\n {footer ? panelChromeList(footer, footerList) : null}\n {bottomToolbar ? (\n <Toolbar\n position=\"footer\"\n label={bottomToolbar.label}\n dividerSides={bottomToolbar.dividerSides}\n centerAlign={bottomToolbar.centerAlign}\n responsive={bottomToolbar.responsive}\n responsiveAt={bottomToolbar.responsiveAt}\n safeAreaEdges={bottomToolbar.safeAreaEdges}\n leading={bottomToolbar.leading}\n center={bottomToolbar.center}\n trailing={bottomToolbar.trailing}\n />\n ) : null}\n </>\n ) : undefined;\n const scrollHeader = headerPlacement === 'scroll';\n const scrollFooter = footerPlacement === 'scroll';\n return (\n <Pane\n header={scrollHeader ? undefined : panelHeader}\n footer={scrollFooter ? undefined : panelFooter}\n chromePlacement={\n headerPlacement === 'auto' || footerPlacement === 'auto'\n ? 'auto'\n : 'fixed'\n }\n contentElement={pane?.contentElement}\n contentLabel={pane?.contentLabel}\n separators={pane?.separators}\n safeAreaEdges={pane?.safeAreaEdges}\n chromeDividers={pane?.chromeDividers}\n appearance={pane?.appearance}\n >\n {scrollHeader ? panelHeader : null}\n {content}\n {scrollFooter ? panelFooter : null}\n </Pane>\n );\n}\n\n/**\n * The groups a collapsed panel hands to the work area, in zone order, then its\n * toggle. Empty while the panel is open or has no toolbar.\n */\nexport function relocatedPanelGroups(\n toolbar: PanelToolbar | undefined,\n side: PanelSide,\n collapsed: boolean,\n attributes: PanelToggleAttributes,\n): KerfUiContent[] {\n if (!collapsed || !toolbar) return [];\n const groups: KerfUiContent[] = [];\n const collect = (content: KerfUiContent): void => {\n if (Array.isArray(content)) {\n for (const item of content) collect(item);\n } else if (isRelocatableGroup(content)) {\n groups.push(content);\n }\n };\n collect(toolbar.leading);\n collect(toolbar.center);\n collect(toolbar.trailing);\n return [\n ...groups,\n toolbar.toggle\n ? panelToggleGroup(side, toolbar.toggle, true, attributes)\n : null,\n ].filter((group) => group !== undefined && group !== null && group !== false);\n}\n"]}
1
+ {"version":3,"sources":["../src/shared/panels/panel-toolbar.tsx"],"names":[],"mappings":"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","file":"chunk-Z6PE5T7N.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\nimport {\n PanelBottomClose,\n PanelBottomOpen,\n PanelLeftClose,\n PanelLeftOpen,\n PanelRightClose,\n PanelRightOpen,\n} from 'lucide';\n\nimport {\n Toolbar,\n type ToolbarConfig,\n} from '../../components/actions/toolbar/toolbar.js';\nimport { ToolbarControlGroup } from '../../components/actions/toolbar-control-group/toolbar-control-group.js';\nimport {\n List,\n type ListConfig,\n} from '../../components/collections/list/list.js';\nimport { Pane, type PaneConfig } from '../../components/layout/pane/pane.js';\nimport { LucideIcon } from '../../components/media/lucide-icon/lucide-icon.js';\nimport type { KerfUiContent } from '../content/semantic-content.js';\nimport { isRelocatableGroup } from './panel-toolbar-group.js';\n\n/** Which edge a collapsible panel docks to. */\nexport type PanelSide = 'left' | 'right' | 'bottom';\n\n/**\n * The standard collapse/expand icon for a panel `side` and `collapsed` state,\n * so every app's sidebars and drawers use one recognizable convention:\n * `PanelLeft*` for a left rail, `PanelRight*` for a right rail, `PanelBottom*`\n * for a bottom drawer — the `Close` glyph while open, the `Open` glyph while\n * collapsed. Exposed so an app can render its own toggle affordance.\n */\nexport function collapsiblePanelToggleIcon(\n side: PanelSide,\n collapsed: boolean,\n): { icon: Parameters<typeof LucideIcon>[0]['icon']; name: string } {\n if (side === 'left')\n return collapsed\n ? { icon: PanelLeftOpen, name: 'panel-left-open' }\n : { icon: PanelLeftClose, name: 'panel-left-close' };\n if (side === 'right')\n return collapsed\n ? { icon: PanelRightOpen, name: 'panel-right-open' }\n : { icon: PanelRightClose, name: 'panel-right-close' };\n return collapsed\n ? { icon: PanelBottomOpen, name: 'panel-bottom-open' }\n : { icon: PanelBottomClose, name: 'panel-bottom-close' };\n}\n\n/**\n * The standard collapse toggle a panel toolbar renders. The app handles the\n * button's `data-action` and flips its own `collapsed` flag.\n */\nexport interface PanelToggle {\n /** The `data-action` the toggle button carries. */\n action: string;\n /** The panel's short name, for the accessible \"Show …\" / \"Hide …\" label. */\n name: string;\n /** Accessible label while the panel is collapsed. Defaults to `Show {name}`. */\n showLabel?: string;\n /** Accessible label while the panel is open. Defaults to `Hide {name}`. */\n hideLabel?: string;\n}\n\n/**\n * A collapsible panel's top toolbar, composed so its groups follow the\n * panel's open state.\n *\n * - `title` precedes the `leading` zone. Groups may appear in any of the\n * `leading`, `center`, and `trailing` zones while the panel is open.\n * - Groups marked `relocateOnCollapse` move to the work area's toolbar while\n * the panel is collapsed, preserving their order across the three zones.\n * - `toggle` is always the last group: in the panel's toolbar while it is\n * open, and right after the relocated groups in the work area's toolbar\n * while it is collapsed.\n *\n * Relocated content renders in both places while the panel is collapsed (the\n * panel's copy is inert), so give it no `id`s. Pass groups directly or in\n * arrays so their render-time annotation remains available to the panel.\n *\n * The toolbar's configuration (`dividerSides`, `centerAlign`, `responsive`,\n * `responsiveAt`, `safeAreaEdges`) forwards to its `Toolbar`. It draws no\n * divider of its own: the panel's `Pane` draws the line under it while the\n * content is scrolled (its `chromeDividers`, wired by `wireScrollDividers`).\n */\nexport interface PanelToolbar extends ToolbarConfig {\n /** Accessible name of the panel's toolbar. */\n label: string;\n title?: KerfUiContent;\n leading?: KerfUiContent;\n center?: KerfUiContent;\n trailing?: KerfUiContent;\n toggle?: PanelToggle;\n}\n\n/** A panel's fixed bottom toolbar, below its optional footer content. */\nexport interface PanelBottomToolbar extends ToolbarConfig {\n label: string;\n leading?: KerfUiContent;\n center?: KerfUiContent;\n trailing?: KerfUiContent;\n}\n\n/** Whether panel chrome stays fixed, scrolls, or follows Pane's auto rule. */\nexport type PanelChromePlacement = 'fixed' | 'scroll' | 'auto';\n\nfunction panelChromeList(content: KerfUiContent, config?: ListConfig) {\n return (\n <List\n dividerSides={config?.dividerSides}\n gap={config?.gap}\n hAlign={config?.hAlign}\n vAlign={config?.vAlign}\n textInsets={config?.textInsets}\n controlInsets={config?.controlInsets}\n >\n {content}\n </List>\n );\n}\n\n/** Owner-specific attributes a toggle button carries (its wiring hooks). */\nexport type PanelToggleAttributes = Readonly<Record<string, string>>;\n\n/** The standard toggle, alone in a borderless group. */\nexport function panelToggleGroup(\n side: PanelSide,\n toggle: PanelToggle,\n collapsed: boolean,\n attributes: PanelToggleAttributes,\n): SafeHtml {\n const glyph = collapsiblePanelToggleIcon(side, collapsed);\n return (\n <ToolbarControlGroup label={toggle.name} appearance=\"borderless\" single>\n <button\n type=\"button\"\n {...attributes}\n data-action={toggle.action}\n aria-expanded={String(!collapsed)}\n aria-label={\n collapsed\n ? (toggle.showLabel ?? `Show ${toggle.name}`)\n : (toggle.hideLabel ?? `Hide ${toggle.name}`)\n }\n >\n <LucideIcon icon={glyph.icon} name={glyph.name} />\n </button>\n </ToolbarControlGroup>\n );\n}\n\n/**\n * The panel's own toolbar: content keeps its chosen zones and the toggle trails.\n */\nexport function composedPanelToolbar(\n toolbar: PanelToolbar,\n side: PanelSide,\n collapsed: boolean,\n attributes: PanelToggleAttributes,\n): SafeHtml {\n return (\n <Toolbar\n label={toolbar.label}\n dividerSides={toolbar.dividerSides}\n centerAlign={toolbar.centerAlign}\n responsive={toolbar.responsive}\n responsiveAt={toolbar.responsiveAt}\n safeAreaEdges={toolbar.safeAreaEdges}\n center={toolbar.center}\n leading={\n <>\n {toolbar.title}\n {toolbar.leading}\n </>\n }\n trailing={\n <>\n {toolbar.trailing}\n {toolbar.toggle\n ? panelToggleGroup(side, toolbar.toggle, collapsed, attributes)\n : null}\n </>\n }\n />\n );\n}\n\n/**\n * A toolbar panel's body: its content in a `Pane` under its composed toolbar,\n * with its optional `footer` below. The panel's `pane` configuration forwards\n * to that `Pane`; an omitted or `undefined` field keeps the `Pane` default.\n */\nexport function composedPanelBody({\n toolbar,\n side,\n collapsed,\n attributes,\n pane,\n header,\n headerList,\n headerPlacement = 'fixed',\n footer,\n footerList,\n bottomToolbar,\n footerPlacement = 'fixed',\n content,\n}: {\n toolbar: PanelToolbar;\n side: PanelSide;\n collapsed: boolean;\n attributes: PanelToggleAttributes;\n pane: PaneConfig | undefined;\n header?: KerfUiContent;\n headerList?: ListConfig;\n headerPlacement?: PanelChromePlacement;\n footer?: KerfUiContent;\n footerList?: ListConfig;\n bottomToolbar?: PanelBottomToolbar;\n footerPlacement?: PanelChromePlacement;\n content: KerfUiContent;\n}): SafeHtml {\n const panelHeader = (\n <>\n {composedPanelToolbar(toolbar, side, collapsed, attributes)}\n {header ? panelChromeList(header, headerList) : null}\n </>\n );\n const panelFooter =\n footer || bottomToolbar ? (\n <>\n {footer ? panelChromeList(footer, footerList) : null}\n {bottomToolbar ? (\n <Toolbar\n position=\"footer\"\n label={bottomToolbar.label}\n dividerSides={bottomToolbar.dividerSides}\n centerAlign={bottomToolbar.centerAlign}\n responsive={bottomToolbar.responsive}\n responsiveAt={bottomToolbar.responsiveAt}\n safeAreaEdges={bottomToolbar.safeAreaEdges}\n leading={bottomToolbar.leading}\n center={bottomToolbar.center}\n trailing={bottomToolbar.trailing}\n />\n ) : null}\n </>\n ) : undefined;\n const scrollHeader = headerPlacement === 'scroll';\n const scrollFooter = footerPlacement === 'scroll';\n return (\n <Pane\n header={scrollHeader ? undefined : panelHeader}\n footer={scrollFooter ? undefined : panelFooter}\n chromePlacement={\n headerPlacement === 'auto' || footerPlacement === 'auto'\n ? 'auto'\n : 'fixed'\n }\n contentElement={pane?.contentElement}\n contentLabel={pane?.contentLabel}\n separators={pane?.separators}\n safeAreaEdges={pane?.safeAreaEdges}\n chromeDividers={pane?.chromeDividers}\n appearance={pane?.appearance}\n >\n {scrollHeader ? panelHeader : null}\n {content}\n {scrollFooter ? panelFooter : null}\n </Pane>\n );\n}\n\n/**\n * The groups a collapsed panel hands to the work area, in zone order, then its\n * toggle. Empty while the panel is open or has no toolbar.\n */\nexport function relocatedPanelGroups(\n toolbar: PanelToolbar | undefined,\n side: PanelSide,\n collapsed: boolean,\n attributes: PanelToggleAttributes,\n): KerfUiContent[] {\n if (!collapsed || !toolbar) return [];\n const groups: KerfUiContent[] = [];\n const collect = (content: KerfUiContent): void => {\n if (Array.isArray(content)) {\n for (const item of content) collect(item);\n } else if (isRelocatableGroup(content)) {\n groups.push(content);\n }\n };\n collect(toolbar.leading);\n collect(toolbar.center);\n collect(toolbar.trailing);\n return [\n ...groups,\n toolbar.toggle\n ? panelToggleGroup(side, toolbar.toggle, true, attributes)\n : null,\n ].filter((group) => group !== undefined && group !== null && group !== false);\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { collapsiblePanelToggleIcon, composedPanelBody, relocatedPanelGroups } from './chunk-HGSTMZZ6.js';
2
- export { collapsiblePanelToggleIcon } from './chunk-HGSTMZZ6.js';
1
+ import { collapsiblePanelToggleIcon, composedPanelBody, relocatedPanelGroups } from './chunk-Z6PE5T7N.js';
2
+ export { collapsiblePanelToggleIcon } from './chunk-Z6PE5T7N.js';
3
3
 
4
4
 
5
5
 
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  export { FloatingToolbar, FloatingToolbarPosition, FloatingToolbarProps } from './floating-toolbar.js';
2
2
  export { PopupMenu, PopupMenuDivider, PopupMenuElement, PopupMenuEntry, PopupMenuHeading, PopupMenuItem, PopupMenuPlacement, PopupMenuProps, closePopupMenu, openPopupMenuAt } from './popup-menu.js';
3
3
  export { Toolbar, ToolbarConfig, ToolbarPosition, ToolbarProps } from './toolbar.js';
4
- export { ToolbarActionLink, ToolbarActionLinkProps, ToolbarControlGroup, ToolbarControlGroupAppearance, ToolbarControlGroupButtonAppearance, ToolbarControlGroupContent, ToolbarControlGroupDensity, ToolbarControlGroupMenuInset, ToolbarControlGroupOverflow, ToolbarControlGroupProps, ToolbarControlGroupSelectedChrome, ToolbarControlGroupSelectedTone, ToolbarControlGroupShape, ToolbarControlGroupSize, ToolbarControlGroupTone, ToolbarControlGroupVisibility } from './toolbar-control-group.js';
5
- export { HeadingLevel, ToolbarText, ToolbarTextProps, ToolbarTextSize } from './toolbar-text.js';
4
+ export { ToolbarActionLink, ToolbarActionLinkProps, ToolbarControlGroup, ToolbarControlGroupAppearance, ToolbarControlGroupButtonAppearance, ToolbarControlGroupContent, ToolbarControlGroupDensity, ToolbarControlGroupExpandedOverflow, ToolbarControlGroupMenuInset, ToolbarControlGroupOverflow, ToolbarControlGroupProps, ToolbarControlGroupSelectedChrome, ToolbarControlGroupSelectedTone, ToolbarControlGroupShape, ToolbarControlGroupSize, ToolbarControlGroupTileTone, ToolbarControlGroupTone, ToolbarControlGroupVisibility } from './toolbar-control-group.js';
5
+ export { HeadingLevel, ToolbarText, ToolbarTextProps, ToolbarTextSize, ToolbarTextTone } from './toolbar-text.js';
6
6
  export { List, ListConfig, ListProps } from './list.js';
7
7
  export { ListActionRow, ListActionRowProps } from './list-action-row.js';
8
8
  export { ListHeader, ListHeaderProps } from './list-header.js';
@@ -38,6 +38,7 @@ export { DialogSurface, DialogSurfacePresentation, DialogSurfaceProps, DialogSur
38
38
  export { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
39
39
  export { CssColor, CssFlex, CssFlexBasis, CssFlexKeyword, CssForegroundColor, CssLength, CssLengthExpression, CssSize, CssSizeKeyword, CssValue, UiColor, UiColorName, UiForegroundColorName, UiSpaceName, calc, colorVar, em, flex, foregroundColor, foregroundColorVar, lengthVar, pct, plus, px, rem, space, uiColor } from './css-values.js';
40
40
  export { ScrollDividerTarget, WireScrollDividersOptions, wireScrollDividers } from './wire-scroll-dividers.js';
41
+ export { wireToolbarVisibility } from './wire-toolbar-visibility.js';
41
42
  export { H as HorizontalAlignment, L as ListVerticalAlignment, V as VerticalAlignment } from './flex-alignment-4ms8ZbV8.js';
42
43
  export { S as SemanticTone } from './semantic-tone-CdW013KF.js';
43
44
  export { S as Sides } from './sides-BPSWde0A.js';
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  export { wireTokenSearchFields } from './chunk-VLPE6OPN.js';
2
+ export { wireToolbarVisibility } from './chunk-WJN3V2H5.js';
2
3
  export { wireResizableRegions } from './chunk-GS2QD3N7.js';
3
4
 
4
5
  export { wireScrollDividers } from './chunk-QYXKMLHO.js';
@@ -12,7 +13,7 @@ export { SunkenPanel } from './chunk-HPREYDKV.js';
12
13
  export { DialogSurface, PopupSurface } from './chunk-XIZRXI7N.js';
13
14
  export { TabBar } from './chunk-JOR5LGYE.js';
14
15
  export { SegmentedControl } from './chunk-NS2TBYM4.js';
15
- export { Select } from './chunk-72LLWYP2.js';
16
+ export { Select } from './chunk-NVKRZ5DI.js';
16
17
  export { ListInsetControl } from './chunk-AN5IWMTM.js';
17
18
  export { EmptyState } from './chunk-YLJ6X3AC.js';
18
19
  export { Grid } from './chunk-VR7MWD2X.js';
@@ -21,11 +22,11 @@ export { AppTab } from './chunk-HFLGWMG3.js';
21
22
  export { PopupMenu, closePopupMenu, openPopupMenuAt } from './chunk-NJZMR7HM.js';
22
23
  export { ResizableRegion, clampRegionSize, resizeRegionFromPointer } from './chunk-Y6KT7ZTR.js';
23
24
  export { Row } from './chunk-5D3WDMIK.js';
24
- export { ListHeader } from './chunk-IVLTEBBT.js';
25
- export { FieldLabel, Text } from './chunk-ZVYA6TLR.js';
25
+ export { ListHeader } from './chunk-M6BWQMQY.js';
26
+ export { FieldLabel, Text } from './chunk-4Y4L5YEI.js';
26
27
  export { ListInsetText } from './chunk-NMWDHZVM.js';
27
28
  export { ListItem, ListItemLink } from './chunk-HFQDSSED.js';
28
- export { ToolbarText } from './chunk-5PAVAR4B.js';
29
+ export { ToolbarText } from './chunk-VHXHLZ6R.js';
29
30
  export { DisclosureArrow } from './chunk-I4SDIMFA.js';
30
31
  export { FloatingToolbar } from './chunk-S3ECMF23.js';
31
32
 
@@ -35,7 +36,7 @@ export { Chip } from './chunk-DQDTZE4W.js';
35
36
  export { Pane } from './chunk-AOAW55JN.js';
36
37
  export { List } from './chunk-NVRJ7C3W.js';
37
38
 
38
- export { ToolbarActionLink, ToolbarControlGroup } from './chunk-GO2CZX4M.js';
39
+ export { ToolbarActionLink, ToolbarControlGroup } from './chunk-RRCD3A6G.js';
39
40
  export { Toolbar } from './chunk-BYHGRKC3.js';
40
41
  export { LucideIcon } from './chunk-PQQQXJGV.js';
41
42
  export { LoadingSpinner } from './chunk-3RE2JMZU.js';
@@ -1,5 +1,6 @@
1
1
  import { SafeHtml } from 'kerfjs';
2
2
  import { HeadingLevel } from './toolbar-text.js';
3
+ import './css-values.js';
3
4
 
4
5
  type ListHeaderRootAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
5
6
  'data-component'?: never;
@@ -1,4 +1,4 @@
1
- export { ListHeader } from './chunk-IVLTEBBT.js';
1
+ export { ListHeader } from './chunk-M6BWQMQY.js';
2
2
 
3
3
 
4
4
 
@@ -4,6 +4,7 @@ import { ToolbarConfig } from './toolbar.js';
4
4
  import { ToolbarTextSize, HeadingLevel } from './toolbar-text.js';
5
5
  import { PaneAppearance } from './pane.js';
6
6
  import './sides-BPSWde0A.js';
7
+ import './css-values.js';
7
8
 
8
9
  /**
9
10
  * One entry in a {@link NavStack}. The app owns the stack as an array (usually a
package/dist/nav-stack.js CHANGED
@@ -1,4 +1,4 @@
1
- export { NavStack } from './chunk-SJY7KC45.js';
1
+ export { NavStack } from './chunk-Z4EPMX25.js';
2
2
 
3
3
 
4
4
 
@@ -128,6 +128,9 @@ function installSelectLifecycle(prototype) {
128
128
  if (opening) {
129
129
  host.addOpenListeners();
130
130
  host.listbox.hidden = false;
131
+ host.popup.sync = host.classList.contains("kui-select--fit-menu") ? "width" : void 0;
132
+ host.popup.autoSize = "both";
133
+ host.popup.shiftPadding = 10;
131
134
  host.popup.active = true;
132
135
  window.requestAnimationFrame(() => {
133
136
  if (current()) host.setCurrentOption(host.currentOption);