@ixfx/components 0.5.18 → 0.5.20

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 (225) hide show
  1. package/bundle/index.d.ts +107 -112
  2. package/bundle/index.d.ts.map +1 -1
  3. package/bundle/index.js +736 -361
  4. package/bundle/index.js.map +1 -1
  5. package/bundle/style.css +4 -2
  6. package/dist/ac-text.d.ts +7 -12
  7. package/dist/ac-text.d.ts.map +1 -1
  8. package/dist/ac-text.js +5 -4
  9. package/dist/ac-text.js.map +1 -1
  10. package/dist/{button-CphdEaZd.js → button-pcDaCemT.js} +2 -2
  11. package/dist/{button-CphdEaZd.js.map → button-pcDaCemT.js.map} +1 -1
  12. package/dist/button.d.ts +2 -1
  13. package/dist/button.d.ts.map +1 -1
  14. package/dist/button.js +1 -1
  15. package/dist/checkbox.d.ts +1 -0
  16. package/dist/checkbox.d.ts.map +1 -1
  17. package/dist/checkbox.js +2 -2
  18. package/dist/checkbox.js.map +1 -1
  19. package/dist/{colour-picker-DbypcEp6.js → colour-picker-D43Q96r0.js} +29 -16
  20. package/dist/colour-picker-D43Q96r0.js.map +1 -0
  21. package/dist/colour-picker.d.ts +1 -1
  22. package/dist/colour-picker.js +1 -1
  23. package/dist/{crumb-navigation-DTwJ8468.js → crumb-navigation-Pif-kupA.js} +125 -27
  24. package/dist/crumb-navigation-Pif-kupA.js.map +1 -0
  25. package/dist/crumbs.d.ts +4 -4
  26. package/dist/crumbs.d.ts.map +1 -1
  27. package/dist/crumbs.js +1 -1
  28. package/dist/data-display.d.ts +2 -1
  29. package/dist/data-display.d.ts.map +1 -1
  30. package/dist/data-display.js +23 -25
  31. package/dist/data-display.js.map +1 -1
  32. package/dist/{decorate-VRK8rslU.js → decorate-DdjvVHS-.js} +2 -2
  33. package/dist/{decorate-VRK8rslU.js.map → decorate-DdjvVHS-.js.map} +1 -1
  34. package/dist/{defaults-DcE8RQJc.js → defaults-BkWCPJFL.js} +7 -1
  35. package/dist/{defaults-DcE8RQJc.js.map → defaults-BkWCPJFL.js.map} +1 -1
  36. package/dist/editable-label.d.ts +2 -1
  37. package/dist/editable-label.d.ts.map +1 -1
  38. package/dist/editable-label.js +2 -2
  39. package/dist/editable-label.js.map +1 -1
  40. package/dist/fallbacks-DEE1nCTt.js +406 -0
  41. package/dist/fallbacks-DEE1nCTt.js.map +1 -0
  42. package/dist/{hex-editor-Bk6rxhfg.js → hex-editor-B-UI4OZu.js} +8 -6
  43. package/dist/{hex-editor-Bk6rxhfg.js.map → hex-editor-B-UI4OZu.js.map} +1 -1
  44. package/dist/{hex-editor-Caq8vNQk.d.ts → hex-editor-CMIxtNgT.d.ts} +3 -2
  45. package/dist/hex-editor-CMIxtNgT.d.ts.map +1 -0
  46. package/dist/hex.d.ts +1 -1
  47. package/dist/hex.js +1 -1
  48. package/dist/highlight-B-eQrhhb.js.map +1 -1
  49. package/dist/{icon-BUwP1CZ1.d.ts → icon-Bd5BiU4b.d.ts} +4 -3
  50. package/dist/icon-Bd5BiU4b.d.ts.map +1 -0
  51. package/dist/{icon-DG9Lm3LT.js → icon-CK14NUcE.js} +5 -7
  52. package/dist/{icon-DG9Lm3LT.js.map → icon-CK14NUcE.js.map} +1 -1
  53. package/dist/icons.d.ts +2 -2
  54. package/dist/icons.js +2 -2
  55. package/dist/{incr-search-2pz21xtR.js → incr-search-CeERfijK.js} +6 -9
  56. package/dist/{incr-search-2pz21xtR.js.map → incr-search-CeERfijK.js.map} +1 -1
  57. package/dist/incr-search.d.ts +1 -1
  58. package/dist/incr-search.js +1 -1
  59. package/dist/{index-D9u_Q7-b.d.ts → index-BslNaMLo.d.ts} +3 -3
  60. package/dist/index-BslNaMLo.d.ts.map +1 -0
  61. package/dist/{index-DkhBGHgF.d.ts → index-Cdmrn0SZ.d.ts} +11 -11
  62. package/dist/index-Cdmrn0SZ.d.ts.map +1 -0
  63. package/dist/{index-BUB5SICW.d.ts → index-CkMIKEWp.d.ts} +4 -3
  64. package/dist/index-CkMIKEWp.d.ts.map +1 -0
  65. package/dist/{index-RqMh1i-O.d.ts → index-D87kRcEs.d.ts} +1 -2
  66. package/dist/index-D87kRcEs.d.ts.map +1 -0
  67. package/dist/{index-BKAlRgbq.d.ts → index-DrKRD8_a.d.ts} +7 -4
  68. package/dist/index-DrKRD8_a.d.ts.map +1 -0
  69. package/dist/{index-BeuCXtiO.d.ts → index-tX6fKF8m.d.ts} +3 -3
  70. package/dist/index-tX6fKF8m.d.ts.map +1 -0
  71. package/dist/index.d.ts +48 -53
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/index.js +155 -122
  74. package/dist/index.js.map +1 -1
  75. package/dist/interaction-_Y2qO3QI.js +1 -0
  76. package/dist/{labelled-input-base-hoKGwyKT.js → labelled-input-base-9K_w3oLj.js} +2 -2
  77. package/dist/{labelled-input-base-hoKGwyKT.js.map → labelled-input-base-9K_w3oLj.js.map} +1 -1
  78. package/dist/{labelled-input-base-Dp_9KP0G.d.ts → labelled-input-base-ORb1rGq6.d.ts} +3 -2
  79. package/dist/labelled-input-base-ORb1rGq6.d.ts.map +1 -0
  80. package/dist/labelled-radial-input.d.ts +5 -4
  81. package/dist/labelled-radial-input.d.ts.map +1 -1
  82. package/dist/labelled-radial-input.js +4 -4
  83. package/dist/labelled-radial-input.js.map +1 -1
  84. package/dist/labelled-range-input.d.ts +1 -1
  85. package/dist/labelled-range-input.js +2 -2
  86. package/dist/labelled-range-input.js.map +1 -1
  87. package/dist/led.d.ts +2 -2
  88. package/dist/led.d.ts.map +1 -1
  89. package/dist/led.js +3 -5
  90. package/dist/led.js.map +1 -1
  91. package/dist/{menu-CdwSe_XN.js → menu-BiFarLUA.js} +9 -8
  92. package/dist/{menu-CdwSe_XN.js.map → menu-BiFarLUA.js.map} +1 -1
  93. package/dist/{menu-item-BG5w7fi4.d.ts → menu-item-AtoP6bD4.d.ts} +4 -4
  94. package/dist/menu-item-AtoP6bD4.d.ts.map +1 -0
  95. package/dist/{menu-item-CrmUwIoJ.js → menu-item-yHSPV8nS.js} +10 -9
  96. package/dist/{menu-item-CrmUwIoJ.js.map → menu-item-yHSPV8nS.js.map} +1 -1
  97. package/dist/menu.d.ts +2 -2
  98. package/dist/menu.js +2 -2
  99. package/dist/miller.d.ts +5 -7
  100. package/dist/miller.d.ts.map +1 -1
  101. package/dist/miller.js +26 -24
  102. package/dist/miller.js.map +1 -1
  103. package/dist/narrowed-text.d.ts +2 -1
  104. package/dist/narrowed-text.d.ts.map +1 -1
  105. package/dist/narrowed-text.js +14 -15
  106. package/dist/narrowed-text.js.map +1 -1
  107. package/dist/panel.d.ts +1 -1
  108. package/dist/panel.d.ts.map +1 -1
  109. package/dist/panel.js +3 -3
  110. package/dist/panel.js.map +1 -1
  111. package/dist/plots.d.ts +1 -1
  112. package/dist/plots.js +1 -1
  113. package/dist/polar-pad.d.ts +2 -1
  114. package/dist/polar-pad.d.ts.map +1 -1
  115. package/dist/polar-pad.js +3 -3
  116. package/dist/polar-pad.js.map +1 -1
  117. package/dist/{radial-input-CVxGH-Cp.js → radial-input-C4f-2Bya.js} +15 -25
  118. package/dist/{radial-input-CVxGH-Cp.js.map → radial-input-C4f-2Bya.js.map} +1 -1
  119. package/dist/{radial-input-BhZeyyP-.d.ts → radial-input-Dhu5ZGP5.d.ts} +3 -2
  120. package/dist/radial-input-Dhu5ZGP5.d.ts.map +1 -0
  121. package/dist/radial-input.d.ts +1 -1
  122. package/dist/radial-input.js +1 -1
  123. package/dist/range-input.d.ts +3 -2
  124. package/dist/range-input.d.ts.map +1 -1
  125. package/dist/range-input.js +3 -3
  126. package/dist/range-input.js.map +1 -1
  127. package/dist/range.d.ts +3 -2
  128. package/dist/range.d.ts.map +1 -1
  129. package/dist/range.js +3 -3
  130. package/dist/range.js.map +1 -1
  131. package/dist/selecthorizontal.d.ts +2 -1
  132. package/dist/selecthorizontal.d.ts.map +1 -1
  133. package/dist/selecthorizontal.js +2 -2
  134. package/dist/selecthorizontal.js.map +1 -1
  135. package/dist/{slider-input-TidGhvXt.d.ts → slider-input-BEaztT-g.d.ts} +3 -2
  136. package/dist/slider-input-BEaztT-g.d.ts.map +1 -0
  137. package/dist/{slider-input-CzmSVgm7.js → slider-input-SW7e2Ac2.js} +28 -31
  138. package/dist/{slider-input-CzmSVgm7.js.map → slider-input-SW7e2Ac2.js.map} +1 -1
  139. package/dist/slider-input.d.ts +1 -1
  140. package/dist/slider-input.js +1 -1
  141. package/dist/snap-container.d.ts +2 -1
  142. package/dist/snap-container.d.ts.map +1 -1
  143. package/dist/snap-container.js +5 -6
  144. package/dist/snap-container.js.map +1 -1
  145. package/dist/split-layout.d.ts +9 -2
  146. package/dist/split-layout.d.ts.map +1 -1
  147. package/dist/split-layout.js +88 -20
  148. package/dist/split-layout.js.map +1 -1
  149. package/dist/style.css +4 -2
  150. package/dist/swipe.d.ts +2 -1
  151. package/dist/swipe.d.ts.map +1 -1
  152. package/dist/swipe.js +4 -5
  153. package/dist/swipe.js.map +1 -1
  154. package/dist/{tab-list-CLqlPnX-.d.ts → tab-list-B8v9KntS.d.ts} +12 -5
  155. package/dist/tab-list-B8v9KntS.d.ts.map +1 -0
  156. package/dist/{tab-list-6W5CgXix.js → tab-list-CR0v53KJ.js} +22 -4
  157. package/dist/tab-list-CR0v53KJ.js.map +1 -0
  158. package/dist/tabs.d.ts +1 -1
  159. package/dist/tabs.js +1 -1
  160. package/dist/{tickled-controller-BF2Ea0DE.d.ts → tickled-controller-JDOR9B8V.d.ts} +9 -6
  161. package/dist/tickled-controller-JDOR9B8V.d.ts.map +1 -0
  162. package/dist/{tickled-styles-fNDdqf6l.js → tickled-styles-Bgo_Lpw-.js} +28 -28
  163. package/dist/tickled-styles-Bgo_Lpw-.js.map +1 -0
  164. package/dist/{timeline-B2fgDL4U.js → timeline-CdSI003L.js} +3 -3
  165. package/dist/{timeline-B2fgDL4U.js.map → timeline-CdSI003L.js.map} +1 -1
  166. package/dist/timeline.d.ts +1 -1
  167. package/dist/timeline.js +1 -1
  168. package/dist/{tooltip-BlvBUQxx.d.ts → tooltip-BMTSUPBU.d.ts} +3 -2
  169. package/dist/tooltip-BMTSUPBU.d.ts.map +1 -0
  170. package/dist/{tree-BtiiDX1a.js → tree-CqPhQRHo.js} +11 -10
  171. package/dist/{tree-BtiiDX1a.js.map → tree-CqPhQRHo.js.map} +1 -1
  172. package/dist/{tree-component-DQ9vzdy5.d.ts → tree-component-CDLO1ITF.d.ts} +124 -8
  173. package/dist/tree-component-CDLO1ITF.d.ts.map +1 -0
  174. package/dist/tree.d.ts +4 -9
  175. package/dist/tree.d.ts.map +1 -1
  176. package/dist/tree.js +1 -1
  177. package/dist/types-DSfbtHs3.d.ts +8 -0
  178. package/dist/types-DSfbtHs3.d.ts.map +1 -0
  179. package/dist/{wheel-nudge-DgMTRYlh.d.ts → wheel-nudge-C-ra_1os.d.ts} +2 -1
  180. package/dist/wheel-nudge-C-ra_1os.d.ts.map +1 -0
  181. package/dist/{wheel-nudge-BlSCe_hD.js → wheel-nudge-Dhzi5nHc.js} +2 -2
  182. package/dist/{wheel-nudge-BlSCe_hD.js.map → wheel-nudge-Dhzi5nHc.js.map} +1 -1
  183. package/dist/{xy-axis-CxHC8z5E.js → xy-axis-BpA2eJq6.js} +4 -6
  184. package/dist/{xy-axis-CxHC8z5E.js.map → xy-axis-BpA2eJq6.js.map} +1 -1
  185. package/dist/{xy-axis-5KhVTNoX.d.ts → xy-axis-CtDDQzGZ.d.ts} +6 -8
  186. package/dist/xy-axis-CtDDQzGZ.d.ts.map +1 -0
  187. package/dist/xy-pad.d.ts +2 -1
  188. package/dist/xy-pad.d.ts.map +1 -1
  189. package/dist/xy-pad.js +3 -3
  190. package/dist/xy-pad.js.map +1 -1
  191. package/docs-user/ac-token.md +7 -1
  192. package/docs-user/colour-picker.md +8 -4
  193. package/docs-user/crumbs.md +4 -0
  194. package/docs-user/menu.md +11 -8
  195. package/docs-user/split-layout.md +29 -7
  196. package/package.json +3 -1
  197. package/dist/colour-picker-DbypcEp6.js.map +0 -1
  198. package/dist/crumb-navigation-DTwJ8468.js.map +0 -1
  199. package/dist/fallbacks-DPgPEqo8.js +0 -218
  200. package/dist/fallbacks-DPgPEqo8.js.map +0 -1
  201. package/dist/hex-editor-Caq8vNQk.d.ts.map +0 -1
  202. package/dist/icon-BUwP1CZ1.d.ts.map +0 -1
  203. package/dist/index-BKAlRgbq.d.ts.map +0 -1
  204. package/dist/index-BUB5SICW.d.ts.map +0 -1
  205. package/dist/index-BeuCXtiO.d.ts.map +0 -1
  206. package/dist/index-D9u_Q7-b.d.ts.map +0 -1
  207. package/dist/index-DkhBGHgF.d.ts.map +0 -1
  208. package/dist/index-RqMh1i-O.d.ts.map +0 -1
  209. package/dist/interaction-D6efrBLo.js +0 -1
  210. package/dist/labelled-input-base-Dp_9KP0G.d.ts.map +0 -1
  211. package/dist/menu-item-BG5w7fi4.d.ts.map +0 -1
  212. package/dist/radial-input-BhZeyyP-.d.ts.map +0 -1
  213. package/dist/slider-input-TidGhvXt.d.ts.map +0 -1
  214. package/dist/tab-list-6W5CgXix.js.map +0 -1
  215. package/dist/tab-list-CLqlPnX-.d.ts.map +0 -1
  216. package/dist/tickled-controller-BF2Ea0DE.d.ts.map +0 -1
  217. package/dist/tickled-styles-fNDdqf6l.js.map +0 -1
  218. package/dist/tooltip-BlvBUQxx.d.ts.map +0 -1
  219. package/dist/tree-component-DQ9vzdy5.d.ts.map +0 -1
  220. package/dist/types-DO3gt5vg.d.ts +0 -130
  221. package/dist/types-DO3gt5vg.d.ts.map +0 -1
  222. package/dist/wheel-nudge-DgMTRYlh.d.ts.map +0 -1
  223. package/dist/xy-axis-5KhVTNoX.d.ts.map +0 -1
  224. /package/bundle/{rolldown-runtime-D7D4PA-g.js → chunk-D7D4PA-g.js} +0 -0
  225. /package/dist/{rolldown-runtime-D7D4PA-g.js → chunk-D7D4PA-g.js} +0 -0
package/bundle/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.js";
1
+ import { t as __exportAll } from "./chunk-D7D4PA-g.js";
2
2
  import { eventOptions, property, query, queryAssignedElements, state } from "lit/decorators.js";
3
3
  import { unsafeHTML } from "lit/directives/unsafe-html.js";
4
4
  import { Fzf } from "fzf";
@@ -18,10 +18,7 @@ import { keyed } from "lit/directives/keyed.js";
18
18
  * Copyright 2019 Google LLC
19
19
  * SPDX-License-Identifier: BSD-3-Clause
20
20
  */
21
- const t$1 = globalThis;
22
- const e$2 = t$1.ShadowRoot && (void 0 === t$1.ShadyCSS || t$1.ShadyCSS.nativeShadow) && "adoptedStyleSheets" in Document.prototype && "replace" in CSSStyleSheet.prototype;
23
- const s$2 = Symbol();
24
- const o$3 = /* @__PURE__ */ new WeakMap();
21
+ const t$1 = globalThis, e$2 = t$1.ShadowRoot && (void 0 === t$1.ShadyCSS || t$1.ShadyCSS.nativeShadow) && "adoptedStyleSheets" in Document.prototype && "replace" in CSSStyleSheet.prototype, s$2 = Symbol(), o$3 = /* @__PURE__ */ new WeakMap();
25
22
  var n$2 = class {
26
23
  constructor(t, e, o) {
27
24
  if (this._$cssResult$ = !0, o !== s$2) throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");
@@ -40,22 +37,19 @@ var n$2 = class {
40
37
  return this.cssText;
41
38
  }
42
39
  };
43
- const r$2 = (t) => new n$2("string" == typeof t ? t : t + "", void 0, s$2);
44
- const i$3 = (t, ...e) => {
40
+ const r$2 = (t) => new n$2("string" == typeof t ? t : t + "", void 0, s$2), i$3 = (t, ...e) => {
45
41
  return new n$2(1 === t.length ? t[0] : e.reduce((e, s, o) => e + ((t) => {
46
42
  if (!0 === t._$cssResult$) return t.cssText;
47
43
  if ("number" == typeof t) return t;
48
44
  throw Error("Value passed to 'css' function must be a 'css' function result: " + t + ". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.");
49
45
  })(s) + t[o + 1], t[0]), t, s$2);
50
- };
51
- const S$1 = (s, o) => {
46
+ }, S$1 = (s, o) => {
52
47
  if (e$2) s.adoptedStyleSheets = o.map((t) => t instanceof CSSStyleSheet ? t : t.styleSheet);
53
48
  else for (const e of o) {
54
49
  const o = document.createElement("style"), n = t$1.litNonce;
55
50
  void 0 !== n && o.setAttribute("nonce", n), o.textContent = e.cssText, s.appendChild(o);
56
51
  }
57
- };
58
- const c$2 = e$2 ? (t) => t : (t) => t instanceof CSSStyleSheet ? ((t) => {
52
+ }, c$2 = e$2 ? (t) => t : (t) => t instanceof CSSStyleSheet ? ((t) => {
59
53
  let e = "";
60
54
  for (const s of t.cssRules) e += s.cssText;
61
55
  return r$2(e);
@@ -165,7 +159,7 @@ var y$1 = class extends HTMLElement {
165
159
  static finalizeStyles(s) {
166
160
  const i = [];
167
161
  if (Array.isArray(s)) {
168
- const e = new Set(s.flat(1 / 0).reverse());
162
+ const e = new Set(s.flat(Infinity).reverse());
169
163
  for (const s of e) i.unshift(c$2(s));
170
164
  } else void 0 !== s && i.push(c$2(s));
171
165
  return i;
@@ -297,38 +291,11 @@ y$1.elementStyles = [], y$1.shadowRootOptions = { mode: "open" }, y$1[d$1("eleme
297
291
  * Copyright 2017 Google LLC
298
292
  * SPDX-License-Identifier: BSD-3-Clause
299
293
  */
300
- const t = globalThis;
301
- const i$1 = (t) => t;
302
- const s$1 = t.trustedTypes;
303
- const e = s$1 ? s$1.createPolicy("lit-html", { createHTML: (t) => t }) : void 0;
304
- const h = "$lit$";
305
- const o$1 = `lit$${Math.random().toFixed(9).slice(2)}$`;
306
- const n = "?" + o$1;
307
- const r = `<${n}>`;
308
- const l = document;
309
- const c = () => l.createComment("");
310
- const a = (t) => null === t || "object" != typeof t && "function" != typeof t;
311
- const u = Array.isArray;
312
- const d = (t) => u(t) || "function" == typeof t?.[Symbol.iterator];
313
- const f = "[ \n\f\r]";
314
- const v = /<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g;
315
- const _ = /-->/g;
316
- const m = />/g;
317
- const p = RegExp(`>|${f}(?:([^\\s"'>=/]+)(${f}*=${f}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`, "g");
318
- const g = /'/g;
319
- const $ = /"/g;
320
- const y = /^(?:script|style|textarea|title)$/i;
321
- const x = (t) => (i, ...s) => ({
294
+ const t = globalThis, i$1 = (t) => t, s$1 = t.trustedTypes, e = s$1 ? s$1.createPolicy("lit-html", { createHTML: (t) => t }) : void 0, h = "$lit$", o$1 = `lit$${Math.random().toFixed(9).slice(2)}$`, n = "?" + o$1, r = `<${n}>`, l = document, c = () => l.createComment(""), a = (t) => null === t || "object" != typeof t && "function" != typeof t, u = Array.isArray, d = (t) => u(t) || "function" == typeof t?.[Symbol.iterator], f = "[ \n\f\r]", v = /<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g, _ = /-->/g, m = />/g, p = RegExp(`>|${f}(?:([^\\s"'>=/]+)(${f}*=${f}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`, "g"), g = /'/g, $ = /"/g, y = /^(?:script|style|textarea|title)$/i, x = (t) => (i, ...s) => ({
322
295
  _$litType$: t,
323
296
  strings: i,
324
297
  values: s
325
- });
326
- const b = x(1);
327
- const w = x(2);
328
- const E = Symbol.for("lit-noChange");
329
- const A = Symbol.for("lit-nothing");
330
- const C = /* @__PURE__ */ new WeakMap();
331
- const P = l.createTreeWalker(l, 129);
298
+ }), b = x(1), w = x(2), E = Symbol.for("lit-noChange"), A = Symbol.for("lit-nothing"), C = /* @__PURE__ */ new WeakMap(), P = l.createTreeWalker(l, 129);
332
299
  function V(t, i) {
333
300
  if (!u(t) || !t.hasOwnProperty("raw")) throw Error("invalid template strings array");
334
301
  return void 0 !== e ? e.createHTML(i) : i;
@@ -666,10 +633,11 @@ function findTextNode(element, expectedText) {
666
633
  *
667
634
  * ## Global Mouse Tracking
668
635
  *
669
- * This controller uses a singleton global `pointermove` listener to track actual
670
- * mouse movement. This prevents `pointerenter` events caused by content scrolling
671
- * from incorrectly switching to mouse mode when the user is actually using keyboard
672
- * navigation.
636
+ * This controller uses a single, ref-counted global `pointermove` listener (shared
637
+ * across all instances) to track actual mouse movement. This prevents `pointerenter`
638
+ * events caused by content scrolling from incorrectly switching to mouse mode when
639
+ * the user is actually using keyboard navigation. The listener is attached when the
640
+ * first host connects and removed once the last host disconnects.
673
641
  *
674
642
  * @example
675
643
  * ```ts
@@ -716,7 +684,12 @@ var TickledController = class TickledController {
716
684
  this._mouseMovedSinceKeyboard = true;
717
685
  }
718
686
  static {
719
- this._globalListenerAttached = false;
687
+ this._listenerRefCount = 0;
688
+ }
689
+ static {
690
+ this._onGlobalPointerMove = (e) => {
691
+ TickledController.handleGlobalPointerMove(e.clientX, e.clientY);
692
+ };
720
693
  }
721
694
  constructor(host, config) {
722
695
  this._tickledId = void 0;
@@ -726,14 +699,13 @@ var TickledController = class TickledController {
726
699
  host.addController(this);
727
700
  }
728
701
  hostConnected() {
729
- if (!TickledController._globalListenerAttached) {
730
- document.addEventListener(`pointermove`, (e) => {
731
- TickledController.handleGlobalPointerMove(e.clientX, e.clientY);
732
- }, { passive: true });
733
- TickledController._globalListenerAttached = true;
734
- }
702
+ if (TickledController._listenerRefCount === 0) document.addEventListener(`pointermove`, TickledController._onGlobalPointerMove, { passive: true });
703
+ TickledController._listenerRefCount++;
704
+ }
705
+ hostDisconnected() {
706
+ TickledController._listenerRefCount--;
707
+ if (TickledController._listenerRefCount === 0) document.removeEventListener(`pointermove`, TickledController._onGlobalPointerMove);
735
708
  }
736
- hostDisconnected() {}
737
709
  /**
738
710
  * Get the current input mode
739
711
  */
@@ -876,19 +848,14 @@ var TickledController = class TickledController {
876
848
  *
877
849
  * ## CSS Variable Contract
878
850
  *
879
- * **Style variables (default values defined in `tickledItemStyles`):**
880
- * - `--item-bg`: Default background (default: transparent)
881
- * - `--item-bg-tickled`: Background when tickled (default: rgba(0, 0, 0, 0.06))
882
- * - `--item-bg-selected`: Background when selected (default: rgba(25, 118, 210, 1))
883
- * - `--item-bg-selected-tickled`: Background when selected AND tickled (default: rgba(21, 101, 192, 1))
884
- * - `--item-border`: Border style (default: 1px solid transparent)
885
- * - `--item-border-tickled`: Border when tickled (default: 1px solid var(--accent))
886
- * - `--item-border-selected`: Border when selected (default: 1px solid rgba(25, 118, 210, 1))
887
- * - `--item-text-tickled`: Text color when tickled (default: inherit)
888
- * - `--item-text-selected`: Text color when selected (default: #fff)
889
- * - `--item-padding`: Item padding (default: 4px 8px)
890
- * - `--item-border-radius`: Border radius (default: 4px)
891
- * - `--item-icon-spacing`: Gap between icon and text (default: 4px)
851
+ * **Style variables** `tickledItemStyles` only consumes these via `var()`; it
852
+ * defines no defaults itself. Fallback values (used when no theme CSS is loaded)
853
+ * are registered in `themeFallbacks` (`../styles/fallbacks.ts`) and mirror the
854
+ * documented base theme in `user-theming.md`:
855
+ * - `--item-bg`, `--item-bg-tickled`, `--item-bg-selected`, `--item-bg-selected-tickled`
856
+ * - `--item-border`, `--item-border-tickled`, `--item-border-selected` (full border shorthands, not colours)
857
+ * - `--item-text-tickled`, `--item-text-selected`
858
+ * - `--item-padding`, `--item-border-radius`, `--item-icon-spacing`
892
859
  *
893
860
  * ## Usage
894
861
  *
@@ -940,13 +907,13 @@ const tickledItemStyles = i$3`
940
907
 
941
908
  .item.tickled {
942
909
  background: var(--item-bg-tickled);
943
- border-color: var(--item-border-tickled);
910
+ border: var(--item-border-tickled);
944
911
  color: var(--item-text-tickled);
945
912
  }
946
913
 
947
914
  .item.selected {
948
915
  background: var(--item-bg-selected);
949
- border-color: var(--item-border-selected);
916
+ border: var(--item-border-selected);
950
917
  color: var(--item-text-selected);
951
918
  }
952
919
 
@@ -968,12 +935,13 @@ const tickledItemStyles = i$3`
968
935
  * - If no theme CSS is loaded, these initial values ensure components still
969
936
  * have visible backgrounds, text colours, etc.
970
937
  *
971
- * Spread this into any component whose styles reference theme variables:
972
- * ```ts
973
- * static styles = [themeFallbacks, css`...`];
974
- * ```
938
+ * `@property` registration is document-global it is not scoped per shadow
939
+ * root — so this is registered exactly once (via `_registerThemeFallbacksOnce`
940
+ * below) rather than adopted into every component's shadow-root stylesheet.
941
+ * Registering the same `@property` rule repeatedly across many shadow roots
942
+ * causes Chrome to log "Ignored @property rule" for every repeat.
975
943
  */
976
- const themeFallbacks = i$3`
944
+ const _themeFallbacksCss = i$3`
977
945
  @property --surface-0 {
978
946
  syntax: '<color>';
979
947
  inherits: true;
@@ -1017,7 +985,7 @@ const themeFallbacks = i$3`
1017
985
  @property --surface-5 {
1018
986
  syntax: '<color>';
1019
987
  inherits: true;
1020
- initial-value: oklch(28% 0.02 240);
988
+ initial-value: oklch(19% 0.02 240);
1021
989
  }
1022
990
  @property --surface-5-text {
1023
991
  syntax: '<color>';
@@ -1169,7 +1137,194 @@ const themeFallbacks = i$3`
1169
1137
  inherits: true;
1170
1138
  initial-value: 5ch;
1171
1139
  }
1140
+ @property --space-xs {
1141
+ syntax: '<length>';
1142
+ inherits: true;
1143
+ initial-value: 3px;
1144
+ }
1145
+ @property --space-s {
1146
+ syntax: '<length>';
1147
+ inherits: true;
1148
+ initial-value: 4px;
1149
+ }
1150
+ @property --space-m {
1151
+ syntax: '<length>';
1152
+ inherits: true;
1153
+ initial-value: 8px;
1154
+ }
1155
+ @property --space-l {
1156
+ syntax: '<length>';
1157
+ inherits: true;
1158
+ initial-value: 12px;
1159
+ }
1160
+ @property --space-xl {
1161
+ syntax: '<length>';
1162
+ inherits: true;
1163
+ initial-value: 16px;
1164
+ }
1165
+ @property --space-2xl {
1166
+ syntax: '<length>';
1167
+ inherits: true;
1168
+ initial-value: 20px;
1169
+ }
1170
+ @property --text-xs {
1171
+ syntax: '<length>';
1172
+ inherits: true;
1173
+ initial-value: 10px;
1174
+ }
1175
+ @property --text-s {
1176
+ syntax: '<length>';
1177
+ inherits: true;
1178
+ initial-value: 11px;
1179
+ }
1180
+ @property --text-m {
1181
+ syntax: '<length>';
1182
+ inherits: true;
1183
+ initial-value: 12px;
1184
+ }
1185
+ @property --text-l {
1186
+ syntax: '<length>';
1187
+ inherits: true;
1188
+ initial-value: 13px;
1189
+ }
1190
+ @property --text-xl {
1191
+ syntax: '<length>';
1192
+ inherits: true;
1193
+ initial-value: 16px;
1194
+ }
1195
+ @property --text-2xl {
1196
+ syntax: '<length>';
1197
+ inherits: true;
1198
+ initial-value: 20px;
1199
+ }
1200
+ @property --font-weight-bold {
1201
+ syntax: '<number>';
1202
+ inherits: true;
1203
+ initial-value: 600;
1204
+ }
1205
+ @property --radius-s {
1206
+ syntax: '<length>';
1207
+ inherits: true;
1208
+ initial-value: 3px;
1209
+ }
1210
+ @property --radius-m {
1211
+ syntax: '<length>';
1212
+ inherits: true;
1213
+ initial-value: 4px;
1214
+ }
1215
+ @property --radius-l {
1216
+ syntax: '<length>';
1217
+ inherits: true;
1218
+ initial-value: 6px;
1219
+ }
1220
+ @property --radius-xl {
1221
+ syntax: '<length>';
1222
+ inherits: true;
1223
+ initial-value: 8px;
1224
+ }
1225
+ @property --shadow-m {
1226
+ syntax: '*';
1227
+ inherits: true;
1228
+ initial-value: 0 4px 12px rgba(0, 0, 0, 0.3);
1229
+ }
1230
+ @property --shadow-l {
1231
+ syntax: '*';
1232
+ inherits: true;
1233
+ initial-value: 0 4px 24px rgba(0, 0, 0, 0.5);
1234
+ }
1235
+ @property --item-bg {
1236
+ syntax: '<color>';
1237
+ inherits: true;
1238
+ initial-value: transparent;
1239
+ }
1240
+ @property --item-bg-tickled {
1241
+ syntax: '<color>';
1242
+ inherits: true;
1243
+ initial-value: oklch(19% 0.02 240);
1244
+ }
1245
+ @property --item-bg-selected {
1246
+ syntax: '<color>';
1247
+ inherits: true;
1248
+ initial-value: oklch(60% 0.15 140);
1249
+ }
1250
+ @property --item-bg-selected-tickled {
1251
+ syntax: '<color>';
1252
+ inherits: true;
1253
+ initial-value: color-mix(in oklch, oklch(60% 0.15 140) 80%, oklch(0% 0 0));
1254
+ }
1255
+ @property --item-text-tickled {
1256
+ syntax: '<color>';
1257
+ inherits: true;
1258
+ initial-value: #fff;
1259
+ }
1260
+ @property --item-text-selected {
1261
+ syntax: '<color>';
1262
+ inherits: true;
1263
+ initial-value: #fff;
1264
+ }
1265
+ @property --item-border {
1266
+ syntax: '*';
1267
+ inherits: true;
1268
+ initial-value: 1px solid oklch(19% 0.02 240);
1269
+ }
1270
+ @property --item-border-tickled {
1271
+ syntax: '*';
1272
+ inherits: true;
1273
+ initial-value: 1px solid color-mix(in oklch, oklch(60% 0.15 140) 40%, transparent);
1274
+ }
1275
+ @property --item-border-selected {
1276
+ syntax: '*';
1277
+ inherits: true;
1278
+ initial-value: 1px dashed oklch(60% 0.15 140);
1279
+ }
1280
+ @property --item-border-active {
1281
+ syntax: '*';
1282
+ inherits: true;
1283
+ initial-value: 2px solid oklch(60% 0.15 140);
1284
+ }
1285
+ @property --item-border-dragged {
1286
+ syntax: '*';
1287
+ inherits: true;
1288
+ initial-value: 2px dotted color-mix(in oklch, oklch(60% 0.15 140) 80%, transparent);
1289
+ }
1290
+ @property --item-border-disabled {
1291
+ syntax: '*';
1292
+ inherits: true;
1293
+ initial-value: 1px solid oklch(22% 0.02 240);
1294
+ }
1295
+ @property --item-padding {
1296
+ syntax: '*';
1297
+ inherits: true;
1298
+ initial-value: 4px 8px;
1299
+ }
1300
+ @property --item-border-radius {
1301
+ syntax: '<length>';
1302
+ inherits: true;
1303
+ initial-value: 4px;
1304
+ }
1305
+ @property --item-icon-spacing {
1306
+ syntax: '<length>';
1307
+ inherits: true;
1308
+ initial-value: 4px;
1309
+ }
1172
1310
  `;
1311
+ let _themeFallbacksRegistered = false;
1312
+ function _registerThemeFallbacksOnce() {
1313
+ if (_themeFallbacksRegistered || typeof document === `undefined`) return;
1314
+ _themeFallbacksRegistered = true;
1315
+ const styleEl = document.createElement(`style`);
1316
+ styleEl.textContent = _themeFallbacksCss.cssText;
1317
+ document.head.append(styleEl);
1318
+ }
1319
+ _registerThemeFallbacksOnce();
1320
+ /**
1321
+ * Spread this into any component whose styles reference theme variables.
1322
+ * It is an empty stylesheet — the actual `@property` rules are registered
1323
+ * once at the document level as a side effect of importing this module — so
1324
+ * this exists only to keep the familiar `static styles = [themeFallbacks, ...]`
1325
+ * pattern working across all consuming components.
1326
+ */
1327
+ const themeFallbacks = i$3``;
1173
1328
  //#endregion
1174
1329
  //#region src/styles/popup.ts
1175
1330
  /**
@@ -1227,7 +1382,7 @@ function svgToDataUri(svg) {
1227
1382
  return `url("data:image/svg+xml,${encodeURIComponent(svg)}")`;
1228
1383
  }
1229
1384
  //#endregion
1230
- //#region \0@oxc-project+runtime@0.143.0/helpers/esm/decorate.js
1385
+ //#region \0@oxc-project+runtime@0.133.0/helpers/esm/decorate.js
1231
1386
  function __decorate(decorators, target, key, desc) {
1232
1387
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1233
1388
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -1270,10 +1425,8 @@ let IxfxIconElement = class IxfxIconElement extends i {
1270
1425
  }
1271
1426
  updated(changed) {
1272
1427
  super.updated(changed);
1273
- if (changed.has(`rotate`)) {
1274
- if (this.rotate?.length > 0) this.style.setProperty(`--rotate`, this.rotate);
1275
- else this.style.removeProperty(`--rotate`);
1276
- }
1428
+ if (changed.has(`rotate`)) if (this.rotate?.length > 0) this.style.setProperty(`--rotate`, this.rotate);
1429
+ else this.style.removeProperty(`--rotate`);
1277
1430
  }
1278
1431
  static {
1279
1432
  this.styles = [themeFallbacks, i$3`
@@ -1438,6 +1591,7 @@ let AcTextElement = class AcTextElement extends i {
1438
1591
  if (!this._isOpen) return;
1439
1592
  e.preventDefault();
1440
1593
  this.#closePopup();
1594
+ break;
1441
1595
  }
1442
1596
  };
1443
1597
  this.#onItemPointerDown = (e, item) => {
@@ -2014,9 +2168,8 @@ function defaultSelector(item) {
2014
2168
  return String(item);
2015
2169
  }
2016
2170
  function createFuzzySearch(items, options = {}) {
2017
- const selector = options.selector ?? defaultSelector;
2018
2171
  const fzf = new Fzf(items, {
2019
- selector,
2172
+ selector: options.selector ?? defaultSelector,
2020
2173
  ...options.fzf ?? {}
2021
2174
  });
2022
2175
  const find = (query) => {
@@ -2458,6 +2611,15 @@ let AcTokenElement = class AcTokenElement extends i {
2458
2611
  this._tokens = [...value];
2459
2612
  this.#emitChange();
2460
2613
  }
2614
+ /**
2615
+ * Set the token list programmatically. Unlike the `tokens` property setter,
2616
+ * this does not dispatch `ac-token-change` — use it for initialisation or any
2617
+ * other programmatic update that should not re-enter a parent's own
2618
+ * `ac-token-change` handler.
2619
+ */
2620
+ setTokens(value) {
2621
+ this._tokens = [...value];
2622
+ }
2461
2623
  /** All committed token labels joined with commas. */
2462
2624
  get value() {
2463
2625
  return this._tokens.map((t) => t.label).join(`, `);
@@ -2478,7 +2640,8 @@ let AcTokenElement = class AcTokenElement extends i {
2478
2640
  if (changedProps.has(`completionProvider`)) this.#buildStaticProvider();
2479
2641
  if (this.#data.items !== this.#lastSuggestions) {
2480
2642
  this.#lastSuggestions = this.#data.items;
2481
- this._tickled.clearTickled();
2643
+ if (this.#data.items.length > 0) this._tickled.setTickled(0);
2644
+ else this._tickled.clearTickled();
2482
2645
  }
2483
2646
  }
2484
2647
  #buildStaticProvider() {
@@ -2548,6 +2711,7 @@ let AcTokenElement = class AcTokenElement extends i {
2548
2711
  e.preventDefault();
2549
2712
  this.#closePopup();
2550
2713
  this._selectedTokenIndex = void 0;
2714
+ break;
2551
2715
  }
2552
2716
  }
2553
2717
  #onPaste;
@@ -2665,10 +2829,9 @@ let AcTokenElement = class AcTokenElement extends i {
2665
2829
  });
2666
2830
  }
2667
2831
  #renderChip(item, index) {
2668
- const isSelected = this._selectedTokenIndex === index;
2669
2832
  return b`
2670
2833
  <span
2671
- class="token-chip ${isSelected ? `selected` : ``}"
2834
+ class="token-chip ${this._selectedTokenIndex === index ? `selected` : ``}"
2672
2835
  title=${item.subLabel ?? A}
2673
2836
  @pointerdown=${(e) => this.#onChipPointerDown(e, index)}
2674
2837
  >
@@ -2979,6 +3142,11 @@ const ICON_WARNING = `<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="
2979
3142
  * fill="currentColor" so it inherits CSS color.
2980
3143
  */
2981
3144
  const ICON_CHEVRON_RIGHT = `<svg viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"><path d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z"/></svg>`;
3145
+ /**
3146
+ * Folder with up arrow. Angled line style for navigating up one level.
3147
+ * fill="currentColor" so it inherits CSS color.
3148
+ */
3149
+ const ICON_FOLDER_UP = `<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 4L4 12h5v8h6v-8h5L12 4z"/></svg>`;
2982
3150
  function registerDefaults() {
2983
3151
  registerIcon(`chevron-down`, ICON_CHEVRON_DOWN);
2984
3152
  registerIcon(`chevron-right`, ICON_CHEVRON_RIGHT);
@@ -2986,6 +3154,7 @@ function registerDefaults() {
2986
3154
  registerIcon(`check`, ICON_CHECK);
2987
3155
  registerIcon(`close`, ICON_CLOSE);
2988
3156
  registerIcon(`error`, ICON_ERROR);
3157
+ registerIcon(`folder-up`, ICON_FOLDER_UP);
2989
3158
  registerIcon(`info`, ICON_INFO);
2990
3159
  registerIcon(`warning`, ICON_WARNING);
2991
3160
  }
@@ -3469,6 +3638,11 @@ let RadioGroup = class RadioGroup extends i {
3469
3638
  .radio-item:hover:not([disabled]) {
3470
3639
  opacity: 0.9;
3471
3640
  background: color-mix(in oklch, var(--surface-4) 80%, transparent);
3641
+ border-color: var(--accent, #666);
3642
+ box-shadow:
3643
+ inset 1px 1px 1px 1px color-mix(in oklch, var(--surface-5) 70%, transparent),
3644
+ inset -1px -1px 1px 1px color-mix(in oklch, var(--surface-2) 60%, transparent),
3645
+ 2px 2px 1px 0px color-mix(in oklch, var(--surface-2) 90%, transparent);
3472
3646
  }
3473
3647
 
3474
3648
  .radio-item.selected {
@@ -3632,6 +3806,7 @@ let MenuContainer = class MenuContainer extends i {
3632
3806
  e.preventDefault();
3633
3807
  e.stopPropagation();
3634
3808
  this._activateFocusedItem(items);
3809
+ break;
3635
3810
  }
3636
3811
  };
3637
3812
  }
@@ -4248,9 +4423,9 @@ let MenuItem = class MenuItem extends i {
4248
4423
  }
4249
4424
 
4250
4425
  :host(.tickled) .item {
4251
- background: rgba(0, 0, 0, 0.06);
4252
- border: 1px solid var(--accent);
4253
- color: inherit;
4426
+ background: var(--item-bg-tickled);
4427
+ border: var(--item-border-tickled);
4428
+ color: var(--item-text-tickled);
4254
4429
  }
4255
4430
 
4256
4431
  :host(:focus) {
@@ -5364,7 +5539,9 @@ let ColourPicker = class ColourPicker extends i {
5364
5539
  case `h`:
5365
5540
  this.h = value;
5366
5541
  break;
5367
- case `a`: this.a = value;
5542
+ case `a`:
5543
+ this.a = value;
5544
+ break;
5368
5545
  }
5369
5546
  e.stopPropagation();
5370
5547
  this.requestUpdate();
@@ -5474,7 +5651,9 @@ let ColourPicker = class ColourPicker extends i {
5474
5651
  case `h`:
5475
5652
  this.h = this._clampToRange(`h`, this.h);
5476
5653
  break;
5477
- case `a`: this.a = this._clampToRange(`a`, this.a);
5654
+ case `a`:
5655
+ this.a = this._clampToRange(`a`, this.a);
5656
+ break;
5478
5657
  }
5479
5658
  this.requestUpdate();
5480
5659
  }
@@ -5586,25 +5765,25 @@ let ColourPicker = class ColourPicker extends i {
5586
5765
  for (const v of trackBgVars) el.style.setProperty(v, grad);
5587
5766
  for (const v of trackValueVars) el.style.setProperty(v, `transparent`);
5588
5767
  }
5589
- if (this._previewEl) {
5590
- if (this.a < 1) {
5591
- const previewBg = `
5768
+ if (this._previewEl) if (this.a < 1) {
5769
+ const previewBg = `
5592
5770
  linear-gradient(oklch(${l} ${c} ${h} / ${a}), oklch(${l} ${c} ${h} / ${a})),
5593
5771
  repeating-conic-gradient(
5594
5772
  var(--surface-2) 0% 25%,
5595
5773
  var(--surface-4) 0% 50%
5596
5774
  ) 50% / 16px 16px
5597
5775
  `;
5598
- this._previewEl.style.background = previewBg;
5599
- } else this._previewEl.style.background = this.value;
5600
- }
5776
+ this._previewEl.style.background = previewBg;
5777
+ } else this._previewEl.style.background = this.value;
5601
5778
  }
5602
5779
  _dispatchInput() {
5603
5780
  const detail = {
5604
5781
  l: this.l,
5605
5782
  c: this.c,
5606
5783
  h: this.h,
5607
- a: this.a
5784
+ a: this.a,
5785
+ unit: `scalar`,
5786
+ space: `oklch`
5608
5787
  };
5609
5788
  this.dispatchEvent(new CustomEvent(`input`, {
5610
5789
  detail,
@@ -5617,7 +5796,9 @@ let ColourPicker = class ColourPicker extends i {
5617
5796
  l: this.l,
5618
5797
  c: this.c,
5619
5798
  h: this.h,
5620
- a: this.a
5799
+ a: this.a,
5800
+ unit: `scalar`,
5801
+ space: `oklch`
5621
5802
  };
5622
5803
  this.dispatchEvent(new CustomEvent(`change`, {
5623
5804
  detail,
@@ -5959,6 +6140,9 @@ let ColourPickerPopup = class ColourPickerPopup extends i {
5959
6140
  get value() {
5960
6141
  return oklchToCss(this.l, this.c, this.h, this.a);
5961
6142
  }
6143
+ set value(colour) {
6144
+ this.setColour(colour);
6145
+ }
5962
6146
  get _innerHidePreview() {
5963
6147
  if (this.mode === `fluid`) return !this.showPreview;
5964
6148
  return false;
@@ -5996,7 +6180,9 @@ let ColourPickerPopup = class ColourPickerPopup extends i {
5996
6180
  l: this.l,
5997
6181
  c: this.c,
5998
6182
  h: this.h,
5999
- a: this.a
6183
+ a: this.a,
6184
+ unit: `scalar`,
6185
+ space: `oklch`
6000
6186
  };
6001
6187
  this.dispatchEvent(new CustomEvent(`input`, {
6002
6188
  detail,
@@ -6009,7 +6195,9 @@ let ColourPickerPopup = class ColourPickerPopup extends i {
6009
6195
  l: this.l,
6010
6196
  c: this.c,
6011
6197
  h: this.h,
6012
- a: this.a
6198
+ a: this.a,
6199
+ unit: `scalar`,
6200
+ space: `oklch`
6013
6201
  };
6014
6202
  this.dispatchEvent(new CustomEvent(`change`, {
6015
6203
  detail,
@@ -6592,6 +6780,7 @@ let NarrowedTextElement = class NarrowedTextElement extends i {
6592
6780
  this._query = ``;
6593
6781
  this.tickled.clearTickled();
6594
6782
  this._updateFilteredItems();
6783
+ break;
6595
6784
  }
6596
6785
  };
6597
6786
  this.#onFocus = () => {
@@ -6811,13 +7000,12 @@ let NarrowedTextElement = class NarrowedTextElement extends i {
6811
7000
  (this.shadowRoot?.querySelector(`.search-input`))?.focus();
6812
7001
  }
6813
7002
  _selectItem(item, clearFilter = true) {
6814
- if (this.selectionMode === `single`) {
6815
- if (this._selectedValues.has(item.value) && !this.requiredSelection) this._selectedValues.clear();
6816
- else {
6817
- this._selectedValues.clear();
6818
- this._selectedValues.add(item.value);
6819
- }
6820
- } else if (this._selectedValues.has(item.value)) {
7003
+ if (this.selectionMode === `single`) if (this._selectedValues.has(item.value) && !this.requiredSelection) this._selectedValues.clear();
7004
+ else {
7005
+ this._selectedValues.clear();
7006
+ this._selectedValues.add(item.value);
7007
+ }
7008
+ else if (this._selectedValues.has(item.value)) {
6821
7009
  if (!this.requiredSelection || this._selectedValues.size > 1) this._selectedValues.delete(item.value);
6822
7010
  } else this._selectedValues.add(item.value);
6823
7011
  this._updateValueFromSelected();
@@ -7105,6 +7293,8 @@ let CrumbNavigationElement = class CrumbNavigationElement extends i {
7105
7293
  this.leadingCaret = false;
7106
7294
  this.caretEmbedded = true;
7107
7295
  this.hideRoot = false;
7296
+ this.padEnding = false;
7297
+ this.withUp = false;
7108
7298
  this.#previousSelectionKey = ``;
7109
7299
  this.#menuOpenedByKeyboard = false;
7110
7300
  this.#currentOpenTrigger = null;
@@ -7197,6 +7387,7 @@ let CrumbNavigationElement = class CrumbNavigationElement extends i {
7197
7387
  e.preventDefault();
7198
7388
  this.#shiftFocusToNarrowedText();
7199
7389
  }
7390
+ break;
7200
7391
  }
7201
7392
  };
7202
7393
  this.#onNarrowedTextBlur = () => {
@@ -7483,25 +7674,46 @@ let CrumbNavigationElement = class CrumbNavigationElement extends i {
7483
7674
  inline: `start`
7484
7675
  });
7485
7676
  }
7677
+ #updateTrailingWidth() {
7678
+ if (!this.padEnding || !this.shadowRoot) return;
7679
+ const hostContainer = this.shadowRoot.querySelector(`.host-container`);
7680
+ const trailing = this.shadowRoot.querySelector(`.trailing`);
7681
+ if (!hostContainer || !trailing) return;
7682
+ const segments = this.shadowRoot.querySelectorAll(`.crumb-segment`);
7683
+ const lastSegment = segments[segments.length - 1];
7684
+ if (!lastSegment) return;
7685
+ const containerWidth = hostContainer.getBoundingClientRect().width;
7686
+ const itemWidth = lastSegment.getBoundingClientRect().width;
7687
+ if (itemWidth < containerWidth) {
7688
+ trailing.style.width = `${containerWidth - itemWidth - 5}px`;
7689
+ requestAnimationFrame(() => {
7690
+ if (hostContainer.scrollWidth <= hostContainer.clientWidth) hostContainer.style.setProperty(`--scroll-fade-x-start`, `0px`, `important`);
7691
+ else hostContainer.style.removeProperty(`--scroll-fade-x-start`);
7692
+ });
7693
+ } else trailing.style.width = ``;
7694
+ }
7486
7695
  #setSelected(node) {
7487
7696
  const previous = this.selectedNode;
7488
7697
  if (previous) this.#previousSelectionKey = previous.item?.key ?? ``;
7489
7698
  else this.#previousSelectionKey = ``;
7490
- const previousSet = previous ? /* @__PURE__ */ new Set([previous]) : /* @__PURE__ */ new Set();
7699
+ const previousSet = previous ? new Set([previous]) : /* @__PURE__ */ new Set();
7491
7700
  this.selectedNode = node;
7492
- this._selectedNodes = /* @__PURE__ */ new Set([node]);
7701
+ this._selectedNodes = new Set([node]);
7493
7702
  if (this.root) {
7494
7703
  const path = this.#findPath(this.root, node);
7495
7704
  if (path) {
7496
7705
  const depth = this.hideRoot && path.length > 1 ? path.length - 2 : path.length - 1;
7497
7706
  requestAnimationFrame(() => {
7707
+ this.#updateTrailingWidth();
7708
+ const hostContainer = this.#getHostContainer();
7709
+ if (hostContainer) hostContainer.scrollLeft = 0;
7498
7710
  this.#scrollSegmentIntoView(depth);
7499
7711
  });
7500
7712
  }
7501
7713
  }
7502
7714
  this.dispatchEvent(new CustomEvent(`select`, {
7503
7715
  detail: {
7504
- selected: /* @__PURE__ */ new Set([node]),
7716
+ selected: new Set([node]),
7505
7717
  previous: previousSet
7506
7718
  },
7507
7719
  bubbles: true,
@@ -7625,6 +7837,15 @@ let CrumbNavigationElement = class CrumbNavigationElement extends i {
7625
7837
  composed: true
7626
7838
  }));
7627
7839
  }
7840
+ #onUpClick() {
7841
+ const r = this.root;
7842
+ const sel = this.selectedNode;
7843
+ if (!r || !sel) return;
7844
+ const path = this.#findPath(r, sel);
7845
+ if (!path || path.length <= 1) return;
7846
+ const parent = path[path.length - 2];
7847
+ this.#setSelected(parent);
7848
+ }
7628
7849
  /** Navigate to a node by key path. Returns false if any key is not found in already-loaded children. */
7629
7850
  navigateTo(keys) {
7630
7851
  if (!this.root?.children) return false;
@@ -7672,6 +7893,9 @@ let CrumbNavigationElement = class CrumbNavigationElement extends i {
7672
7893
  let pathNodes = this.#findPath(r, sel) ?? [r];
7673
7894
  if (this.hideRoot && pathNodes.length > 1) pathNodes = pathNodes.slice(1);
7674
7895
  this.#hasChildOptions();
7896
+ const isAtRoot = (() => {
7897
+ return (this.#findPath(r, sel) ?? [r]).length <= 1;
7898
+ })();
7675
7899
  const parts = [];
7676
7900
  let segmentId = 0;
7677
7901
  pathNodes.forEach((node, i) => {
@@ -7785,18 +8009,29 @@ let CrumbNavigationElement = class CrumbNavigationElement extends i {
7785
8009
  }
7786
8010
  });
7787
8011
  return b`
7788
- <div
7789
- class="host-container scroll-fade-x"
7790
- tabindex="0"
7791
- @focus=${this.#onFocus}
7792
- @blur=${this.#onBlur}
7793
- @keydown=${this.#onKeyDown}
7794
- @click=${this.#onHostClick}
7795
- @menu-trigger-close=${this.#onMenuTriggerClose}
7796
- @mouseout=${(e) => this.tickled.handlePointerLeave(e)}
7797
- >
7798
- <div class="parts"
7799
- @mouseover=${(e) => {
8012
+ <div class="crumb-wrapper">
8013
+ ${this.withUp ? b`
8014
+ <button
8015
+ class="up-button"
8016
+ ?disabled=${isAtRoot}
8017
+ aria-label="Go up one level"
8018
+ @click=${this.#onUpClick}
8019
+ >
8020
+ <ixfx-icon name="folder-up"></ixfx-icon>
8021
+ </button>
8022
+ ` : A}
8023
+ <div
8024
+ class="host-container scroll-fade-x"
8025
+ tabindex="0"
8026
+ @focus=${this.#onFocus}
8027
+ @blur=${this.#onBlur}
8028
+ @keydown=${this.#onKeyDown}
8029
+ @click=${this.#onHostClick}
8030
+ @menu-trigger-close=${this.#onMenuTriggerClose}
8031
+ @mouseout=${(e) => this.tickled.handlePointerLeave(e)}
8032
+ >
8033
+ <div class="parts"
8034
+ @mouseover=${(e) => {
7800
8035
  if (this.#isWheelScrolling) return;
7801
8036
  const target = e.target;
7802
8037
  if (!(target instanceof HTMLElement)) return;
@@ -7817,8 +8052,9 @@ let CrumbNavigationElement = class CrumbNavigationElement extends i {
7817
8052
  composed: true
7818
8053
  }));
7819
8054
  }}
7820
- >${parts}<div class="trailing"></div></div>
7821
- ${this.showSuggestions ? this.#renderChildOptions() : A}
8055
+ >${parts}${this.padEnding ? b`<div class="trailing"></div>` : A}</div>
8056
+ ${this.showSuggestions ? this.#renderChildOptions() : A}
8057
+ </div>
7822
8058
  </div>
7823
8059
  `;
7824
8060
  }
@@ -7896,15 +8132,57 @@ let CrumbNavigationElement = class CrumbNavigationElement extends i {
7896
8132
  outline-offset: 2px;
7897
8133
  }
7898
8134
 
8135
+ .crumb-wrapper {
8136
+ display: flex;
8137
+ align-items: center;
8138
+ gap: var(--crumb-item-gap);
8139
+ width: 100%;
8140
+ }
8141
+
8142
+ .up-button {
8143
+ display: inline-flex;
8144
+ align-items: center;
8145
+ justify-content: center;
8146
+ flex-shrink: 0;
8147
+ background: var(--crumb-item-bg);
8148
+ border: var(--crumb-item-border);
8149
+ border-radius: var(--crumb-item-border-radius);
8150
+ padding: var(--crumb-item-padding);
8151
+ cursor: pointer;
8152
+ color: inherit;
8153
+ }
8154
+
8155
+ .up-button:disabled {
8156
+ opacity: 0.5;
8157
+ cursor: not-allowed;
8158
+ }
8159
+
8160
+ .up-button:hover:not(:disabled) {
8161
+ background: var(--crumb-item-bg-tickled);
8162
+ border-color: var(--crumb-item-border-tickled);
8163
+ }
8164
+
8165
+ .up-button ixfx-icon {
8166
+ width: 1em;
8167
+ height: 1em;
8168
+ pointer-events: none;
8169
+ }
8170
+
7899
8171
  /* Edge fade (shows/hides based on scroll position) comes from the
7900
8172
  * shared .scroll-fade-x class - see ../styles/scroll-fade.ts */
7901
8173
  .host-container {
7902
8174
  display: flex;
7903
- width: 100%;
8175
+ flex: 1;
8176
+ min-width: 0;
7904
8177
  outline: none;
7905
8178
  overflow: scroll;
7906
8179
  scroll-snap-type: x mandatory;
7907
8180
  scrollbar-width: none;
8181
+ overscroll-behavior: none;
8182
+ }
8183
+
8184
+ .host-container::-webkit-scrollbar {
8185
+ display: none;
7908
8186
  }
7909
8187
 
7910
8188
  .parts {
@@ -7913,9 +8191,7 @@ let CrumbNavigationElement = class CrumbNavigationElement extends i {
7913
8191
  }
7914
8192
 
7915
8193
  .trailing {
7916
- flex: 1;
7917
- min-width: 1em;
7918
- cursor: pointer;
8194
+ flex-shrink: 0;
7919
8195
  }
7920
8196
 
7921
8197
  .crumb-segment {
@@ -8131,6 +8407,16 @@ __decorate([property({
8131
8407
  reflect: true,
8132
8408
  attribute: `hide-root`
8133
8409
  })], CrumbNavigationElement.prototype, "hideRoot", void 0);
8410
+ __decorate([property({
8411
+ type: Boolean,
8412
+ reflect: true,
8413
+ attribute: `pad-ending`
8414
+ })], CrumbNavigationElement.prototype, "padEnding", void 0);
8415
+ __decorate([property({
8416
+ type: Boolean,
8417
+ reflect: true,
8418
+ attribute: `with-up`
8419
+ })], CrumbNavigationElement.prototype, "withUp", void 0);
8134
8420
  CrumbNavigationElement = __decorate([safeCustomElement(`ixfx-crumb-navigation`)], CrumbNavigationElement);
8135
8421
  //#endregion
8136
8422
  //#region src/crumbs/crumb-path-controller.ts
@@ -8251,6 +8537,7 @@ let CrumbPathElement = class CrumbPathElement extends i {
8251
8537
  case `Escape`:
8252
8538
  e.preventDefault();
8253
8539
  this.#closeDropdown();
8540
+ break;
8254
8541
  }
8255
8542
  };
8256
8543
  this.#onHostKeyDown = (e) => {
@@ -8589,11 +8876,9 @@ let CrumbPathElement = class CrumbPathElement extends i {
8589
8876
  #onHostKeyDown;
8590
8877
  render() {
8591
8878
  const segments = this.#getSegments();
8592
- if (this._editing) {
8593
- const editValue = this.path;
8594
- return b`
8879
+ if (this._editing) return b`
8595
8880
  <ixfx-ac-text
8596
- .value=${editValue}
8881
+ .value=${this.path}
8597
8882
  .tabSuffix=${this.separator}
8598
8883
  .completionProvider=${this.#makeCompletionProvider()}
8599
8884
  @change=${this.#onAcChange}
@@ -8601,7 +8886,6 @@ let CrumbPathElement = class CrumbPathElement extends i {
8601
8886
  @keydown=${this.#onAcKeyDown}
8602
8887
  ></ixfx-ac-text>
8603
8888
  `;
8604
- }
8605
8889
  const rootSegments = this.#getRootSegments();
8606
8890
  const leadingCaret = this.siblingLookup && rootSegments.length === 0 ? b`
8607
8891
  <div class="caret ${this._openIdx === -1 ? `open` : ``} ${this._confirmedLeafIndices.has(``) ? `disabled` : ``}"
@@ -8946,16 +9230,15 @@ let DataDisplayComponent = class DataDisplayComponent extends i {
8946
9230
  }
8947
9231
  continue;
8948
9232
  }
8949
- if (typeof value === `object` && value !== null && !Array.isArray(value)) {
8950
- if (this.#hasDescendantConfig(fullPath)) this.#walk(value, fullPath, activePaths);
8951
- else if (this.automap) {
8952
- const row = this.#ensureRow(fullPath, key);
8953
- this.#renderNestedDisplay(row, value, true);
8954
- } else {
8955
- const row = this.#ensureRow(fullPath, key);
8956
- this.#renderNestedDisplay(row, value);
8957
- }
9233
+ if (typeof value === `object` && value !== null && !Array.isArray(value)) if (this.#hasDescendantConfig(fullPath)) this.#walk(value, fullPath, activePaths);
9234
+ else if (this.automap) {
9235
+ const row = this.#ensureRow(fullPath, key);
9236
+ this.#renderNestedDisplay(row, value, true);
8958
9237
  } else {
9238
+ const row = this.#ensureRow(fullPath, key);
9239
+ this.#renderNestedDisplay(row, value);
9240
+ }
9241
+ else {
8959
9242
  const autoStyle = this.#determineAutoStyle(value);
8960
9243
  if (autoStyle !== void 0) {
8961
9244
  const row = this.#ensureRow(fullPath, key);
@@ -9036,15 +9319,13 @@ let DataDisplayComponent = class DataDisplayComponent extends i {
9036
9319
  case `plot`:
9037
9320
  if (typeof value === `number`) {
9038
9321
  if (changed) el.add(value);
9039
- } else if (typeof value === `object` && value !== null && changed) {
9040
- if (Array.isArray(value)) {
9041
- const record = {};
9042
- value.forEach((v, i) => {
9043
- if (typeof v === `number`) record[String(i)] = v;
9044
- });
9045
- if (Object.keys(record).length > 0) el.addData(record);
9046
- } else el.addData(value);
9047
- }
9322
+ } else if (typeof value === `object` && value !== null && changed) if (Array.isArray(value)) {
9323
+ const record = {};
9324
+ value.forEach((v, i) => {
9325
+ if (typeof v === `number`) record[String(i)] = v;
9326
+ });
9327
+ if (Object.keys(record).length > 0) el.addData(record);
9328
+ } else el.addData(value);
9048
9329
  this.#applyPlotOptions(el, style, options);
9049
9330
  break;
9050
9331
  case `plot-xy`:
@@ -9056,7 +9337,9 @@ let DataDisplayComponent = class DataDisplayComponent extends i {
9056
9337
  if (typeof value === `number` && changed) el.add(value);
9057
9338
  this.#applyPlotOptions(el, style, options);
9058
9339
  break;
9059
- case `time-elapsed`: el.textContent = this.#formatTimeElapsed(value);
9340
+ case `time-elapsed`:
9341
+ el.textContent = this.#formatTimeElapsed(value);
9342
+ break;
9060
9343
  }
9061
9344
  this.#previousValues.set(path, value);
9062
9345
  }
@@ -9102,10 +9385,9 @@ let DataDisplayComponent = class DataDisplayComponent extends i {
9102
9385
  #formatTimeElapsed(value) {
9103
9386
  let timestamp;
9104
9387
  if (value instanceof Date) timestamp = value.getTime();
9105
- else if (typeof value === `number`) {
9106
- if (value > 0xe8d4a51000) timestamp = value;
9107
- else timestamp = Date.now();
9108
- } else if (typeof value === `string`) timestamp = new Date(value).getTime();
9388
+ else if (typeof value === `number`) if (value > 0xe8d4a51000) timestamp = value;
9389
+ else timestamp = Date.now();
9390
+ else if (typeof value === `string`) timestamp = new Date(value).getTime();
9109
9391
  else return String(value);
9110
9392
  if (Number.isNaN(timestamp)) return String(value);
9111
9393
  const elapsed = Date.now() - timestamp;
@@ -9837,15 +10119,14 @@ let EditableNumber = class EditableNumber extends WheelNudgeMixin(EditableLabel)
9837
10119
  this.style.setProperty(`--value`, String(normalized));
9838
10120
  let valueStart = 0;
9839
10121
  let valueEnd = normalized;
9840
- if (this.linearStyle === `bipolar`) {
9841
- if (normalized <= .5) {
9842
- valueStart = normalized;
9843
- valueEnd = .5;
9844
- } else {
9845
- valueStart = .5;
9846
- valueEnd = normalized;
9847
- }
9848
- } else if (this.linearStyle === `unipolar`) {
10122
+ if (this.linearStyle === `bipolar`) if (normalized <= .5) {
10123
+ valueStart = normalized;
10124
+ valueEnd = .5;
10125
+ } else {
10126
+ valueStart = .5;
10127
+ valueEnd = normalized;
10128
+ }
10129
+ else if (this.linearStyle === `unipolar`) {
9849
10130
  valueStart = .5 - normalized * .5;
9850
10131
  valueEnd = .5 + normalized * .5;
9851
10132
  }
@@ -9908,6 +10189,7 @@ let EditableNumber = class EditableNumber extends WheelNudgeMixin(EditableLabel)
9908
10189
  case `End`:
9909
10190
  delta = (this.max ?? 0) - this._parseValue();
9910
10191
  handled = true;
10192
+ break;
9911
10193
  }
9912
10194
  if (handled) {
9913
10195
  e.preventDefault();
@@ -10256,15 +10538,13 @@ function collectFormValues(root) {
10256
10538
  root.querySelectorAll(`[name]`).forEach((el) => {
10257
10539
  const name = el.getAttribute(`name`);
10258
10540
  if (!name) return;
10259
- if (el instanceof HTMLInputElement) {
10260
- if (el.type === `radio`) {
10261
- if (el.checked) values[name] = el.value;
10262
- } else if (el.type === `checkbox`) values[name] = el.checked;
10263
- else values[name] = el.value;
10264
- } else if (el instanceof HTMLSelectElement) {
10265
- if (el.multiple) values[name] = Array.from(el.selectedOptions).map((opt) => opt.value);
10266
- else values[name] = el.value;
10267
- } else if (el instanceof HTMLTextAreaElement) values[name] = el.value;
10541
+ if (el instanceof HTMLInputElement) if (el.type === `radio`) {
10542
+ if (el.checked) values[name] = el.value;
10543
+ } else if (el.type === `checkbox`) values[name] = el.checked;
10544
+ else values[name] = el.value;
10545
+ else if (el instanceof HTMLSelectElement) if (el.multiple) values[name] = Array.from(el.selectedOptions).map((opt) => opt.value);
10546
+ else values[name] = el.value;
10547
+ else if (el instanceof HTMLTextAreaElement) values[name] = el.value;
10268
10548
  else if (`value` in el) values[name] = el.value;
10269
10549
  });
10270
10550
  return values;
@@ -11000,6 +11280,7 @@ let TreeBaseElement = class TreeBaseElement extends i {
11000
11280
  case `Escape`:
11001
11281
  event.preventDefault();
11002
11282
  this.#abortPending();
11283
+ break;
11003
11284
  }
11004
11285
  };
11005
11286
  this.#onDblClick = (e) => {
@@ -11261,7 +11542,9 @@ let TreeBaseElement = class TreeBaseElement extends i {
11261
11542
  case `manual`:
11262
11543
  this.#handleManualClick(node, depth, event);
11263
11544
  break;
11264
- case `checked`: this.#handleExpandOnly(node, depth);
11545
+ case `checked`:
11546
+ this.#handleExpandOnly(node, depth);
11547
+ break;
11265
11548
  }
11266
11549
  this.requestUpdate();
11267
11550
  }
@@ -11428,10 +11711,8 @@ let TreeBaseElement = class TreeBaseElement extends i {
11428
11711
  return node.children.every((child) => this.#allDescendantsSelected(child));
11429
11712
  }
11430
11713
  #applyCheckedToggle(node, selected) {
11431
- if (this.#canSelect(node)) {
11432
- if (selected) this._selectedNodes.add(node);
11433
- else this._selectedNodes.delete(node);
11434
- }
11714
+ if (this.#canSelect(node)) if (selected) this._selectedNodes.add(node);
11715
+ else this._selectedNodes.delete(node);
11435
11716
  if (node.children) for (const child of node.children) this.#applyCheckedToggle(child, selected);
11436
11717
  }
11437
11718
  #getFlatIndexOf(node) {
@@ -12249,7 +12530,9 @@ let VerticalListElement = class VerticalListElement extends i {
12249
12530
  }
12250
12531
  break;
12251
12532
  }
12252
- case `Escape`: this._clearSelection();
12533
+ case `Escape`:
12534
+ this._clearSelection();
12535
+ break;
12253
12536
  }
12254
12537
  };
12255
12538
  this._onClick = (e) => {
@@ -12437,7 +12720,7 @@ let VerticalListElement = class VerticalListElement extends i {
12437
12720
  if (this.selectionMode === `none`) return;
12438
12721
  if (!this._isCheckable(item)) return;
12439
12722
  const previous = this._selectedItems;
12440
- const next = /* @__PURE__ */ new Set([item]);
12723
+ const next = new Set([item]);
12441
12724
  this._selectedItems = next;
12442
12725
  this.#selectionAnchor = item;
12443
12726
  this._syncItemStates();
@@ -12527,7 +12810,9 @@ let VerticalListElement = class VerticalListElement extends i {
12527
12810
  else this._replaceSelection(item);
12528
12811
  break;
12529
12812
  case `checked`: break;
12530
- case `sticky`: this._toggleItem(item);
12813
+ case `sticky`:
12814
+ this._toggleItem(item);
12815
+ break;
12531
12816
  }
12532
12817
  }
12533
12818
  _handleSpaceKey(item) {
@@ -12614,10 +12899,7 @@ let VerticalListElement = class VerticalListElement extends i {
12614
12899
  if (wantsCustom) {
12615
12900
  cb.setAttribute(`aria-checked`, String(checked));
12616
12901
  cb.toggleAttribute(`data-checked`, checked);
12617
- if (this.checkboxRenderer) {
12618
- const renderer = typeof this.checkboxRenderer === `function` ? this.checkboxRenderer : this.checkboxRenderer.renderer;
12619
- D(renderer(checked), cb);
12620
- }
12902
+ if (this.checkboxRenderer) D((typeof this.checkboxRenderer === `function` ? this.checkboxRenderer : this.checkboxRenderer.renderer)(checked), cb);
12621
12903
  } else {
12622
12904
  const input = cb.querySelector(`input.ixfx-list-checkbox`);
12623
12905
  if (input) input.checked = checked;
@@ -13027,7 +13309,7 @@ function createVerticalListAdapter(renderItem, options) {
13027
13309
  }
13028
13310
  //#endregion
13029
13311
  //#region src/hex/colour.ts
13030
- const WHITESPACE_BYTES = /* @__PURE__ */ new Set([
13312
+ const WHITESPACE_BYTES = new Set([
13031
13313
  9,
13032
13314
  10,
13033
13315
  11,
@@ -13076,7 +13358,7 @@ function clamp$3(value) {
13076
13358
  function writeByte(store, pos, value) {
13077
13359
  const clampedValue = clamp$3(value);
13078
13360
  const before = store.data[pos];
13079
- const diff = /* @__PURE__ */ new Map([[pos, {
13361
+ const diff = new Map([[pos, {
13080
13362
  before,
13081
13363
  after: clampedValue
13082
13364
  }]]);
@@ -13285,7 +13567,9 @@ function extendRectangular(sel, dir, columns, _dataLength, anchorX = 0, anchorY
13285
13567
  height += 1;
13286
13568
  }
13287
13569
  break;
13288
- case `down`: height += 1;
13570
+ case `down`:
13571
+ height += 1;
13572
+ break;
13289
13573
  }
13290
13574
  return {
13291
13575
  kind: `rectangular`,
@@ -13331,7 +13615,7 @@ let IxfxHexEditorElement = class IxfxHexEditorElement extends i {
13331
13615
  this._containerH = 0;
13332
13616
  this._shadeMap = null;
13333
13617
  this._focusSide = null;
13334
- this._store = createHexStore(/* @__PURE__ */ new Uint8Array(0));
13618
+ this._store = createHexStore(new Uint8Array(0));
13335
13619
  this._undoStack = createUndoRedoStack();
13336
13620
  this._copyBuffer = null;
13337
13621
  this._rowHeight = 24;
@@ -14209,10 +14493,7 @@ function valueToAngle(relativeValue, valueMode, flatten) {
14209
14493
  switch (valueMode) {
14210
14494
  case `range`: return startAngle + relativeValue * totalArc;
14211
14495
  case `bipolar`: if (relativeValue <= .5) return startAngle + relativeValue / .5 * (MIDPOINT_ANGLE - startAngle);
14212
- else {
14213
- const t = (relativeValue - .5) / .5;
14214
- return MIDPOINT_ANGLE + t * (endAngle - MIDPOINT_ANGLE);
14215
- }
14496
+ else return MIDPOINT_ANGLE + (relativeValue - .5) / .5 * (endAngle - MIDPOINT_ANGLE);
14216
14497
  case `unipolar`: return MIDPOINT_ANGLE;
14217
14498
  default: return startAngle;
14218
14499
  }
@@ -14235,14 +14516,11 @@ function getValueArcAngles(relativeValue, valueMode, flatten) {
14235
14516
  startAngle: startAngle + relativeValue / .5 * (MIDPOINT_ANGLE - startAngle),
14236
14517
  endAngle: MIDPOINT_ANGLE
14237
14518
  };
14238
- else if (relativeValue > .5) {
14239
- const t = (relativeValue - .5) / .5;
14240
- const valueAngle = MIDPOINT_ANGLE + t * (endAngle - MIDPOINT_ANGLE);
14241
- return {
14242
- startAngle: MIDPOINT_ANGLE,
14243
- endAngle: valueAngle
14244
- };
14245
- } else return {
14519
+ else if (relativeValue > .5) return {
14520
+ startAngle: MIDPOINT_ANGLE,
14521
+ endAngle: MIDPOINT_ANGLE + (relativeValue - .5) / .5 * (endAngle - MIDPOINT_ANGLE)
14522
+ };
14523
+ else return {
14246
14524
  startAngle: MIDPOINT_ANGLE,
14247
14525
  endAngle: MIDPOINT_ANGLE
14248
14526
  };
@@ -14433,10 +14711,9 @@ function getMidpointPosition(radius, center = {
14433
14711
  x: 50,
14434
14712
  y: 50
14435
14713
  }) {
14436
- const position = polarToCartesian(MIDPOINT_ANGLE, radius, center);
14437
14714
  return {
14438
14715
  angle: MIDPOINT_ANGLE,
14439
- position
14716
+ position: polarToCartesian(MIDPOINT_ANGLE, radius, center)
14440
14717
  };
14441
14718
  }
14442
14719
  /**
@@ -14544,6 +14821,7 @@ let RadialInputElement = class RadialInputElement extends WheelNudgeMixin(i) {
14544
14821
  case `End`:
14545
14822
  this.#setValueFromRelative(1, true);
14546
14823
  handled = true;
14824
+ break;
14547
14825
  }
14548
14826
  if (handled) event.preventDefault();
14549
14827
  };
@@ -14666,13 +14944,10 @@ let RadialInputElement = class RadialInputElement extends WheelNudgeMixin(i) {
14666
14944
  #renderCircleBorder() {
14667
14945
  const path = generateCircleBorderPath(this.radius, this.flatten, CENTER);
14668
14946
  const borderWidth = this.#getCssVar(`--dial-border-width`, 2);
14669
- const borderColor = getComputedStyle(this).getPropertyValue(`--dial-border-color`).trim() || `var(--surface-4)`;
14670
- return w`<path class="dial-border" d="${path}" fill="none" stroke="${borderColor}" stroke-width="${borderWidth}" stroke-linecap="round" vector-effect="non-scaling-stroke" />`;
14947
+ return w`<path class="dial-border" d="${path}" fill="none" stroke="${getComputedStyle(this).getPropertyValue(`--dial-border-color`).trim() || `var(--surface-4)`}" stroke-width="${borderWidth}" stroke-linecap="round" vector-effect="non-scaling-stroke" />`;
14671
14948
  }
14672
14949
  #renderCircleFill() {
14673
- const path = generateCircleBorderPath(this.radius, this.flatten, CENTER);
14674
- const fill = getComputedStyle(this).getPropertyValue(`--dial-fill`).trim() || `transparent`;
14675
- return w`<path class="dial-fill" d="${path}" fill="${fill}" />`;
14950
+ return w`<path class="dial-fill" d="${generateCircleBorderPath(this.radius, this.flatten, CENTER)}" fill="${getComputedStyle(this).getPropertyValue(`--dial-fill`).trim() || `transparent`}" />`;
14676
14951
  }
14677
14952
  #renderWedge() {
14678
14953
  const { startAngle, endAngle, clockwise } = getWedgeAngles(this.#getRelativeValue(), this.valueMode, this.flatten);
@@ -14746,10 +15021,9 @@ let RadialInputElement = class RadialInputElement extends WheelNudgeMixin(i) {
14746
15021
  `;
14747
15022
  const length = this.#getCssVar(`--marker-length`, .8);
14748
15023
  const offset = this.#getCssVar(`--marker-offset`, .2);
14749
- const path = this.#getNeedlePath(angle, length, offset);
14750
15024
  return w`
14751
15025
  <g class="value-marker" part="value-marker">
14752
- <path d="${path}" />
15026
+ <path d="${this.#getNeedlePath(angle, length, offset)}" />
14753
15027
  </g>
14754
15028
  `;
14755
15029
  }
@@ -15224,16 +15498,14 @@ let LedElement = class LedElement extends i {
15224
15498
  }
15225
15499
  #blinkInterval;
15226
15500
  willUpdate(changedProperties) {
15227
- if (changedProperties.has(`value`)) this.style.setProperty(`--value`, String(this.value));
15501
+ if (changedProperties.has(`lit`)) this.value = this.lit ? 1 : 0;
15502
+ if (changedProperties.has(`value`) || changedProperties.has(`lit`)) this.style.setProperty(`--value`, String(this.value));
15228
15503
  if (changedProperties.has(`blinking`) || changedProperties.has(`rate`)) this.#updateBlinking();
15229
15504
  if (changedProperties.has(`rate`)) {
15230
15505
  const transitionMs = this.rate < 300 ? this.rate * .5 : 150;
15231
15506
  this.style.setProperty(`--transition-duration`, `${transitionMs}ms`);
15232
15507
  }
15233
15508
  }
15234
- updated(changedProperties) {
15235
- if (changedProperties.has(`lit`)) this.value = this.lit ? 1 : 0;
15236
- }
15237
15509
  disconnectedCallback() {
15238
15510
  super.disconnectedCallback();
15239
15511
  this.#stopBlinking();
@@ -15698,6 +15970,7 @@ let MenuSubTrigger = class MenuSubTrigger extends i {
15698
15970
  e.preventDefault();
15699
15971
  e.stopPropagation();
15700
15972
  this._hideSubmenu();
15973
+ break;
15701
15974
  }
15702
15975
  }
15703
15976
  static {
@@ -16269,20 +16542,19 @@ let MillerBaseElement = class MillerBaseElement extends i {
16269
16542
  const tickled = this.#getTickledNodeAndDepth();
16270
16543
  if (!tickled) return;
16271
16544
  const { node, depth, index } = tickled;
16272
- if (this.interactionMode === `standard` || this.interactionMode === `vscode`) {
16273
- if (event.shiftKey && this.#anchor?.depth === depth) {
16274
- const from = Math.min(this.#anchor.index, index);
16275
- const to = Math.max(this.#anchor.index, index);
16276
- this._selectedKeys = new Set(col.slice(from, to + 1).map((n) => n.item.key));
16277
- } else {
16278
- this._selectedKeys.add(node.item.key);
16279
- this.#anchor = {
16280
- key: node.item.key,
16281
- depth,
16282
- index
16283
- };
16284
- }
16285
- } else this._selectedByDepth.set(depth, node);
16545
+ if (this.interactionMode === `standard` || this.interactionMode === `vscode`) if (event.shiftKey && this.#anchor?.depth === depth) {
16546
+ const from = Math.min(this.#anchor.index, index);
16547
+ const to = Math.max(this.#anchor.index, index);
16548
+ this._selectedKeys = new Set(col.slice(from, to + 1).map((n) => n.item.key));
16549
+ } else {
16550
+ this._selectedKeys.add(node.item.key);
16551
+ this.#anchor = {
16552
+ key: node.item.key,
16553
+ depth,
16554
+ index
16555
+ };
16556
+ }
16557
+ else this._selectedByDepth.set(depth, node);
16286
16558
  this.dispatchEvent(new CustomEvent(`activate`, {
16287
16559
  detail: {
16288
16560
  node,
@@ -16308,6 +16580,7 @@ let MillerBaseElement = class MillerBaseElement extends i {
16308
16580
  }
16309
16581
  this.requestUpdate();
16310
16582
  }
16583
+ break;
16311
16584
  }
16312
16585
  };
16313
16586
  this.#onResizeStart = (event, depth) => {
@@ -16436,7 +16709,7 @@ let MillerBaseElement = class MillerBaseElement extends i {
16436
16709
  set selectedNode(node) {
16437
16710
  this.#lastSelectedNode = node;
16438
16711
  if (node) {
16439
- if (this.interactionMode === `implicit` || this.interactionMode === `standard`) this._selectedKeys = /* @__PURE__ */ new Set([node.item.key]);
16712
+ if (this.interactionMode === `implicit` || this.interactionMode === `standard`) this._selectedKeys = new Set([node.item.key]);
16440
16713
  }
16441
16714
  this.requestUpdate();
16442
16715
  }
@@ -16537,7 +16810,7 @@ let MillerBaseElement = class MillerBaseElement extends i {
16537
16810
  if (lastNode) this.tickled.setTickled(this.#buildTickledId(lastNode, lastDepth));
16538
16811
  if (this.interactionMode !== `implicit` && this.interactionMode !== `manual`) {
16539
16812
  const leafKey = keys.at(-1);
16540
- if (leafKey) this._selectedKeys = /* @__PURE__ */ new Set([leafKey]);
16813
+ if (leafKey) this._selectedKeys = new Set([leafKey]);
16541
16814
  }
16542
16815
  this.requestUpdate();
16543
16816
  this.#scrollNavigatedItemIntoView();
@@ -16742,14 +17015,16 @@ let MillerBaseElement = class MillerBaseElement extends i {
16742
17015
  this.#handleStandardClick(node, depth, event);
16743
17016
  break;
16744
17017
  case `manual`: break;
16745
- case `checked`: this.#expandNode(node, depth);
17018
+ case `checked`:
17019
+ this.#expandNode(node, depth);
17020
+ break;
16746
17021
  }
16747
17022
  }
16748
17023
  #handleImplicitClick(node, depth) {
16749
17024
  const previous = new Set(this._selectedNodes);
16750
17025
  this._selectedByDepth.set(depth, node);
16751
17026
  this.#lastSelectedNode = node;
16752
- this._selectedKeys = /* @__PURE__ */ new Set([node.item.key]);
17027
+ this._selectedKeys = new Set([node.item.key]);
16753
17028
  this._selectedNodes.clear();
16754
17029
  this._selectedNodes.add(node);
16755
17030
  this.#expandNode(node, depth);
@@ -16786,8 +17061,8 @@ let MillerBaseElement = class MillerBaseElement extends i {
16786
17061
  return;
16787
17062
  }
16788
17063
  const previous = new Set(this._selectedNodes);
16789
- this._selectedKeys = /* @__PURE__ */ new Set([node.item.key]);
16790
- this._selectedNodes = /* @__PURE__ */ new Set([node]);
17064
+ this._selectedKeys = new Set([node.item.key]);
17065
+ this._selectedNodes = new Set([node]);
16791
17066
  this.#anchor = index >= 0 ? {
16792
17067
  key: node.item.key,
16793
17068
  depth,
@@ -18855,7 +19130,6 @@ let PlotHistogram = class PlotHistogram extends i {
18855
19130
  };
18856
19131
  } else {
18857
19132
  const y = padding + i * bucketSize;
18858
- const height = i === bucketCount - 1 ? Math.max(0, padding + availableMain - y) : Math.max(0, bucketSize - gap);
18859
19133
  return {
18860
19134
  count,
18861
19135
  valueMin,
@@ -18864,7 +19138,7 @@ let PlotHistogram = class PlotHistogram extends i {
18864
19138
  x: padding,
18865
19139
  y,
18866
19140
  width: barLen,
18867
- height
19141
+ height: i === bucketCount - 1 ? Math.max(0, padding + availableMain - y) : Math.max(0, bucketSize - gap)
18868
19142
  };
18869
19143
  }
18870
19144
  });
@@ -19116,8 +19390,7 @@ function renderArea(points, cr, bottom, areaColor) {
19116
19390
  if (points.length < 2) return w``;
19117
19391
  const lineD = buildLinePath(points);
19118
19392
  const fillColor = areaColor || cr.fill;
19119
- const areaD = `${lineD} L ${points[points.length - 1].x},${bottom} L ${points[0].x},${bottom} Z`;
19120
- return w`<path d=${areaD} fill=${fillColor} opacity=${cr.opacity * .2} />`;
19393
+ return w`<path d=${`${lineD} L ${points[points.length - 1].x},${bottom} L ${points[0].x},${bottom} Z`} fill=${fillColor} opacity=${cr.opacity * .2} />`;
19121
19394
  }
19122
19395
  function renderCircles(points, crs, radius, ageStyle) {
19123
19396
  return points.map((p, i) => {
@@ -21119,13 +21392,11 @@ let RangeMultiElement = class RangeMultiElement extends i {
21119
21392
  }
21120
21393
  a = newA;
21121
21394
  b = newB;
21122
- } else if (which === `a`) {
21123
- if (v > this.b && this.crossover === `stop`) t.valueAsNumber = this.#scaleTo100(this.a);
21124
- else a = v;
21125
- } else if (which === `b`) {
21126
- if (v < a && this.crossover === `stop`) t.valueAsNumber = this.#scaleTo100(this.b);
21127
- else b = v;
21128
- } else throw new Error(`Expected 'a' or 'b', got: '${t.id}'`);
21395
+ } else if (which === `a`) if (v > this.b && this.crossover === `stop`) t.valueAsNumber = this.#scaleTo100(this.a);
21396
+ else a = v;
21397
+ else if (which === `b`) if (v < a && this.crossover === `stop`) t.valueAsNumber = this.#scaleTo100(this.b);
21398
+ else b = v;
21399
+ else throw new Error(`Expected 'a' or 'b', got: '${t.id}'`);
21129
21400
  this.setPoles(a, b);
21130
21401
  }
21131
21402
  setPoles(a, b) {
@@ -21184,65 +21455,63 @@ let RangeMultiElement = class RangeMultiElement extends i {
21184
21455
  const currentPos = isVertical ? current.offset.y : current.offset.x;
21185
21456
  const amt = (isVertical ? startPos - currentPos : currentPos - startPos) / valuePerPix;
21186
21457
  polesChanged = true;
21187
- if (draggingWhich === `a`) {
21188
- if (resizeMode === `bipolar`) {
21189
- const calcA = startA + amt;
21190
- const calcB = startB - amt;
21191
- if (calcA < min || calcB > max || calcA > max || calcB < min) return;
21192
- setPoles(calcA, calcB);
21193
- } else if (resizeMode === `bipolar-flex`) {
21194
- let calcA = startA + amt;
21195
- let calcB = startB;
21196
- if (startB <= min) calcB = min;
21197
- else if (startB >= max) calcB = max;
21198
- else {
21199
- calcA = startA + amt;
21200
- calcB = startB - amt;
21201
- }
21202
- if (calcA < min) calcA = min;
21203
- if (calcA > max) calcA = max;
21204
- if (calcB < min) calcB = min;
21205
- if (calcB > max) calcB = max;
21206
- if (calcA > calcB) return;
21207
- setPoles(calcA, calcB);
21208
- } else {
21209
- let constrainedAmt = amt;
21210
- if (startA + amt < min) constrainedAmt = min - startA;
21211
- if (startB + constrainedAmt > max) constrainedAmt = max - startB;
21212
- const finalA = startA + constrainedAmt;
21213
- const finalB = startB + constrainedAmt;
21214
- if (finalA >= min && finalB <= max) setPoles(finalA, finalB);
21458
+ if (draggingWhich === `a`) if (resizeMode === `bipolar`) {
21459
+ const calcA = startA + amt;
21460
+ const calcB = startB - amt;
21461
+ if (calcA < min || calcB > max || calcA > max || calcB < min) return;
21462
+ setPoles(calcA, calcB);
21463
+ } else if (resizeMode === `bipolar-flex`) {
21464
+ let calcA = startA + amt;
21465
+ let calcB = startB;
21466
+ if (startB <= min) calcB = min;
21467
+ else if (startB >= max) calcB = max;
21468
+ else {
21469
+ calcA = startA + amt;
21470
+ calcB = startB - amt;
21215
21471
  }
21216
- } else if (draggingWhich === `b`) {
21217
- if (resizeMode === `bipolar`) {
21218
- const calcA = startA - amt;
21219
- const calcB = startB + amt;
21220
- if (calcA < min || calcB > max || calcA > max || calcB < min) return;
21221
- setPoles(calcA, calcB);
21222
- } else if (resizeMode === `bipolar-flex`) {
21223
- let calcA = startA;
21224
- let calcB = startB + amt;
21225
- if (startA <= min) calcA = min;
21226
- else if (startA >= max) calcA = max;
21227
- else {
21228
- calcA = startA - amt;
21229
- calcB = startB + amt;
21230
- }
21231
- if (calcA < min) calcA = min;
21232
- if (calcA > max) calcA = max;
21233
- if (calcB < min) calcB = min;
21234
- if (calcB > max) calcB = max;
21235
- if (calcA > calcB) return;
21236
- setPoles(calcA, calcB);
21237
- } else {
21238
- let constrainedAmt = amt;
21239
- if (startA + amt < min) constrainedAmt = min - startA;
21240
- if (startB + constrainedAmt > max) constrainedAmt = max - startB;
21241
- const finalA = startA + constrainedAmt;
21242
- const finalB = startB + constrainedAmt;
21243
- if (finalA >= min && finalB <= max) setPoles(finalA, finalB);
21472
+ if (calcA < min) calcA = min;
21473
+ if (calcA > max) calcA = max;
21474
+ if (calcB < min) calcB = min;
21475
+ if (calcB > max) calcB = max;
21476
+ if (calcA > calcB) return;
21477
+ setPoles(calcA, calcB);
21478
+ } else {
21479
+ let constrainedAmt = amt;
21480
+ if (startA + amt < min) constrainedAmt = min - startA;
21481
+ if (startB + constrainedAmt > max) constrainedAmt = max - startB;
21482
+ const finalA = startA + constrainedAmt;
21483
+ const finalB = startB + constrainedAmt;
21484
+ if (finalA >= min && finalB <= max) setPoles(finalA, finalB);
21485
+ }
21486
+ else if (draggingWhich === `b`) if (resizeMode === `bipolar`) {
21487
+ const calcA = startA - amt;
21488
+ const calcB = startB + amt;
21489
+ if (calcA < min || calcB > max || calcA > max || calcB < min) return;
21490
+ setPoles(calcA, calcB);
21491
+ } else if (resizeMode === `bipolar-flex`) {
21492
+ let calcA = startA;
21493
+ let calcB = startB + amt;
21494
+ if (startA <= min) calcA = min;
21495
+ else if (startA >= max) calcA = max;
21496
+ else {
21497
+ calcA = startA - amt;
21498
+ calcB = startB + amt;
21244
21499
  }
21245
- } else if (resizeMode === `bipolar`) {
21500
+ if (calcA < min) calcA = min;
21501
+ if (calcA > max) calcA = max;
21502
+ if (calcB < min) calcB = min;
21503
+ if (calcB > max) calcB = max;
21504
+ if (calcA > calcB) return;
21505
+ setPoles(calcA, calcB);
21506
+ } else {
21507
+ let constrainedAmt = amt;
21508
+ if (startA + amt < min) constrainedAmt = min - startA;
21509
+ if (startB + constrainedAmt > max) constrainedAmt = max - startB;
21510
+ const finalA = startA + constrainedAmt;
21511
+ const finalB = startB + constrainedAmt;
21512
+ if (finalA >= min && finalB <= max) setPoles(finalA, finalB);
21513
+ }
21514
+ else if (resizeMode === `bipolar`) {
21246
21515
  const calcA = startA + amt;
21247
21516
  const calcB = startB + amt;
21248
21517
  if (calcA < min || calcB > max) return;
@@ -21803,13 +22072,13 @@ let SelectHorizElement = class SelectHorizElement extends WheelNudgeMixin(i) {
21803
22072
 
21804
22073
  ::slotted(.tickled) {
21805
22074
  background: var(--item-bg-tickled);
21806
- border-color: var(--item-border-tickled);
22075
+ border: var(--item-border-tickled);
21807
22076
  color: var(--item-text-tickled);
21808
22077
  }
21809
22078
 
21810
22079
  ::slotted([selected]) {
21811
22080
  background: var(--item-bg-selected);
21812
- border-color: var(--item-border-selected);
22081
+ border: var(--item-border-selected);
21813
22082
  color: var(--item-text-selected);
21814
22083
  }
21815
22084
 
@@ -21934,14 +22203,14 @@ function getTrackBounds(orientation) {
21934
22203
  if (orientation === `horizontal`) return {
21935
22204
  trackStart: 5,
21936
22205
  trackEnd: 95,
21937
- centre: 50,
21938
- crossCentre: 12
22206
+ centre: 100 / 2,
22207
+ crossCentre: 24 / 2
21939
22208
  };
21940
22209
  return {
21941
22210
  trackStart: 5,
21942
22211
  trackEnd: 95,
21943
- centre: 50,
21944
- crossCentre: 12
22212
+ centre: 100 / 2,
22213
+ crossCentre: 24 / 2
21945
22214
  };
21946
22215
  }
21947
22216
  /**
@@ -21961,12 +22230,11 @@ function valueToPosition(relativeValue, singleStyle, trackBounds, orientation) {
21961
22230
  const crossCentre = trackBounds.crossCentre;
21962
22231
  let pos;
21963
22232
  if (singleStyle === `range`) pos = trackBounds.trackStart + relativeValue * span;
21964
- else if (singleStyle === `bipolar`) {
21965
- if (relativeValue <= .5) {
21966
- const t = relativeValue / .5;
21967
- pos = trackBounds.trackStart + t * (centre - trackBounds.trackStart);
21968
- } else pos = centre + (relativeValue - .5) / .5 * (trackBounds.trackEnd - centre);
21969
- } else pos = centre + relativeValue * span / 2;
22233
+ else if (singleStyle === `bipolar`) if (relativeValue <= .5) {
22234
+ const t = relativeValue / .5;
22235
+ pos = trackBounds.trackStart + t * (centre - trackBounds.trackStart);
22236
+ } else pos = centre + (relativeValue - .5) / .5 * (trackBounds.trackEnd - centre);
22237
+ else pos = centre + relativeValue * span / 2;
21970
22238
  if (orientation === `horizontal`) return {
21971
22239
  x: pos,
21972
22240
  y: crossCentre
@@ -22377,6 +22645,7 @@ let SliderInputElement = class SliderInputElement extends WheelNudgeMixin(i) {
22377
22645
  if (this.valueMode === `single`) this.#setSingleValueFromRelative(1, true);
22378
22646
  else this.#stepHandleByRelativeDelta(handle, 1);
22379
22647
  handled = true;
22648
+ break;
22380
22649
  }
22381
22650
  if (handled) event.preventDefault();
22382
22651
  };
@@ -22622,10 +22891,9 @@ let SliderInputElement = class SliderInputElement extends WheelNudgeMixin(i) {
22622
22891
  const gap = this.#getEffectiveValueMin();
22623
22892
  const other = handle === `a` ? poleB : poleA;
22624
22893
  let desired = this.#quantise(clamp$1(proposed, this.min, this.max));
22625
- if (this.crossover === `none`) {
22626
- if ((handle === `a` ? poleA : poleB) <= other) desired = Math.min(desired, other - gap);
22627
- else desired = Math.max(desired, other + gap);
22628
- } else if (desired > other - gap && desired < other + gap) desired = Math.abs(desired - (other - gap)) <= Math.abs(desired - (other + gap)) ? other - gap : other + gap;
22894
+ if (this.crossover === `none`) if ((handle === `a` ? poleA : poleB) <= other) desired = Math.min(desired, other - gap);
22895
+ else desired = Math.max(desired, other + gap);
22896
+ else if (desired > other - gap && desired < other + gap) desired = Math.abs(desired - (other - gap)) <= Math.abs(desired - (other + gap)) ? other - gap : other + gap;
22629
22897
  desired = clamp$1(desired, this.min, this.max);
22630
22898
  if (handle === `a`) {
22631
22899
  if (desired === poleA) return null;
@@ -22898,7 +23166,7 @@ let SliderInputElement = class SliderInputElement extends WheelNudgeMixin(i) {
22898
23166
  if (isVertical) return w`
22899
23167
  <rect
22900
23168
  class="track"
22901
- x="${12 - strokeWidth / 2}"
23169
+ x="${24 / 2 - strokeWidth / 2}"
22902
23170
  y="${5}"
22903
23171
  width="${strokeWidth}"
22904
23172
  height="${90}"
@@ -22911,7 +23179,7 @@ let SliderInputElement = class SliderInputElement extends WheelNudgeMixin(i) {
22911
23179
  <rect
22912
23180
  class="track"
22913
23181
  x="${5}"
22914
- y="${12 - strokeWidth / 2}"
23182
+ y="${24 / 2 - strokeWidth / 2}"
22915
23183
  width="${90}"
22916
23184
  height="${strokeWidth}"
22917
23185
  fill="${fill}"
@@ -22979,9 +23247,9 @@ let SliderInputElement = class SliderInputElement extends WheelNudgeMixin(i) {
22979
23247
  const markerBorderWidth = this.#getCssVar(`--marker-border-width`, 0);
22980
23248
  const center = isHorizontal ? {
22981
23249
  x: pos.x,
22982
- y: bounds.crossCentre + markerOffset * 12
23250
+ y: bounds.crossCentre + markerOffset * (24 / 2)
22983
23251
  } : {
22984
- x: bounds.crossCentre + markerOffset * 12,
23252
+ x: bounds.crossCentre + markerOffset * (24 / 2),
22985
23253
  y: pos.y
22986
23254
  };
22987
23255
  const lowCenter = this.valueMode === `single` && this.singleStyle === `unipolar` ? isHorizontal ? {
@@ -22994,7 +23262,7 @@ let SliderInputElement = class SliderInputElement extends WheelNudgeMixin(i) {
22994
23262
  const id = handle ?? `s`;
22995
23263
  const effectiveMarkerStyle = handle === `c` && this.markerStyleC ? this.markerStyleC : this.markerStyle;
22996
23264
  if (effectiveMarkerStyle === `dot`) {
22997
- const r = markerThickness * 12;
23265
+ const r = markerThickness * (24 / 2);
22998
23266
  const renderDot = (cx, cy, mid) => {
22999
23267
  if (markerBorderWidth > 0) {
23000
23268
  defs.push(w`<circle id="dot-${mid}-path" cx="${cx}" cy="${cy}" r="${r}" />`);
@@ -23049,7 +23317,7 @@ let SliderInputElement = class SliderInputElement extends WheelNudgeMixin(i) {
23049
23317
  }
23050
23318
  if (effectiveMarkerStyle === `triangle`) {
23051
23319
  const halfLen = markerLength * 24 / 4;
23052
- const halfBase = markerThickness * 12;
23320
+ const halfBase = markerThickness * (24 / 2);
23053
23321
  const renderTriangle = (cx, cy, mid) => {
23054
23322
  let apex;
23055
23323
  let base1;
@@ -23114,7 +23382,7 @@ let SliderInputElement = class SliderInputElement extends WheelNudgeMixin(i) {
23114
23382
  const size = this.#getCssVar(`--midpoint-thickness`, .08);
23115
23383
  return w`
23116
23384
  <g class="midpoint-marker" part="midpoint-marker">
23117
- <circle cx="${center.x}" cy="${center.y}" r="${size * 12}" />
23385
+ <circle cx="${center.x}" cy="${center.y}" r="${size * (24 / 2)}" />
23118
23386
  </g>
23119
23387
  `;
23120
23388
  }
@@ -23186,12 +23454,10 @@ let SliderInputElement = class SliderInputElement extends WheelNudgeMixin(i) {
23186
23454
  } else this.#poleC = void 0;
23187
23455
  if (changed.has(`valueA`) || changed.has(`valueB`) || changed.has(`valueMode`) || changed.has(`singleStyle`) || !this.hasUpdated) {
23188
23456
  const valueLane = this.#lanes.get(`value`);
23189
- if (valueLane && valueLane.type === `value`) {
23190
- if (this.valueMode === `single`) this.#applySingleStyleValueLane(valueLane, this.#getRelativeValueA());
23191
- else {
23192
- valueLane.valueMin = valueToRelative(this.#low(), this.min, this.max);
23193
- valueLane.valueMax = valueToRelative(this.#high(), this.min, this.max);
23194
- }
23457
+ if (valueLane && valueLane.type === `value`) if (this.valueMode === `single`) this.#applySingleStyleValueLane(valueLane, this.#getRelativeValueA());
23458
+ else {
23459
+ valueLane.valueMin = valueToRelative(this.#low(), this.min, this.max);
23460
+ valueLane.valueMax = valueToRelative(this.#high(), this.min, this.max);
23195
23461
  }
23196
23462
  }
23197
23463
  }
@@ -23860,11 +24126,10 @@ let SnapContainer = class SnapContainer extends i {
23860
24126
  };
23861
24127
  this._onKeyDown = (e) => {
23862
24128
  let newSnap = this.snap;
23863
- if (this._isHorizontal) {
23864
- if (e.key === `ArrowLeft`) newSnap = Math.max(0, this.snap - 1);
23865
- else if (e.key === `ArrowRight`) newSnap = Math.min(this.snapPositions - 1, this.snap + 1);
23866
- else return;
23867
- } else if (e.key === `ArrowUp`) newSnap = Math.max(0, this.snap - 1);
24129
+ if (this._isHorizontal) if (e.key === `ArrowLeft`) newSnap = Math.max(0, this.snap - 1);
24130
+ else if (e.key === `ArrowRight`) newSnap = Math.min(this.snapPositions - 1, this.snap + 1);
24131
+ else return;
24132
+ else if (e.key === `ArrowUp`) newSnap = Math.max(0, this.snap - 1);
23868
24133
  else if (e.key === `ArrowDown`) newSnap = Math.min(this.snapPositions - 1, this.snap + 1);
23869
24134
  else return;
23870
24135
  e.preventDefault();
@@ -24104,8 +24369,7 @@ let SplitLayoutElement = class SplitLayoutElement extends i {
24104
24369
  if (!bounds) return;
24105
24370
  const threshold = 5;
24106
24371
  if (this.layout === `horizontal`) {
24107
- const y = event.y - bounds.y;
24108
- const relativeY = clamp(y / bounds.height);
24372
+ const relativeY = clamp((event.y - bounds.y) / bounds.height);
24109
24373
  if (this.collapsible && this.collapsedA) {
24110
24374
  if (relativeY > (this.#collapsedAPointerAtCollapse ?? .05) + this.#hysteresisThreshold) {
24111
24375
  this.collapsedA = false;
@@ -24143,8 +24407,7 @@ let SplitLayoutElement = class SplitLayoutElement extends i {
24143
24407
  this.#collapsedBPointerAtCollapse = relativeY;
24144
24408
  }
24145
24409
  } else {
24146
- const x = event.x - bounds.x;
24147
- const relativeX = clamp(x / bounds.width);
24410
+ const relativeX = clamp((event.x - bounds.x) / bounds.width);
24148
24411
  if (this.collapsible && this.collapsedA) {
24149
24412
  if (relativeX > (this.#collapsedAPointerAtCollapse ?? .05) + this.#hysteresisThreshold) {
24150
24413
  this.collapsedA = false;
@@ -24198,7 +24461,7 @@ let SplitLayoutElement = class SplitLayoutElement extends i {
24198
24461
  if (nestedSplit) {
24199
24462
  this.#nestedSplitInitialSizeA = nestedSplit.sizeA;
24200
24463
  const nestedBounds = nestedSplit.getBoundingClientRect();
24201
- const nestedHandle = nestedSplit.shadowRoot?.querySelector(`.resize-handle`);
24464
+ const nestedHandle = nestedSplit.shadowRoot?.querySelector(`.split-bar`);
24202
24465
  if (nestedHandle) {
24203
24466
  this.#nestedSplitBounds = nestedBounds;
24204
24467
  this.#nestedHandleBounds = nestedHandle.getBoundingClientRect();
@@ -24267,6 +24530,11 @@ let SplitLayoutElement = class SplitLayoutElement extends i {
24267
24530
  event.preventDefault();
24268
24531
  };
24269
24532
  }
24533
+ get showGrabHandle() {
24534
+ const size = getComputedStyle(this).getPropertyValue(`--handle-size`).trim();
24535
+ const num = Number.parseFloat(size);
24536
+ return !Number.isNaN(num) && num > 3;
24537
+ }
24270
24538
  #elementBounds;
24271
24539
  #startSizeA;
24272
24540
  #startSizeB;
@@ -24487,17 +24755,30 @@ let SplitLayoutElement = class SplitLayoutElement extends i {
24487
24755
  <div id="zone">
24488
24756
  <slot style=${sizeA} name="a"></slot>
24489
24757
  ${this._hasCorner ? b`<div class="corner-zone" @pointerdown=${this.#onCornerResizeDown}></div>` : ``}
24490
- <div @pointerdown=${this.#onResizeHandleDown} class="resize-handle"></div>
24491
- <slot style=${sizeB} name="b"></slot>
24758
+ <div @pointerdown=${this.#onResizeHandleDown} class="split-bar">
24759
+ ${this.showGrabHandle ? b`
24760
+ <div class="grab-handle">
24761
+ <span class="dot"></span>
24762
+ <span class="dot"></span>
24763
+ <span class="dot"></span>
24764
+ </div>
24765
+ ` : ``}
24766
+ </div>
24767
+ <slot style=${sizeB} name="b"></slot>
24492
24768
  </div>`;
24493
24769
  }
24494
24770
  static {
24495
24771
  this.styles = [themeFallbacks, i$3`
24496
24772
  :host {
24497
24773
  --handle-size: 2px;
24498
- --handle-colour: var(--surface-5);
24774
+ --handle-colour: transparent;
24499
24775
  --handle-hover-colour: var(--surface-6);
24500
24776
  --handle-active-colour: var(--accent);
24777
+ --handle-bg: var(--handle-colour);
24778
+ --handle-grab-colour: var(--border-subtle-color);
24779
+ --handle-grab-dot-size: 3px;
24780
+ --handle-grab-size: 16px;
24781
+ --handle-grab-thickness: 8px;
24501
24782
 
24502
24783
  display: block;
24503
24784
  box-sizing: border-box;
@@ -24515,29 +24796,80 @@ let SplitLayoutElement = class SplitLayoutElement extends i {
24515
24796
  slot {
24516
24797
  display: block;
24517
24798
  overflow: hidden;
24799
+ border: var(--border-subtle);
24800
+ border-radius: var(--radius-m);
24518
24801
  }
24519
24802
  :slotted(*) {
24520
24803
  width: 100%;
24521
24804
  height: 100%;
24522
24805
  }
24523
24806
 
24524
- .resize-handle {
24807
+ .split-bar {
24808
+ position: relative;
24525
24809
  background-color: var(--handle-colour);
24810
+ transition: background-color 0.3s ease 0s;
24526
24811
  width: var(--handle-size);
24527
24812
  height: 100%;
24528
24813
  cursor: ew-resize;
24529
24814
  flex-shrink: 0;
24815
+ border-radius: var(--radius-m);
24816
+
24817
+ }
24818
+
24819
+ @keyframes handle-hover {
24820
+ from { background-color: var(--handle-colour); }
24821
+ to { background-color: var(--handle-hover-colour); }
24822
+ }
24823
+
24824
+ .grab-handle {
24825
+ position: absolute;
24826
+ top: 50%;
24827
+ left: 50%;
24828
+ transform: translate(-50%, -50%);
24829
+ display: flex;
24830
+ align-items: center;
24831
+ justify-content: center;
24832
+ gap: var(--handle-grab-dot-size);
24833
+ background: var(--handle-bg);
24834
+ border-radius: var(--radius-s);
24835
+ }
24836
+
24837
+ .grab-handle .dot {
24838
+ width: var(--handle-grab-dot-size);
24839
+ height: var(--handle-grab-dot-size);
24840
+ border-radius: 50%;
24841
+ background: var(--handle-grab-colour);
24842
+ flex-shrink: 0;
24843
+ }
24844
+
24845
+ :host([layout="vertical"]) .grab-handle {
24846
+ flex-direction: column;
24847
+ width: var(--handle-grab-thickness);
24848
+ height: var(--handle-grab-size);
24849
+ }
24850
+
24851
+ :host([layout="horizontal"]) .grab-handle {
24852
+ flex-direction: row;
24853
+ width: var(--handle-grab-size);
24854
+ height: var(--handle-grab-thickness);
24855
+ }
24856
+
24857
+ #zone.user-resizing .grab-handle {
24858
+ display: none;
24530
24859
  }
24531
24860
  #zone.user-resizing {
24532
24861
  slot {
24533
24862
  opacity: 0.5;
24534
24863
  }
24535
- .resize-handle {
24864
+ .split-bar {
24536
24865
  background-color: var(--handle-active-colour);
24866
+ transition: none;
24867
+ animation: none !important;
24537
24868
  }
24538
24869
  }
24539
- .resize-handle:hover {
24540
- background-color: var(--handle-hover-colour);
24870
+
24871
+ #zone:not(.user-resizing) .split-bar:hover {
24872
+ animation: handle-hover 0.001s ease-out 0.7s both;
24541
24873
  }
24542
24874
 
24543
24875
  .corner-zone {
@@ -24556,17 +24888,18 @@ let SplitLayoutElement = class SplitLayoutElement extends i {
24556
24888
  #zone {
24557
24889
  flex-direction: column;
24558
24890
  }
24559
- .resize-handle {
24560
- background-color: silver;
24891
+ .split-bar {
24892
+ position: relative;
24893
+ background-color: var(--handle-colour);
24894
+ transition: background-color 0.3s ease 0s;
24561
24895
  height: var(--handle-size);
24562
24896
  width: 100%;
24563
24897
  cursor: ns-resize;
24564
24898
  }
24565
- .resize-handle:hover {
24566
- background-color: var(--handle-hover-colour);
24567
- }
24568
- #zone.user-resizing .resize-handle {
24899
+ #zone.user-resizing .split-bar {
24569
24900
  background-color: var(--handle-active-colour);
24901
+ transition: none;
24902
+ animation: none !important;
24570
24903
  }
24571
24904
  }
24572
24905
 
@@ -24760,8 +25093,7 @@ let SwipeElement = class SwipeElement extends WheelNudgeMixin(i) {
24760
25093
  const x0 = cx - half;
24761
25094
  const x1 = cx + half;
24762
25095
  const colorVar = i % 2 === 0 ? `var(--swipe-color-a, var(--surface-4))` : `var(--swipe-color-b, var(--surface-5))`;
24763
- const d = `M${x0},0 L${x1},0 L${x1 + off},${mid} L${x1},${h} L${x0},${h} L${x0 + off},${mid}Z`;
24764
- return w`<path d=${d} style="fill:${colorVar}"></path>`;
25096
+ return w`<path d=${`M${x0},0 L${x1},0 L${x1 + off},${mid} L${x1},${h} L${x0},${h} L${x0 + off},${mid}Z`} style="fill:${colorVar}"></path>`;
24765
25097
  })}`;
24766
25098
  }
24767
25099
  static {
@@ -24822,11 +25154,16 @@ let TabListItemElement = class TabListItemElement extends i {
24822
25154
  constructor(..._args) {
24823
25155
  super(..._args);
24824
25156
  this.closeable = false;
25157
+ this.hideLabels = false;
24825
25158
  this.iconName = void 0;
24826
25159
  this.description = void 0;
24827
25160
  this.commandActive = void 0;
24828
25161
  this.registry = void 0;
24829
25162
  this._compact = false;
25163
+ this._hasToolbarContent = false;
25164
+ this._onToolbarSlotChange = () => {
25165
+ this._updateToolbarContent();
25166
+ };
24830
25167
  }
24831
25168
  connectedCallback() {
24832
25169
  super.connectedCallback();
@@ -24834,6 +25171,7 @@ let TabListItemElement = class TabListItemElement extends i {
24834
25171
  this._compact = entry.contentRect.width < 64;
24835
25172
  });
24836
25173
  this._resizeObserver.observe(this);
25174
+ (this.shadowRoot?.querySelector(`slot[name="toolbar"]`))?.addEventListener(`slotchange`, this._onToolbarSlotChange);
24837
25175
  }
24838
25176
  disconnectedCallback() {
24839
25177
  super.disconnectedCallback();
@@ -24841,6 +25179,7 @@ let TabListItemElement = class TabListItemElement extends i {
24841
25179
  this._resizeObserver = void 0;
24842
25180
  this._commandCleanup?.();
24843
25181
  this._commandCleanup = void 0;
25182
+ (this.shadowRoot?.querySelector(`slot[name="toolbar"]`))?.removeEventListener(`slotchange`, this._onToolbarSlotChange);
24844
25183
  }
24845
25184
  updated(changed) {
24846
25185
  super.updated(changed);
@@ -24863,12 +25202,21 @@ let TabListItemElement = class TabListItemElement extends i {
24863
25202
  if (id === this.commandActive) this.click();
24864
25203
  });
24865
25204
  }
25205
+ _updateToolbarContent() {
25206
+ const slot = this.shadowRoot?.querySelector(`slot[name="toolbar"]`);
25207
+ this._hasToolbarContent = (slot?.assignedElements().length ?? 0) > 0;
25208
+ }
25209
+ firstUpdated() {
25210
+ this._updateToolbarContent();
25211
+ }
24866
25212
  render() {
24867
- const showLabel = !this._compact || !this.iconName;
25213
+ const showLabel = !this.hideLabels || !this.iconName;
25214
+ const hasActions = this.closeable || this._hasToolbarContent;
24868
25215
  return b`
24869
25216
  <div>
24870
25217
  ${this.iconName ? b`<ixfx-icon name="${this.iconName}"></ixfx-icon>` : A}
24871
25218
  ${showLabel ? b`<span class="label"><slot></slot></span>` : A}
25219
+ ${hasActions ? b`
24872
25220
  <div class="actions">
24873
25221
  <div class="toolbar"><slot name="toolbar"></slot></div>
24874
25222
  ${this.closeable ? b`
@@ -24882,6 +25230,7 @@ let TabListItemElement = class TabListItemElement extends i {
24882
25230
  </button>
24883
25231
  ` : A}
24884
25232
  </div>
25233
+ ` : A}
24885
25234
  </div>
24886
25235
  `;
24887
25236
  }
@@ -24908,17 +25257,19 @@ let TabListItemElement = class TabListItemElement extends i {
24908
25257
  min-width: 0;
24909
25258
  user-select: none;
24910
25259
  box-sizing: border-box;
25260
+ height:fit-content;
24911
25261
  }
24912
25262
 
24913
25263
  :host > div {
24914
25264
  display: flex;
24915
25265
  align-items: center;
24916
- gap: var(--space-s, 4px);
24917
- padding: var(--tab-padding) calc(2 * var(--tab-padding));
25266
+ padding: var(--tab-padding) calc(2 * var(--tab-padding-horizontal, var(--tab-padding)));
24918
25267
  min-width: 0;
24919
25268
  width: 100%;
24920
25269
  font-weight: 500;
24921
25270
  border: var(--selected-tab-border-width) solid transparent;
25271
+ gap: var(--space-s);
25272
+
24922
25273
  }
24923
25274
 
24924
25275
  :host([selected]) > div {
@@ -24929,6 +25280,7 @@ let TabListItemElement = class TabListItemElement extends i {
24929
25280
  border-right-color: var(--indicator-color-right, transparent);
24930
25281
  background: var(--selected-background);
24931
25282
  font-weight: var(--selected-tab-weight);
25283
+ border-radius:var(--radius-m);
24932
25284
  }
24933
25285
 
24934
25286
  .label {
@@ -25003,6 +25355,10 @@ let TabListItemElement = class TabListItemElement extends i {
25003
25355
  }
25004
25356
  };
25005
25357
  __decorate([property({ type: Boolean })], TabListItemElement.prototype, "closeable", void 0);
25358
+ __decorate([property({
25359
+ type: Boolean,
25360
+ attribute: `hide-labels`
25361
+ })], TabListItemElement.prototype, "hideLabels", void 0);
25006
25362
  __decorate([property({
25007
25363
  type: String,
25008
25364
  attribute: `icon-name`
@@ -25014,6 +25370,7 @@ __decorate([property({
25014
25370
  })], TabListItemElement.prototype, "commandActive", void 0);
25015
25371
  __decorate([property({ attribute: false })], TabListItemElement.prototype, "registry", void 0);
25016
25372
  __decorate([state()], TabListItemElement.prototype, "_compact", void 0);
25373
+ __decorate([state()], TabListItemElement.prototype, "_hasToolbarContent", void 0);
25017
25374
  TabListItemElement = __decorate([safeCustomElement(`ixfx-tab-list-item`)], TabListItemElement);
25018
25375
  //#endregion
25019
25376
  //#region src/tabs/tab-panel.ts
@@ -25432,6 +25789,7 @@ let TabListElement = class TabListElement extends i {
25432
25789
  this.orientation = `horizontal`;
25433
25790
  this.flip = false;
25434
25791
  this.scrollable = false;
25792
+ this.hideLabels = false;
25435
25793
  this.dragMode = `off`;
25436
25794
  this.#items = [];
25437
25795
  this.#dragState = null;
@@ -25440,6 +25798,7 @@ let TabListElement = class TabListElement extends i {
25440
25798
  this.updateComplete.then(() => {
25441
25799
  this.#items = (this.shadowRoot?.querySelector(`slot`))?.assignedElements({ flatten: true }) ?? [];
25442
25800
  this.#syncIndicatorColors();
25801
+ this.#syncHideLabels();
25443
25802
  });
25444
25803
  };
25445
25804
  this.#onKeyUp = (event) => {
@@ -25581,13 +25940,21 @@ let TabListElement = class TabListElement extends i {
25581
25940
  #onSlotChange;
25582
25941
  firstUpdated() {
25583
25942
  this.updateComplete.then(() => {
25584
- if (this.#items.length > 0) this.#syncIndicatorColors();
25943
+ if (this.#items.length > 0) {
25944
+ this.#syncIndicatorColors();
25945
+ this.#syncHideLabels();
25946
+ }
25585
25947
  });
25586
25948
  }
25587
25949
  updated(changedProperties) {
25588
25950
  super.updated(changedProperties);
25589
25951
  this.classList.toggle(`scrollable`, this.scrollable);
25590
25952
  if (changedProperties.has(`dragMode`)) this.toggleAttribute(`drag-mode`, this.dragMode !== `off`);
25953
+ if (changedProperties.has(`hideLabels`)) this.#syncHideLabels();
25954
+ }
25955
+ #syncHideLabels() {
25956
+ for (const item of this.#items) if (this.hideLabels) item.setAttribute(`hide-labels`, ``);
25957
+ else item.removeAttribute(`hide-labels`);
25591
25958
  }
25592
25959
  #syncIndicatorColors() {
25593
25960
  for (const item of this.#items) {
@@ -25842,6 +26209,10 @@ let TabListElement = class TabListElement extends i {
25842
26209
  :host(.scrollable) {
25843
26210
  max-height: var(--scroll-max-height);
25844
26211
  }
26212
+ :host([hide-labels]) {
26213
+ display: inline-flex;
26214
+ width: auto;
26215
+ }
25845
26216
  text {
25846
26217
  user-select:none;
25847
26218
  }
@@ -25925,6 +26296,10 @@ let TabListElement = class TabListElement extends i {
25925
26296
  __decorate([property({ type: String })], TabListElement.prototype, "orientation", void 0);
25926
26297
  __decorate([property({ type: Boolean })], TabListElement.prototype, "flip", void 0);
25927
26298
  __decorate([property({ type: Boolean })], TabListElement.prototype, "scrollable", void 0);
26299
+ __decorate([property({
26300
+ type: Boolean,
26301
+ attribute: `hide-labels`
26302
+ })], TabListElement.prototype, "hideLabels", void 0);
25928
26303
  __decorate([property({
25929
26304
  type: String,
25930
26305
  attribute: `drag-mode`
@@ -26282,7 +26657,7 @@ function drawEventRects(ctx, region, events, trackLayout, selectedIds, tickledId
26282
26657
  const x = evt.start * ppu;
26283
26658
  const w = (evt.end - evt.start) * ppu;
26284
26659
  const y = layout.y + padding;
26285
- const h = layout.height - 6;
26660
+ const h = layout.height - padding * 2;
26286
26661
  if (w < 1) continue;
26287
26662
  const isSelected = selectedIds.has(evt.id);
26288
26663
  const isTickled = tickledId === evt.id;