@ixfx/components 0.4.2 → 0.4.4

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 +435 -1193
  2. package/bundle/index.d.ts.map +1 -1
  3. package/bundle/index.js +7765 -20670
  4. package/bundle/index.js.map +1 -1
  5. package/dist/ac-text.d.ts +12 -7
  6. package/dist/ac-text.d.ts.map +1 -1
  7. package/dist/ac-text.js +2 -3
  8. package/dist/ac-text.js.map +1 -1
  9. package/dist/{button-C3fLMKUv.js → button-DxYee1ZH.js} +2 -2
  10. package/dist/{button-C3fLMKUv.js.map → button-DxYee1ZH.js.map} +1 -1
  11. package/dist/button.d.ts +1 -2
  12. package/dist/button.d.ts.map +1 -1
  13. package/dist/button.js +1 -2
  14. package/dist/checkbox.d.ts +0 -1
  15. package/dist/checkbox.d.ts.map +1 -1
  16. package/dist/checkbox.js +1 -1
  17. package/dist/checkbox.js.map +1 -1
  18. package/dist/{colour-picker-0sgAha1T.js → colour-picker-BacNRabo.js} +14 -16
  19. package/dist/colour-picker-BacNRabo.js.map +1 -0
  20. package/dist/colour-picker.d.ts +1 -1
  21. package/dist/colour-picker.js +1 -1
  22. package/dist/crumbs.d.ts +5 -2
  23. package/dist/crumbs.d.ts.map +1 -1
  24. package/dist/crumbs.js +45 -20
  25. package/dist/crumbs.js.map +1 -1
  26. package/dist/data-display.d.ts +1 -2
  27. package/dist/data-display.d.ts.map +1 -1
  28. package/dist/data-display.js +25 -23
  29. package/dist/data-display.js.map +1 -1
  30. package/dist/{data-provider-DgI909FP.js → data-provider-35TyWclX.js} +2 -2
  31. package/dist/data-provider-35TyWclX.js.map +1 -0
  32. package/dist/{decorate-DdjvVHS-.js → decorate-VRK8rslU.js} +2 -2
  33. package/dist/{decorate-DdjvVHS-.js.map → decorate-VRK8rslU.js.map} +1 -1
  34. package/dist/editable-label.d.ts +1 -2
  35. package/dist/editable-label.d.ts.map +1 -1
  36. package/dist/editable-label.js +1 -1
  37. package/dist/editable-label.js.map +1 -1
  38. package/dist/{hex-editor-WZrjRtvL.js → hex-editor-Bk6rxhfg.js} +9 -11
  39. package/dist/hex-editor-Bk6rxhfg.js.map +1 -0
  40. package/dist/{hex-editor-CMIxtNgT.d.ts → hex-editor-Caq8vNQk.d.ts} +2 -3
  41. package/dist/hex-editor-Caq8vNQk.d.ts.map +1 -0
  42. package/dist/hex.d.ts +1 -1
  43. package/dist/hex.js +1 -1
  44. package/dist/highlight-B-eQrhhb.js.map +1 -1
  45. package/dist/{icon-Ndo40kNO.js → icon-B22XVlCt.js} +6 -4
  46. package/dist/{icon-Ndo40kNO.js.map → icon-B22XVlCt.js.map} +1 -1
  47. package/dist/{icon-epZd-JIO.d.ts → icon-DpA9x2Ve.d.ts} +3 -4
  48. package/dist/icon-DpA9x2Ve.d.ts.map +1 -0
  49. package/dist/icons.d.ts +2 -2
  50. package/dist/icons.js +1 -1
  51. package/dist/{incr-search-CeERfijK.js → incr-search-2pz21xtR.js} +9 -6
  52. package/dist/incr-search-2pz21xtR.js.map +1 -0
  53. package/dist/incr-search.d.ts +1 -1
  54. package/dist/incr-search.js +1 -1
  55. package/dist/{index-CowKi2mo.d.ts → index-BeuCXtiO.d.ts} +3 -4
  56. package/dist/index-BeuCXtiO.d.ts.map +1 -0
  57. package/dist/{index-D87kRcEs.d.ts → index-BtGFYfaK.d.ts} +2 -1
  58. package/dist/index-BtGFYfaK.d.ts.map +1 -0
  59. package/dist/{index-JuEVfmr-.d.ts → index-CoqtMSd9.d.ts} +6 -4
  60. package/dist/index-CoqtMSd9.d.ts.map +1 -0
  61. package/dist/{index-9fGVAg1d.d.ts → index-Cxwxtj6g.d.ts} +3 -3
  62. package/dist/index-Cxwxtj6g.d.ts.map +1 -0
  63. package/dist/index-D_ftz_IT.d.ts +184 -0
  64. package/dist/index-D_ftz_IT.d.ts.map +1 -0
  65. package/dist/{index-_RTQSKHi.d.ts → index-DfEkTGvT.d.ts} +11 -11
  66. package/dist/index-DfEkTGvT.d.ts.map +1 -0
  67. package/dist/index.d.ts +45 -30
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +304 -3075
  70. package/dist/index.js.map +1 -1
  71. package/dist/keyboard-B5xD7Fz-.js +36 -0
  72. package/dist/keyboard-B5xD7Fz-.js.map +1 -0
  73. package/dist/{labelled-input-base-Cz6qE6Dk.d.ts → labelled-input-base-DiTme1JO.d.ts} +2 -3
  74. package/dist/labelled-input-base-DiTme1JO.d.ts.map +1 -0
  75. package/dist/{labelled-input-base-9K_w3oLj.js → labelled-input-base-hoKGwyKT.js} +2 -2
  76. package/dist/{labelled-input-base-9K_w3oLj.js.map → labelled-input-base-hoKGwyKT.js.map} +1 -1
  77. package/dist/labelled-radial-input.d.ts +6 -5
  78. package/dist/labelled-radial-input.d.ts.map +1 -1
  79. package/dist/labelled-radial-input.js +7 -3
  80. package/dist/labelled-radial-input.js.map +1 -1
  81. package/dist/labelled-range-input.d.ts +1 -1
  82. package/dist/labelled-range-input.js +27 -3
  83. package/dist/labelled-range-input.js.map +1 -1
  84. package/dist/led.d.ts +1 -2
  85. package/dist/led.d.ts.map +1 -1
  86. package/dist/led.js +1 -1
  87. package/dist/led.js.map +1 -1
  88. package/dist/{menu-vjoiHZ13.js → menu-g6yd7ddN.js} +8 -9
  89. package/dist/menu-g6yd7ddN.js.map +1 -0
  90. package/dist/{menu-item-COx-Azgj.d.ts → menu-item-DSyf9f_L.d.ts} +4 -4
  91. package/dist/menu-item-DSyf9f_L.d.ts.map +1 -0
  92. package/dist/{menu-item-BrIuORYD.js → menu-item-NUKwJ4s5.js} +3 -4
  93. package/dist/{menu-item-BrIuORYD.js.map → menu-item-NUKwJ4s5.js.map} +1 -1
  94. package/dist/menu.d.ts +2 -2
  95. package/dist/menu.js +2 -2
  96. package/dist/miller.d.ts +8 -5
  97. package/dist/miller.d.ts.map +1 -1
  98. package/dist/miller.js +22 -24
  99. package/dist/miller.js.map +1 -1
  100. package/dist/narrowed-text.d.ts +7 -3
  101. package/dist/narrowed-text.d.ts.map +1 -1
  102. package/dist/narrowed-text.js +73 -47
  103. package/dist/narrowed-text.js.map +1 -1
  104. package/dist/panel.d.ts +1 -1
  105. package/dist/panel.d.ts.map +1 -1
  106. package/dist/panel.js +2 -2
  107. package/dist/panel.js.map +1 -1
  108. package/dist/plots.d.ts +2 -2
  109. package/dist/plots.js +1 -1
  110. package/dist/polar-pad.d.ts +15 -3
  111. package/dist/polar-pad.d.ts.map +1 -1
  112. package/dist/polar-pad.js +64 -11
  113. package/dist/polar-pad.js.map +1 -1
  114. package/dist/{radial-input-CpQPs1Mp.d.ts → radial-input-DXMN55Nz.d.ts} +6 -4
  115. package/dist/radial-input-DXMN55Nz.d.ts.map +1 -0
  116. package/dist/{radial-input-DZ7eQCcM.js → radial-input-DxCrt_NE.js} +41 -19
  117. package/dist/radial-input-DxCrt_NE.js.map +1 -0
  118. package/dist/radial-input.d.ts +1 -1
  119. package/dist/radial-input.js +1 -1
  120. package/dist/range-input.d.ts +15 -4
  121. package/dist/range-input.d.ts.map +1 -1
  122. package/dist/range-input.js +23 -2
  123. package/dist/range-input.js.map +1 -1
  124. package/dist/range.d.ts +15 -4
  125. package/dist/range.d.ts.map +1 -1
  126. package/dist/range.js +23 -2
  127. package/dist/range.js.map +1 -1
  128. package/dist/selecthorizontal.d.ts +1 -2
  129. package/dist/selecthorizontal.d.ts.map +1 -1
  130. package/dist/selecthorizontal.js +1 -1
  131. package/dist/selecthorizontal.js.map +1 -1
  132. package/dist/slider-input-DFpG23bS.js +1592 -0
  133. package/dist/slider-input-DFpG23bS.js.map +1 -0
  134. package/dist/slider-input-XppH3vcy.d.ts +160 -0
  135. package/dist/slider-input-XppH3vcy.d.ts.map +1 -0
  136. package/dist/slider-input.d.ts +2 -0
  137. package/dist/slider-input.js +2 -0
  138. package/dist/snap-container.d.ts +1 -2
  139. package/dist/snap-container.d.ts.map +1 -1
  140. package/dist/snap-container.js +6 -5
  141. package/dist/snap-container.js.map +1 -1
  142. package/dist/split-layout.d.ts +1 -2
  143. package/dist/split-layout.d.ts.map +1 -1
  144. package/dist/split-layout.js +6 -4
  145. package/dist/split-layout.js.map +1 -1
  146. package/dist/swipe.d.ts +12 -2
  147. package/dist/swipe.d.ts.map +1 -1
  148. package/dist/swipe.js +22 -3
  149. package/dist/swipe.js.map +1 -1
  150. package/dist/{tab-list-DLzb-m-I.d.ts → tab-list-BohmbvqF.d.ts} +14 -5
  151. package/dist/tab-list-BohmbvqF.d.ts.map +1 -0
  152. package/dist/tab-list-DzknpdSo.js +592 -0
  153. package/dist/tab-list-DzknpdSo.js.map +1 -0
  154. package/dist/tabs.d.ts +2 -2
  155. package/dist/tabs.js +1 -208
  156. package/dist/{tickled-controller-BjYCzGrU.d.ts → tickled-controller-BF2Ea0DE.d.ts} +2 -31
  157. package/dist/tickled-controller-BF2Ea0DE.d.ts.map +1 -0
  158. package/dist/tickled-styles-fNDdqf6l.js.map +1 -1
  159. package/dist/{timeline-2OFtN4Ta.js → timeline-B2fgDL4U.js} +37 -1438
  160. package/dist/timeline-B2fgDL4U.js.map +1 -0
  161. package/dist/timeline.d.ts +1 -1
  162. package/dist/timeline.js +1 -1
  163. package/dist/{tooltip-RGVIwHrZ.d.ts → tooltip-BlvBUQxx.d.ts} +3 -3
  164. package/dist/tooltip-BlvBUQxx.d.ts.map +1 -0
  165. package/dist/{tree-D84RUgFC.js → tree-BnvzhsAw.js} +8 -9
  166. package/dist/tree-BnvzhsAw.js.map +1 -0
  167. package/dist/{tree-component-BaCSPWg1.d.ts → tree-component-DCmmKZ4j.d.ts} +8 -124
  168. package/dist/tree-component-DCmmKZ4j.d.ts.map +1 -0
  169. package/dist/tree.d.ts +10 -4
  170. package/dist/tree.d.ts.map +1 -1
  171. package/dist/tree.js +1 -1
  172. package/dist/types-DO3gt5vg.d.ts +130 -0
  173. package/dist/types-DO3gt5vg.d.ts.map +1 -0
  174. package/dist/wheel-nudge-BlSCe_hD.js +86 -0
  175. package/dist/wheel-nudge-BlSCe_hD.js.map +1 -0
  176. package/dist/wheel-nudge-DGrNzWuE.d.ts +29 -0
  177. package/dist/wheel-nudge-DGrNzWuE.d.ts.map +1 -0
  178. package/dist/{xy-axis-CEI7ojks.d.ts → xy-axis-5KhVTNoX.d.ts} +75 -29
  179. package/dist/xy-axis-5KhVTNoX.d.ts.map +1 -0
  180. package/dist/xy-axis-CxHC8z5E.js +1849 -0
  181. package/dist/xy-axis-CxHC8z5E.js.map +1 -0
  182. package/dist/xy-pad.d.ts +13 -2
  183. package/dist/xy-pad.d.ts.map +1 -1
  184. package/dist/xy-pad.js +47 -6
  185. package/dist/xy-pad.js.map +1 -1
  186. package/docs-user/radial-input.md +2 -2
  187. package/package.json +22 -21
  188. package/dist/colour-C3MQIjFJ-vRCdr8W-.js +0 -3732
  189. package/dist/colour-C3MQIjFJ-vRCdr8W-.js.map +0 -1
  190. package/dist/colour-picker-0sgAha1T.js.map +0 -1
  191. package/dist/data-provider-DgI909FP.js.map +0 -1
  192. package/dist/dist-CA13FvMn.js +0 -980
  193. package/dist/dist-CA13FvMn.js.map +0 -1
  194. package/dist/hex-editor-CMIxtNgT.d.ts.map +0 -1
  195. package/dist/hex-editor-WZrjRtvL.js.map +0 -1
  196. package/dist/icon-epZd-JIO.d.ts.map +0 -1
  197. package/dist/incr-search-CeERfijK.js.map +0 -1
  198. package/dist/index-9fGVAg1d.d.ts.map +0 -1
  199. package/dist/index-CowKi2mo.d.ts.map +0 -1
  200. package/dist/index-D87kRcEs.d.ts.map +0 -1
  201. package/dist/index-DgXpCg_G.d.ts +0 -1244
  202. package/dist/index-DgXpCg_G.d.ts.map +0 -1
  203. package/dist/index-JuEVfmr-.d.ts.map +0 -1
  204. package/dist/index-_RTQSKHi.d.ts.map +0 -1
  205. package/dist/keyboard-CimiEskD.js +0 -20
  206. package/dist/keyboard-CimiEskD.js.map +0 -1
  207. package/dist/labelled-input-base-Cz6qE6Dk.d.ts.map +0 -1
  208. package/dist/menu-item-COx-Azgj.d.ts.map +0 -1
  209. package/dist/menu-vjoiHZ13.js.map +0 -1
  210. package/dist/radial-input-CpQPs1Mp.d.ts.map +0 -1
  211. package/dist/radial-input-DZ7eQCcM.js.map +0 -1
  212. package/dist/tab-list-DLzb-m-I.d.ts.map +0 -1
  213. package/dist/tabs.js.map +0 -1
  214. package/dist/tickled-controller-BjYCzGrU.d.ts.map +0 -1
  215. package/dist/timeline-2OFtN4Ta.js.map +0 -1
  216. package/dist/tooltip-RGVIwHrZ.d.ts.map +0 -1
  217. package/dist/tree-D84RUgFC.js.map +0 -1
  218. package/dist/tree-component-BaCSPWg1.d.ts.map +0 -1
  219. package/dist/types-DSfbtHs3.d.ts +0 -8
  220. package/dist/types-DSfbtHs3.d.ts.map +0 -1
  221. package/dist/xy-axis-CEI7ojks.d.ts.map +0 -1
  222. package/dist/xy-axis-DbPezP6A.js +0 -7849
  223. package/dist/xy-axis-DbPezP6A.js.map +0 -1
  224. /package/bundle/{chunk-D7D4PA-g.js → rolldown-runtime-D7D4PA-g.js} +0 -0
  225. /package/dist/{chunk-D7D4PA-g.js → rolldown-runtime-D7D4PA-g.js} +0 -0
@@ -1,8 +1,8 @@
1
1
  import { t as themeFallbacks } from "./fallbacks-pNMOMx38.js";
2
- import { n as safeCustomElement, t as __decorate } from "./decorate-DdjvVHS-.js";
3
- import { t as clamp } from "./dist-CA13FvMn.js";
2
+ import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
4
3
  import { LitElement, css, html } from "lit";
5
4
  import { property, state } from "lit/decorators.js";
5
+ import { clamp } from "@ixfx/numbers";
6
6
  //#region src/split-layout/split-layout.ts
7
7
  let SplitLayoutElement = class SplitLayoutElement extends LitElement {
8
8
  constructor(..._args) {
@@ -49,7 +49,8 @@ let SplitLayoutElement = class SplitLayoutElement extends LitElement {
49
49
  if (!bounds) return;
50
50
  const threshold = 5;
51
51
  if (this.layout === `horizontal`) {
52
- const relativeY = clamp((event.y - bounds.y) / bounds.height);
52
+ const y = event.y - bounds.y;
53
+ const relativeY = clamp(y / bounds.height);
53
54
  if (this.collapsible && this.collapsedA) {
54
55
  if (relativeY > (this.#collapsedAPointerAtCollapse ?? .05) + this.#hysteresisThreshold) {
55
56
  this.collapsedA = false;
@@ -87,7 +88,8 @@ let SplitLayoutElement = class SplitLayoutElement extends LitElement {
87
88
  this.#collapsedBPointerAtCollapse = relativeY;
88
89
  }
89
90
  } else {
90
- const relativeX = clamp((event.x - bounds.x) / bounds.width);
91
+ const x = event.x - bounds.x;
92
+ const relativeX = clamp(x / bounds.width);
91
93
  if (this.collapsible && this.collapsedA) {
92
94
  if (relativeX > (this.#collapsedAPointerAtCollapse ?? .05) + this.#hysteresisThreshold) {
93
95
  this.collapsedA = false;
@@ -1 +1 @@
1
- {"version":3,"file":"split-layout.js","names":["#elementBounds","#startSizeA","#startSizeB","#onResizeHandleUp","#onResizeHandleMove","#collapsedAPointerAtCollapse","#hysteresisThreshold","#dispatchCollapsedEvent","#applyConstraints","#collapsedBPointerAtCollapse","#cornerStartX","#cornerStartY","#getNestedSplit","#nestedSplitInitialSizeA","#nestedSplitBounds","#nestedHandleBounds","#onCornerResizeUp","#onCornerResizeMove","#parseSizeAsFraction","#pendingNestedUpdate","#applyPendingNestedUpdate","#observer","#setupNestedSplitObserver","#updateCornerPosition","#updateDataCollapsed","#checkForNestedSplit","#nestedSplit","#minSizeToFraction","#maxSizeToFraction","#parseSizeToPx","#getIntersectionPoint","#onCornerResizeDown","#onResizeHandleDown","customElement"],"sources":["../src/split-layout/split-layout.ts"],"sourcesContent":["import { clamp } from \"@ixfx/numbers\";\nimport { css, html, LitElement } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { themeFallbacks } from \"../styles/fallbacks.js\";\nimport { safeCustomElement as customElement } from \"../util/custom-elements.js\";\n\n// TODO: Fire event when panels have been resized\n/**\n * Lays out two elements within a container, with a bar to resize them\n * proportionally.\n *\n * Events\n * ixfx-split-collapsed: Dispatched when a panel is collapsed/uncollapsed via drag.\n * detail: { panel: 'A' | 'B', collapsed: boolean }\n *\n * Attributes\n * layout: `vertical`|`horizontal`\n * sizeA/B: CSS size of section A or B. Can use relative or absolute values\n * fixedA/B: If _true_ size will be calculated in pixels. By default (_false_) it uses % of whole\n * collapsible: If _true_, panels can be collapsed by dragging to edge (default: false)\n * minSizeA/B: Minimum size for panel A or B (e.g., \"100px\" or \"20%\"). Default: none\n * maxSizeA/B: Maximum size for panel A or B (e.g., \"200px\" or \"80%\"). Default: none\n *\n * CSS variables\n * --handle-size: 2px; // Width/height of resize handle\n * --handle-colour: var(--surface-5); // Colour of handle\n * --handle-hover-colour: var(--surface-6); // Colour of handle when hovering\n * --handle-active-colour: var(--accent); // Colour of handle when being used\n */\n@customElement(`ixfx-split-layout`)\nexport class SplitLayoutElement extends LitElement {\n @property({ type: String })\n layout: `vertical` | `horizontal` = `vertical`;\n\n @property({ type: String })\n sizeA = ``;\n\n @property({ type: String })\n sizeB = ``;\n\n @property({ type: Boolean })\n fixedA = false;\n\n @property({ type: Boolean })\n fixedB = false;\n\n @property({ type: Boolean })\n collapsible = false;\n\n @property({ type: Boolean, reflect: true })\n collapsedA = false;\n\n @property({ type: Boolean, reflect: true })\n collapsedB = false;\n\n @property({ type: String })\n minSizeA = ``;\n\n @property({ type: String })\n maxSizeA = ``;\n\n @property({ type: String })\n minSizeB = ``;\n\n @property({ type: String })\n maxSizeB = ``;\n\n @state()\n private _hasCorner = false;\n\n #elementBounds: DOMRect | undefined;\n #startSizeA = ``;\n #startSizeB = ``;\n #cornerStartX = 0;\n #cornerStartY = 0;\n #nestedSplitInitialSizeA = ``;\n\n #cornerZone: HTMLElement | undefined;\n #nestedSplit: SplitLayoutElement | undefined;\n #nestedSplitBounds: DOMRect | undefined;\n #nestedHandleBounds: DOMRect | undefined;\n #observer: MutationObserver | undefined;\n #pendingNestedUpdate: { sizeA: number; sizeB: number } | null = null;\n #collapsedAPointerAtCollapse: number | undefined;\n #collapsedBPointerAtCollapse: number | undefined;\n #hysteresisThreshold = 0.1;\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.#observer?.disconnect();\n }\n\n firstUpdated() {\n this.#setupNestedSplitObserver();\n }\n\n updated(changedProperties: Map<string, unknown>) {\n if (changedProperties.has(`sizeA`) || changedProperties.has(`sizeB`)\n || changedProperties.has(`collapsedA`) || changedProperties.has(`collapsedB`)) {\n this.#updateCornerPosition();\n }\n if (changedProperties.has(`sizeA`) || changedProperties.has(`sizeB`)) {\n this.#updateDataCollapsed();\n }\n }\n\n #updateDataCollapsed() {\n if (this.collapsedA) {\n this.setAttribute(`data-collapsed-a`, ``);\n } else {\n this.removeAttribute(`data-collapsed-a`);\n }\n if (this.collapsedB) {\n this.setAttribute(`data-collapsed-b`, ``);\n } else {\n this.removeAttribute(`data-collapsed-b`);\n }\n }\n\n #dispatchCollapsedEvent(panel: `A` | `B`, collapsed: boolean) {\n this.dispatchEvent(new CustomEvent(`ixfx-split-collapsed`, {\n detail: { panel, collapsed },\n bubbles: true,\n composed: true,\n }));\n }\n\n #setupNestedSplitObserver() {\n const slotA = this.shadowRoot?.querySelector(`slot[name=\"a\"]`) as HTMLSlotElement | undefined;\n if (!slotA)\n return;\n\n this.#observer = new MutationObserver(() => {\n this.#checkForNestedSplit();\n });\n\n this.#observer.observe(slotA, { characterData: true, childList: true, subtree: true });\n this.#checkForNestedSplit();\n }\n\n #checkForNestedSplit() {\n const slotA = this.shadowRoot?.querySelector(`slot[name=\"a\"]`) as HTMLSlotElement | undefined;\n if (!slotA)\n return;\n\n const assignedElements = slotA.assignedElements();\n\n const findNestedSplit = (elements: Element[]): SplitLayoutElement | undefined => {\n for (const el of elements) {\n if (el.tagName === `IXFX-SPLIT-LAYOUT`) {\n return el as SplitLayoutElement;\n }\n const nested = findNestedSplit(Array.from(el.children));\n if (nested)\n return nested;\n }\n return undefined;\n };\n\n const nestedSplit = findNestedSplit(assignedElements);\n\n if (nestedSplit) {\n this.#nestedSplit = nestedSplit;\n this._hasCorner = true;\n requestAnimationFrame(() => this.#updateCornerPosition());\n } else {\n this.#nestedSplit = undefined;\n this._hasCorner = false;\n }\n }\n\n #getNestedSplit(): SplitLayoutElement | undefined {\n if (this.#nestedSplit)\n return this.#nestedSplit;\n\n const slotA = this.shadowRoot?.querySelector(`slot[name=\"a\"]`) as HTMLSlotElement | undefined;\n if (!slotA)\n return undefined;\n const assignedElements = slotA.assignedElements();\n return assignedElements.find(\n el => el.tagName === `IXFX-SPLIT-LAYOUT`,\n ) as SplitLayoutElement | undefined;\n }\n\n #parseSizeAsFraction(size: string, total: number): number {\n if (size.endsWith(`px`)) {\n return Number.parseFloat(size.replace(`px`, ``)) / total;\n } else if (size.endsWith(`%`)) {\n return Number.parseFloat(size.replace(`%`, ``)) / 100;\n }\n return 0.5;\n }\n\n #parseSizeToPx(size: string, total: number): number | null {\n if (size.endsWith(`px`)) {\n return Number.parseFloat(size.replace(`px`, ``));\n } else if (size.endsWith(`%`)) {\n return (Number.parseFloat(size.replace(`%`, ``)) / 100) * total;\n }\n return null;\n }\n\n #applyConstraints(sizeA: string, sizeB: string, total: number): { sizeA: string; sizeB: string } {\n let fractionA = this.#parseSizeAsFraction(sizeA, total);\n let fractionB = this.#parseSizeAsFraction(sizeB, total);\n\n const minA = this.#minSizeToFraction(this.minSizeA, total);\n const minB = this.#minSizeToFraction(this.minSizeB, total);\n const maxA = this.#maxSizeToFraction(this.maxSizeA, total);\n const maxB = this.#maxSizeToFraction(this.maxSizeB, total);\n\n if (minA !== null || minB !== null) {\n const minSum = (minA ?? 0) + (minB ?? 0);\n if (minSum > 1) {\n const scale = 1 / minSum;\n if (minA !== null)\n minA !== null ? fractionA = minA * scale : fractionA = 0;\n if (minB !== null)\n minB !== null ? fractionB = minB * scale : fractionB = 0;\n }\n\n if (fractionA < (minA ?? 0))\n fractionA = minA ?? 0;\n if (fractionB < (minB ?? 0))\n fractionB = minB ?? 0;\n }\n\n if (maxA !== null) {\n if (fractionA > maxA)\n fractionA = maxA;\n }\n if (maxB !== null) {\n if (fractionB > maxB)\n fractionB = maxB;\n }\n\n fractionB = 1 - fractionA;\n\n const isPercentA = !this.sizeA.endsWith(`px`);\n const _isPercentB = !this.sizeB.endsWith(`px`);\n\n if (isPercentA) {\n return { sizeA: `${fractionA * 100}%`, sizeB: `${fractionB * 100}%` };\n } else {\n return { sizeA: `${fractionA * total}px`, sizeB: `${fractionB * total}px` };\n }\n }\n\n #minSizeToFraction(minSize: string, total: number): number | null {\n if (minSize.length === 0)\n return null;\n const px = this.#parseSizeToPx(minSize, total);\n if (px !== null)\n return px / total;\n if (minSize.endsWith(`%`))\n return Number.parseFloat(minSize.replace(`%`, ``)) / 100;\n return null;\n }\n\n #maxSizeToFraction(maxSize: string, total: number): number | null {\n if (maxSize.length === 0)\n return null;\n const px = this.#parseSizeToPx(maxSize, total);\n if (px !== null)\n return px / total;\n if (maxSize.endsWith(`%`))\n return Number.parseFloat(maxSize.replace(`%`, ``)) / 100;\n return null;\n }\n\n #getIntersectionPoint(): { x: number; y: number } | null {\n const outerBounds = this.getBoundingClientRect();\n const zoneEl = this.getZone();\n if (!zoneEl)\n return null;\n\n const nestedSplit = this.#getNestedSplit();\n if (!nestedSplit)\n return null;\n\n const _zoneBounds = zoneEl.getBoundingClientRect();\n\n const outerFraction = this.#parseSizeAsFraction(this.sizeA || `50%`, outerBounds.width);\n\n let x: number, y: number;\n\n if (this.layout === `vertical` && nestedSplit.layout === `horizontal`) {\n x = outerFraction * outerBounds.width;\n const nestedFraction = this.#parseSizeAsFraction(nestedSplit.sizeA || `50%`, outerBounds.height);\n y = nestedFraction * outerBounds.height;\n } else if (this.layout === `horizontal` && nestedSplit.layout === `vertical`) {\n const nestedFraction = this.#parseSizeAsFraction(nestedSplit.sizeA || `50%`, outerBounds.width);\n x = nestedFraction * outerBounds.width;\n y = outerFraction * outerBounds.height;\n } else {\n return null;\n }\n\n return { x, y };\n }\n\n #updateCornerPosition() {\n if (!this._hasCorner)\n return;\n\n const cornerZone = this.shadowRoot?.querySelector(`.corner-zone`) as HTMLElement | undefined;\n if (!cornerZone)\n return;\n\n const zoneEl = this.getZone();\n if (!zoneEl)\n return;\n\n const intersection = this.#getIntersectionPoint();\n if (!intersection) {\n cornerZone.style.display = `none`;\n return;\n }\n\n const cornerX = intersection.x - 6;\n const cornerY = intersection.y - 6;\n\n cornerZone.style.left = `${cornerX}px`;\n cornerZone.style.top = `${cornerY}px`;\n cornerZone.style.display = `block`;\n\n const nestedSplit = this.#getNestedSplit();\n if (nestedSplit) {\n if (this.layout === `vertical` && nestedSplit.layout === `horizontal`) {\n cornerZone.style.cursor = `nwse-resize`;\n } else if (this.layout === `horizontal` && nestedSplit.layout === `vertical`) {\n cornerZone.style.cursor = `nesw-resize`;\n }\n }\n }\n\n getZone(): HTMLElement | undefined {\n if (!this.shadowRoot)\n return;\n const el = this.shadowRoot.querySelector(`#zone`);\n if (!el)\n return undefined;\n return el as HTMLElement;\n }\n\n #onResizeHandleDown = (event: PointerEvent) => {\n event.preventDefault();\n const zoneEl = this.getZone();\n if (zoneEl) {\n zoneEl.classList.add(`user-resizing`);\n }\n this.#elementBounds = this.getBoundingClientRect();\n this.#startSizeA = this.sizeA;\n this.#startSizeB = this.sizeB;\n window.addEventListener(`pointerup`, this.#onResizeHandleUp);\n window.addEventListener(`pointermove`, this.#onResizeHandleMove);\n };\n\n #onResizeHandleUp = (event: PointerEvent) => {\n event.preventDefault();\n const zoneEl = this.getZone();\n if (zoneEl) {\n zoneEl.classList.remove(`user-resizing`);\n }\n window.removeEventListener(`pointerup`, this.#onResizeHandleUp);\n window.removeEventListener(`pointermove`, this.#onResizeHandleMove);\n };\n\n #onResizeHandleMove = (event: PointerEvent) => {\n const bounds = this.#elementBounds;\n if (!bounds)\n return;\n\n const threshold = 5;\n\n if (this.layout === `horizontal`) {\n const y = event.y - bounds.y;\n const relativeY = clamp(y / bounds.height);\n\n if (this.collapsible && this.collapsedA) {\n if (relativeY > (this.#collapsedAPointerAtCollapse ?? 0.05) + this.#hysteresisThreshold) {\n this.collapsedA = false;\n this.#dispatchCollapsedEvent(`A`, false);\n this.#collapsedAPointerAtCollapse = undefined;\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeY * 100}%`,\n `${(1 - relativeY) * 100}%`,\n bounds.height,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n } else if (this.collapsible && !this.collapsedA && relativeY < threshold / bounds.height) {\n this.collapsedA = true;\n this.#dispatchCollapsedEvent(`A`, true);\n this.sizeA = `0px`;\n this.sizeB = `100%`;\n this.#collapsedAPointerAtCollapse = relativeY;\n } else if (!this.collapsedA) {\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeY * 100}%`,\n `${(1 - relativeY) * 100}%`,\n bounds.height,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n\n if (this.collapsible && this.collapsedB) {\n if (relativeY < (this.#collapsedBPointerAtCollapse ?? 0.95) - this.#hysteresisThreshold) {\n this.collapsedB = false;\n this.#dispatchCollapsedEvent(`B`, false);\n this.#collapsedBPointerAtCollapse = undefined;\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeY * 100}%`,\n `${(1 - relativeY) * 100}%`,\n bounds.height,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n } else if (this.collapsible && !this.collapsedB && relativeY > (1 - threshold / bounds.height)) {\n this.collapsedB = true;\n this.#dispatchCollapsedEvent(`B`, true);\n this.sizeA = `100%`;\n this.sizeB = `0px`;\n this.#collapsedBPointerAtCollapse = relativeY;\n }\n } else {\n const x = event.x - bounds.x;\n const relativeX = clamp(x / bounds.width);\n\n if (this.collapsible && this.collapsedA) {\n if (relativeX > (this.#collapsedAPointerAtCollapse ?? 0.05) + this.#hysteresisThreshold) {\n this.collapsedA = false;\n this.#dispatchCollapsedEvent(`A`, false);\n this.#collapsedAPointerAtCollapse = undefined;\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeX * 100}%`,\n `${(1 - relativeX) * 100}%`,\n bounds.width,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n } else if (this.collapsible && !this.collapsedA && relativeX < threshold / bounds.width) {\n this.collapsedA = true;\n this.#dispatchCollapsedEvent(`A`, true);\n this.sizeA = `0px`;\n this.sizeB = `100%`;\n this.#collapsedAPointerAtCollapse = relativeX;\n } else if (!this.collapsedA) {\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeX * 100}%`,\n `${(1 - relativeX) * 100}%`,\n bounds.width,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n\n if (this.collapsible && this.collapsedB) {\n if (relativeX < (this.#collapsedBPointerAtCollapse ?? 0.95) - this.#hysteresisThreshold) {\n this.collapsedB = false;\n this.#dispatchCollapsedEvent(`B`, false);\n this.#collapsedBPointerAtCollapse = undefined;\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeX * 100}%`,\n `${(1 - relativeX) * 100}%`,\n bounds.width,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n } else if (this.collapsible && !this.collapsedB && relativeX > (1 - threshold / bounds.width)) {\n this.collapsedB = true;\n this.#dispatchCollapsedEvent(`B`, true);\n this.sizeA = `100%`;\n this.sizeB = `0px`;\n this.#collapsedBPointerAtCollapse = relativeX;\n }\n }\n event.preventDefault();\n };\n\n #onCornerResizeDown = (event: PointerEvent) => {\n event.preventDefault();\n event.stopPropagation();\n\n const zoneEl = this.getZone();\n if (zoneEl) {\n zoneEl.classList.add(`user-resizing`);\n }\n\n this.#elementBounds = this.getBoundingClientRect();\n this.#cornerStartX = event.clientX;\n this.#cornerStartY = event.clientY;\n this.#startSizeA = this.sizeA;\n this.#startSizeB = this.sizeB;\n\n const nestedSplit = this.#getNestedSplit();\n if (nestedSplit) {\n this.#nestedSplitInitialSizeA = nestedSplit.sizeA;\n const nestedBounds = nestedSplit.getBoundingClientRect();\n const nestedHandle = nestedSplit.shadowRoot?.querySelector(`.resize-handle`) as HTMLElement;\n if (nestedHandle) {\n this.#nestedSplitBounds = nestedBounds;\n this.#nestedHandleBounds = nestedHandle.getBoundingClientRect();\n }\n const nestedZoneEl = nestedSplit.getZone();\n if (nestedZoneEl) {\n nestedZoneEl.classList.add(`user-resizing`);\n }\n }\n\n window.addEventListener(`pointerup`, this.#onCornerResizeUp);\n window.addEventListener(`pointermove`, this.#onCornerResizeMove);\n };\n\n #onCornerResizeUp = (event: PointerEvent) => {\n event.preventDefault();\n const zoneEl = this.getZone();\n if (zoneEl) {\n zoneEl.classList.remove(`user-resizing`);\n }\n const nestedSplit = this.#getNestedSplit();\n if (nestedSplit) {\n const nestedZoneEl = nestedSplit.getZone();\n if (nestedZoneEl) {\n nestedZoneEl.classList.remove(`user-resizing`);\n }\n }\n window.removeEventListener(`pointerup`, this.#onCornerResizeUp);\n window.removeEventListener(`pointermove`, this.#onCornerResizeMove);\n };\n\n #applyPendingNestedUpdate() {\n if (!this.#pendingNestedUpdate)\n return;\n const { sizeA, sizeB } = this.#pendingNestedUpdate;\n const nested = this.#getNestedSplit();\n if (nested) {\n nested.sizeA = `${sizeA * 100}%`;\n nested.sizeB = `${sizeB * 100}%`;\n }\n this.#pendingNestedUpdate = null;\n }\n\n #onCornerResizeMove = (event: PointerEvent) => {\n const outerBounds = this.#elementBounds;\n const zoneEl = this.getZone();\n const nestedSplit = this.#getNestedSplit();\n if (!outerBounds || !zoneEl || !nestedSplit)\n return;\n\n const zoneBounds = zoneEl.getBoundingClientRect();\n const cursorZoneLocalX = event.clientX - zoneBounds.left;\n const cursorZoneLocalY = event.clientY - zoneBounds.top;\n\n if (this.layout === `vertical` && nestedSplit.layout === `horizontal`) {\n let newOuterFraction = cursorZoneLocalX / outerBounds.width;\n const newNestedFraction = cursorZoneLocalY / outerBounds.height;\n\n const { sizeA: constrainedA, sizeB: constrainedB } = this.#applyConstraints(\n `${newOuterFraction * 100}%`,\n `${(1 - newOuterFraction) * 100}%`,\n outerBounds.width,\n );\n newOuterFraction = this.#parseSizeAsFraction(constrainedA, outerBounds.width);\n\n this.sizeA = constrainedA;\n this.sizeB = constrainedB;\n\n this.#pendingNestedUpdate = {\n sizeA: newNestedFraction,\n sizeB: 1 - newNestedFraction,\n };\n requestAnimationFrame(() => this.#applyPendingNestedUpdate());\n\n const cornerZone = this.shadowRoot?.querySelector(`.corner-zone`) as HTMLElement | undefined;\n if (cornerZone) {\n cornerZone.style.left = `${cursorZoneLocalX - 6}px`;\n cornerZone.style.top = `${cursorZoneLocalY - 6}px`;\n }\n } else if (this.layout === `horizontal` && nestedSplit.layout === `vertical`) {\n const newNestedFraction = cursorZoneLocalX / outerBounds.width;\n let newOuterFraction = cursorZoneLocalY / outerBounds.height;\n\n const { sizeA: constrainedA, sizeB: constrainedB } = this.#applyConstraints(\n `${newOuterFraction * 100}%`,\n `${(1 - newOuterFraction) * 100}%`,\n outerBounds.height,\n );\n newOuterFraction = this.#parseSizeAsFraction(constrainedA, outerBounds.height);\n\n this.sizeA = constrainedA;\n this.sizeB = constrainedB;\n\n this.#pendingNestedUpdate = {\n sizeA: newNestedFraction,\n sizeB: 1 - newNestedFraction,\n };\n requestAnimationFrame(() => this.#applyPendingNestedUpdate());\n\n const cornerZone = this.shadowRoot?.querySelector(`.corner-zone`) as HTMLElement | undefined;\n if (cornerZone) {\n cornerZone.style.left = `${cursorZoneLocalX - 6}px`;\n cornerZone.style.top = `${cursorZoneLocalY - 6}px`;\n }\n }\n\n event.preventDefault();\n };\n\n render() {\n const sizePrefix = this.layout === `vertical` ? `width` : `height`;\n let sizeA = this.sizeA;\n let sizeB = this.sizeB;\n\n if (this.collapsedA) {\n sizeA = `0px`;\n } else if (sizeA.length === 0 && sizeB.length === 0) {\n sizeB = sizeA = `50%`;\n } else if (sizeA.length === 0) {\n sizeA = `auto`;\n } else if (sizeB.length === 0) {\n sizeB = `auto`;\n }\n\n if (this.collapsedB) {\n sizeB = `0px`;\n }\n\n sizeA = `${sizePrefix}:${sizeA}`;\n sizeB = `${sizePrefix}:${sizeB}`;\n\n return html`\n <div id=\"zone\">\n <slot style=${sizeA} name=\"a\"></slot>\n ${this._hasCorner ? html`<div class=\"corner-zone\" @pointerdown=${this.#onCornerResizeDown}></div>` : ``}\n <div @pointerdown=${this.#onResizeHandleDown} class=\"resize-handle\"></div>\n <slot style=${sizeB} name=\"b\"></slot> \n </div>`;\n }\n\n static styles = [themeFallbacks, css`\n :host {\n --handle-size: 2px;\n --handle-colour: var(--surface-5);\n --handle-hover-colour: var(--surface-6);\n --handle-active-colour: var(--accent);\n\n display: block;\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n }\n * {\n box-sizing: border-box;\n }\n #zone {\n display: flex;\n height: 100%;\n position: relative;\n }\n slot {\n display: block;\n overflow: hidden;\n }\n :slotted(*) {\n width: 100%;\n height: 100%;\n }\n\n .resize-handle {\n background-color: var(--handle-colour);\n width: var(--handle-size);\n height: 100%;\n cursor: ew-resize;\n flex-shrink: 0;\n }\n #zone.user-resizing {\n slot {\n opacity: 0.5;\n }\n .resize-handle {\n background-color: var(--handle-active-colour);\n }\n }\n .resize-handle:hover {\n background-color: var(--handle-hover-colour);\n }\n\n .corner-zone {\n position: absolute;\n width: 12px;\n height: 12px;\n z-index: 10;\n border-radius: 50%;\n background: transparent;\n }\n .corner-zone:hover {\n background: transparent;\n }\n\n :host([layout='horizontal']) {\n #zone {\n flex-direction: column;\n }\n .resize-handle {\n background-color: silver;\n height: var(--handle-size);\n width: 100%;\n cursor: ns-resize;\n }\n .resize-handle:hover {\n background-color: var(--handle-hover-colour);\n }\n #zone.user-resizing .resize-handle {\n background-color: var(--handle-active-colour);\n }\n }\n\n :host([data-collapsed-a]) slot[name=\"a\"],\n :host([data-collapsed-b]) slot[name=\"b\"] {\n display: none;\n }\n `];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ixfx-split-layout\": SplitLayoutElement;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"split-layout.js","names":["#elementBounds","#startSizeA","#startSizeB","#onResizeHandleUp","#onResizeHandleMove","#collapsedAPointerAtCollapse","#hysteresisThreshold","#dispatchCollapsedEvent","#applyConstraints","#collapsedBPointerAtCollapse","#cornerStartX","#cornerStartY","#getNestedSplit","#nestedSplitInitialSizeA","#nestedSplitBounds","#nestedHandleBounds","#onCornerResizeUp","#onCornerResizeMove","#parseSizeAsFraction","#pendingNestedUpdate","#applyPendingNestedUpdate","#observer","#setupNestedSplitObserver","#updateCornerPosition","#updateDataCollapsed","#checkForNestedSplit","#nestedSplit","#minSizeToFraction","#maxSizeToFraction","#parseSizeToPx","#getIntersectionPoint","#onCornerResizeDown","#onResizeHandleDown","customElement"],"sources":["../src/split-layout/split-layout.ts"],"sourcesContent":["import { clamp } from \"@ixfx/numbers\";\nimport { css, html, LitElement } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { themeFallbacks } from \"../styles/fallbacks.js\";\nimport { safeCustomElement as customElement } from \"../util/custom-elements.js\";\n\n// TODO: Fire event when panels have been resized\n/**\n * Lays out two elements within a container, with a bar to resize them\n * proportionally.\n *\n * Events\n * ixfx-split-collapsed: Dispatched when a panel is collapsed/uncollapsed via drag.\n * detail: { panel: 'A' | 'B', collapsed: boolean }\n *\n * Attributes\n * layout: `vertical`|`horizontal`\n * sizeA/B: CSS size of section A or B. Can use relative or absolute values\n * fixedA/B: If _true_ size will be calculated in pixels. By default (_false_) it uses % of whole\n * collapsible: If _true_, panels can be collapsed by dragging to edge (default: false)\n * minSizeA/B: Minimum size for panel A or B (e.g., \"100px\" or \"20%\"). Default: none\n * maxSizeA/B: Maximum size for panel A or B (e.g., \"200px\" or \"80%\"). Default: none\n *\n * CSS variables\n * --handle-size: 2px; // Width/height of resize handle\n * --handle-colour: var(--surface-5); // Colour of handle\n * --handle-hover-colour: var(--surface-6); // Colour of handle when hovering\n * --handle-active-colour: var(--accent); // Colour of handle when being used\n */\n@customElement(`ixfx-split-layout`)\nexport class SplitLayoutElement extends LitElement {\n @property({ type: String })\n layout: `vertical` | `horizontal` = `vertical`;\n\n @property({ type: String })\n sizeA = ``;\n\n @property({ type: String })\n sizeB = ``;\n\n @property({ type: Boolean })\n fixedA = false;\n\n @property({ type: Boolean })\n fixedB = false;\n\n @property({ type: Boolean })\n collapsible = false;\n\n @property({ type: Boolean, reflect: true })\n collapsedA = false;\n\n @property({ type: Boolean, reflect: true })\n collapsedB = false;\n\n @property({ type: String })\n minSizeA = ``;\n\n @property({ type: String })\n maxSizeA = ``;\n\n @property({ type: String })\n minSizeB = ``;\n\n @property({ type: String })\n maxSizeB = ``;\n\n @state()\n private _hasCorner = false;\n\n #elementBounds: DOMRect | undefined;\n #startSizeA = ``;\n #startSizeB = ``;\n #cornerStartX = 0;\n #cornerStartY = 0;\n #nestedSplitInitialSizeA = ``;\n\n #cornerZone: HTMLElement | undefined;\n #nestedSplit: SplitLayoutElement | undefined;\n #nestedSplitBounds: DOMRect | undefined;\n #nestedHandleBounds: DOMRect | undefined;\n #observer: MutationObserver | undefined;\n #pendingNestedUpdate: { sizeA: number; sizeB: number } | null = null;\n #collapsedAPointerAtCollapse: number | undefined;\n #collapsedBPointerAtCollapse: number | undefined;\n #hysteresisThreshold = 0.1;\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.#observer?.disconnect();\n }\n\n firstUpdated() {\n this.#setupNestedSplitObserver();\n }\n\n updated(changedProperties: Map<string, unknown>) {\n if (changedProperties.has(`sizeA`) || changedProperties.has(`sizeB`)\n || changedProperties.has(`collapsedA`) || changedProperties.has(`collapsedB`)) {\n this.#updateCornerPosition();\n }\n if (changedProperties.has(`sizeA`) || changedProperties.has(`sizeB`)) {\n this.#updateDataCollapsed();\n }\n }\n\n #updateDataCollapsed() {\n if (this.collapsedA) {\n this.setAttribute(`data-collapsed-a`, ``);\n } else {\n this.removeAttribute(`data-collapsed-a`);\n }\n if (this.collapsedB) {\n this.setAttribute(`data-collapsed-b`, ``);\n } else {\n this.removeAttribute(`data-collapsed-b`);\n }\n }\n\n #dispatchCollapsedEvent(panel: `A` | `B`, collapsed: boolean) {\n this.dispatchEvent(new CustomEvent(`ixfx-split-collapsed`, {\n detail: { panel, collapsed },\n bubbles: true,\n composed: true,\n }));\n }\n\n #setupNestedSplitObserver() {\n const slotA = this.shadowRoot?.querySelector(`slot[name=\"a\"]`) as HTMLSlotElement | undefined;\n if (!slotA)\n return;\n\n this.#observer = new MutationObserver(() => {\n this.#checkForNestedSplit();\n });\n\n this.#observer.observe(slotA, { characterData: true, childList: true, subtree: true });\n this.#checkForNestedSplit();\n }\n\n #checkForNestedSplit() {\n const slotA = this.shadowRoot?.querySelector(`slot[name=\"a\"]`) as HTMLSlotElement | undefined;\n if (!slotA)\n return;\n\n const assignedElements = slotA.assignedElements();\n\n const findNestedSplit = (elements: Element[]): SplitLayoutElement | undefined => {\n for (const el of elements) {\n if (el.tagName === `IXFX-SPLIT-LAYOUT`) {\n return el as SplitLayoutElement;\n }\n const nested = findNestedSplit(Array.from(el.children));\n if (nested)\n return nested;\n }\n return undefined;\n };\n\n const nestedSplit = findNestedSplit(assignedElements);\n\n if (nestedSplit) {\n this.#nestedSplit = nestedSplit;\n this._hasCorner = true;\n requestAnimationFrame(() => this.#updateCornerPosition());\n } else {\n this.#nestedSplit = undefined;\n this._hasCorner = false;\n }\n }\n\n #getNestedSplit(): SplitLayoutElement | undefined {\n if (this.#nestedSplit)\n return this.#nestedSplit;\n\n const slotA = this.shadowRoot?.querySelector(`slot[name=\"a\"]`) as HTMLSlotElement | undefined;\n if (!slotA)\n return undefined;\n const assignedElements = slotA.assignedElements();\n return assignedElements.find(\n el => el.tagName === `IXFX-SPLIT-LAYOUT`,\n ) as SplitLayoutElement | undefined;\n }\n\n #parseSizeAsFraction(size: string, total: number): number {\n if (size.endsWith(`px`)) {\n return Number.parseFloat(size.replace(`px`, ``)) / total;\n } else if (size.endsWith(`%`)) {\n return Number.parseFloat(size.replace(`%`, ``)) / 100;\n }\n return 0.5;\n }\n\n #parseSizeToPx(size: string, total: number): number | null {\n if (size.endsWith(`px`)) {\n return Number.parseFloat(size.replace(`px`, ``));\n } else if (size.endsWith(`%`)) {\n return (Number.parseFloat(size.replace(`%`, ``)) / 100) * total;\n }\n return null;\n }\n\n #applyConstraints(sizeA: string, sizeB: string, total: number): { sizeA: string; sizeB: string } {\n let fractionA = this.#parseSizeAsFraction(sizeA, total);\n let fractionB = this.#parseSizeAsFraction(sizeB, total);\n\n const minA = this.#minSizeToFraction(this.minSizeA, total);\n const minB = this.#minSizeToFraction(this.minSizeB, total);\n const maxA = this.#maxSizeToFraction(this.maxSizeA, total);\n const maxB = this.#maxSizeToFraction(this.maxSizeB, total);\n\n if (minA !== null || minB !== null) {\n const minSum = (minA ?? 0) + (minB ?? 0);\n if (minSum > 1) {\n const scale = 1 / minSum;\n if (minA !== null)\n minA !== null ? fractionA = minA * scale : fractionA = 0;\n if (minB !== null)\n minB !== null ? fractionB = minB * scale : fractionB = 0;\n }\n\n if (fractionA < (minA ?? 0))\n fractionA = minA ?? 0;\n if (fractionB < (minB ?? 0))\n fractionB = minB ?? 0;\n }\n\n if (maxA !== null) {\n if (fractionA > maxA)\n fractionA = maxA;\n }\n if (maxB !== null) {\n if (fractionB > maxB)\n fractionB = maxB;\n }\n\n fractionB = 1 - fractionA;\n\n const isPercentA = !this.sizeA.endsWith(`px`);\n const _isPercentB = !this.sizeB.endsWith(`px`);\n\n if (isPercentA) {\n return { sizeA: `${fractionA * 100}%`, sizeB: `${fractionB * 100}%` };\n } else {\n return { sizeA: `${fractionA * total}px`, sizeB: `${fractionB * total}px` };\n }\n }\n\n #minSizeToFraction(minSize: string, total: number): number | null {\n if (minSize.length === 0)\n return null;\n const px = this.#parseSizeToPx(minSize, total);\n if (px !== null)\n return px / total;\n if (minSize.endsWith(`%`))\n return Number.parseFloat(minSize.replace(`%`, ``)) / 100;\n return null;\n }\n\n #maxSizeToFraction(maxSize: string, total: number): number | null {\n if (maxSize.length === 0)\n return null;\n const px = this.#parseSizeToPx(maxSize, total);\n if (px !== null)\n return px / total;\n if (maxSize.endsWith(`%`))\n return Number.parseFloat(maxSize.replace(`%`, ``)) / 100;\n return null;\n }\n\n #getIntersectionPoint(): { x: number; y: number } | null {\n const outerBounds = this.getBoundingClientRect();\n const zoneEl = this.getZone();\n if (!zoneEl)\n return null;\n\n const nestedSplit = this.#getNestedSplit();\n if (!nestedSplit)\n return null;\n\n const _zoneBounds = zoneEl.getBoundingClientRect();\n\n const outerFraction = this.#parseSizeAsFraction(this.sizeA || `50%`, outerBounds.width);\n\n let x: number, y: number;\n\n if (this.layout === `vertical` && nestedSplit.layout === `horizontal`) {\n x = outerFraction * outerBounds.width;\n const nestedFraction = this.#parseSizeAsFraction(nestedSplit.sizeA || `50%`, outerBounds.height);\n y = nestedFraction * outerBounds.height;\n } else if (this.layout === `horizontal` && nestedSplit.layout === `vertical`) {\n const nestedFraction = this.#parseSizeAsFraction(nestedSplit.sizeA || `50%`, outerBounds.width);\n x = nestedFraction * outerBounds.width;\n y = outerFraction * outerBounds.height;\n } else {\n return null;\n }\n\n return { x, y };\n }\n\n #updateCornerPosition() {\n if (!this._hasCorner)\n return;\n\n const cornerZone = this.shadowRoot?.querySelector(`.corner-zone`) as HTMLElement | undefined;\n if (!cornerZone)\n return;\n\n const zoneEl = this.getZone();\n if (!zoneEl)\n return;\n\n const intersection = this.#getIntersectionPoint();\n if (!intersection) {\n cornerZone.style.display = `none`;\n return;\n }\n\n const cornerX = intersection.x - 6;\n const cornerY = intersection.y - 6;\n\n cornerZone.style.left = `${cornerX}px`;\n cornerZone.style.top = `${cornerY}px`;\n cornerZone.style.display = `block`;\n\n const nestedSplit = this.#getNestedSplit();\n if (nestedSplit) {\n if (this.layout === `vertical` && nestedSplit.layout === `horizontal`) {\n cornerZone.style.cursor = `nwse-resize`;\n } else if (this.layout === `horizontal` && nestedSplit.layout === `vertical`) {\n cornerZone.style.cursor = `nesw-resize`;\n }\n }\n }\n\n getZone(): HTMLElement | undefined {\n if (!this.shadowRoot)\n return;\n const el = this.shadowRoot.querySelector(`#zone`);\n if (!el)\n return undefined;\n return el as HTMLElement;\n }\n\n #onResizeHandleDown = (event: PointerEvent) => {\n event.preventDefault();\n const zoneEl = this.getZone();\n if (zoneEl) {\n zoneEl.classList.add(`user-resizing`);\n }\n this.#elementBounds = this.getBoundingClientRect();\n this.#startSizeA = this.sizeA;\n this.#startSizeB = this.sizeB;\n window.addEventListener(`pointerup`, this.#onResizeHandleUp);\n window.addEventListener(`pointermove`, this.#onResizeHandleMove);\n };\n\n #onResizeHandleUp = (event: PointerEvent) => {\n event.preventDefault();\n const zoneEl = this.getZone();\n if (zoneEl) {\n zoneEl.classList.remove(`user-resizing`);\n }\n window.removeEventListener(`pointerup`, this.#onResizeHandleUp);\n window.removeEventListener(`pointermove`, this.#onResizeHandleMove);\n };\n\n #onResizeHandleMove = (event: PointerEvent) => {\n const bounds = this.#elementBounds;\n if (!bounds)\n return;\n\n const threshold = 5;\n\n if (this.layout === `horizontal`) {\n const y = event.y - bounds.y;\n const relativeY = clamp(y / bounds.height);\n\n if (this.collapsible && this.collapsedA) {\n if (relativeY > (this.#collapsedAPointerAtCollapse ?? 0.05) + this.#hysteresisThreshold) {\n this.collapsedA = false;\n this.#dispatchCollapsedEvent(`A`, false);\n this.#collapsedAPointerAtCollapse = undefined;\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeY * 100}%`,\n `${(1 - relativeY) * 100}%`,\n bounds.height,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n } else if (this.collapsible && !this.collapsedA && relativeY < threshold / bounds.height) {\n this.collapsedA = true;\n this.#dispatchCollapsedEvent(`A`, true);\n this.sizeA = `0px`;\n this.sizeB = `100%`;\n this.#collapsedAPointerAtCollapse = relativeY;\n } else if (!this.collapsedA) {\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeY * 100}%`,\n `${(1 - relativeY) * 100}%`,\n bounds.height,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n\n if (this.collapsible && this.collapsedB) {\n if (relativeY < (this.#collapsedBPointerAtCollapse ?? 0.95) - this.#hysteresisThreshold) {\n this.collapsedB = false;\n this.#dispatchCollapsedEvent(`B`, false);\n this.#collapsedBPointerAtCollapse = undefined;\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeY * 100}%`,\n `${(1 - relativeY) * 100}%`,\n bounds.height,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n } else if (this.collapsible && !this.collapsedB && relativeY > (1 - threshold / bounds.height)) {\n this.collapsedB = true;\n this.#dispatchCollapsedEvent(`B`, true);\n this.sizeA = `100%`;\n this.sizeB = `0px`;\n this.#collapsedBPointerAtCollapse = relativeY;\n }\n } else {\n const x = event.x - bounds.x;\n const relativeX = clamp(x / bounds.width);\n\n if (this.collapsible && this.collapsedA) {\n if (relativeX > (this.#collapsedAPointerAtCollapse ?? 0.05) + this.#hysteresisThreshold) {\n this.collapsedA = false;\n this.#dispatchCollapsedEvent(`A`, false);\n this.#collapsedAPointerAtCollapse = undefined;\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeX * 100}%`,\n `${(1 - relativeX) * 100}%`,\n bounds.width,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n } else if (this.collapsible && !this.collapsedA && relativeX < threshold / bounds.width) {\n this.collapsedA = true;\n this.#dispatchCollapsedEvent(`A`, true);\n this.sizeA = `0px`;\n this.sizeB = `100%`;\n this.#collapsedAPointerAtCollapse = relativeX;\n } else if (!this.collapsedA) {\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeX * 100}%`,\n `${(1 - relativeX) * 100}%`,\n bounds.width,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n\n if (this.collapsible && this.collapsedB) {\n if (relativeX < (this.#collapsedBPointerAtCollapse ?? 0.95) - this.#hysteresisThreshold) {\n this.collapsedB = false;\n this.#dispatchCollapsedEvent(`B`, false);\n this.#collapsedBPointerAtCollapse = undefined;\n const { sizeA, sizeB } = this.#applyConstraints(\n `${relativeX * 100}%`,\n `${(1 - relativeX) * 100}%`,\n bounds.width,\n );\n this.sizeA = sizeA;\n this.sizeB = sizeB;\n }\n } else if (this.collapsible && !this.collapsedB && relativeX > (1 - threshold / bounds.width)) {\n this.collapsedB = true;\n this.#dispatchCollapsedEvent(`B`, true);\n this.sizeA = `100%`;\n this.sizeB = `0px`;\n this.#collapsedBPointerAtCollapse = relativeX;\n }\n }\n event.preventDefault();\n };\n\n #onCornerResizeDown = (event: PointerEvent) => {\n event.preventDefault();\n event.stopPropagation();\n\n const zoneEl = this.getZone();\n if (zoneEl) {\n zoneEl.classList.add(`user-resizing`);\n }\n\n this.#elementBounds = this.getBoundingClientRect();\n this.#cornerStartX = event.clientX;\n this.#cornerStartY = event.clientY;\n this.#startSizeA = this.sizeA;\n this.#startSizeB = this.sizeB;\n\n const nestedSplit = this.#getNestedSplit();\n if (nestedSplit) {\n this.#nestedSplitInitialSizeA = nestedSplit.sizeA;\n const nestedBounds = nestedSplit.getBoundingClientRect();\n const nestedHandle = nestedSplit.shadowRoot?.querySelector(`.resize-handle`) as HTMLElement;\n if (nestedHandle) {\n this.#nestedSplitBounds = nestedBounds;\n this.#nestedHandleBounds = nestedHandle.getBoundingClientRect();\n }\n const nestedZoneEl = nestedSplit.getZone();\n if (nestedZoneEl) {\n nestedZoneEl.classList.add(`user-resizing`);\n }\n }\n\n window.addEventListener(`pointerup`, this.#onCornerResizeUp);\n window.addEventListener(`pointermove`, this.#onCornerResizeMove);\n };\n\n #onCornerResizeUp = (event: PointerEvent) => {\n event.preventDefault();\n const zoneEl = this.getZone();\n if (zoneEl) {\n zoneEl.classList.remove(`user-resizing`);\n }\n const nestedSplit = this.#getNestedSplit();\n if (nestedSplit) {\n const nestedZoneEl = nestedSplit.getZone();\n if (nestedZoneEl) {\n nestedZoneEl.classList.remove(`user-resizing`);\n }\n }\n window.removeEventListener(`pointerup`, this.#onCornerResizeUp);\n window.removeEventListener(`pointermove`, this.#onCornerResizeMove);\n };\n\n #applyPendingNestedUpdate() {\n if (!this.#pendingNestedUpdate)\n return;\n const { sizeA, sizeB } = this.#pendingNestedUpdate;\n const nested = this.#getNestedSplit();\n if (nested) {\n nested.sizeA = `${sizeA * 100}%`;\n nested.sizeB = `${sizeB * 100}%`;\n }\n this.#pendingNestedUpdate = null;\n }\n\n #onCornerResizeMove = (event: PointerEvent) => {\n const outerBounds = this.#elementBounds;\n const zoneEl = this.getZone();\n const nestedSplit = this.#getNestedSplit();\n if (!outerBounds || !zoneEl || !nestedSplit)\n return;\n\n const zoneBounds = zoneEl.getBoundingClientRect();\n const cursorZoneLocalX = event.clientX - zoneBounds.left;\n const cursorZoneLocalY = event.clientY - zoneBounds.top;\n\n if (this.layout === `vertical` && nestedSplit.layout === `horizontal`) {\n let newOuterFraction = cursorZoneLocalX / outerBounds.width;\n const newNestedFraction = cursorZoneLocalY / outerBounds.height;\n\n const { sizeA: constrainedA, sizeB: constrainedB } = this.#applyConstraints(\n `${newOuterFraction * 100}%`,\n `${(1 - newOuterFraction) * 100}%`,\n outerBounds.width,\n );\n newOuterFraction = this.#parseSizeAsFraction(constrainedA, outerBounds.width);\n\n this.sizeA = constrainedA;\n this.sizeB = constrainedB;\n\n this.#pendingNestedUpdate = {\n sizeA: newNestedFraction,\n sizeB: 1 - newNestedFraction,\n };\n requestAnimationFrame(() => this.#applyPendingNestedUpdate());\n\n const cornerZone = this.shadowRoot?.querySelector(`.corner-zone`) as HTMLElement | undefined;\n if (cornerZone) {\n cornerZone.style.left = `${cursorZoneLocalX - 6}px`;\n cornerZone.style.top = `${cursorZoneLocalY - 6}px`;\n }\n } else if (this.layout === `horizontal` && nestedSplit.layout === `vertical`) {\n const newNestedFraction = cursorZoneLocalX / outerBounds.width;\n let newOuterFraction = cursorZoneLocalY / outerBounds.height;\n\n const { sizeA: constrainedA, sizeB: constrainedB } = this.#applyConstraints(\n `${newOuterFraction * 100}%`,\n `${(1 - newOuterFraction) * 100}%`,\n outerBounds.height,\n );\n newOuterFraction = this.#parseSizeAsFraction(constrainedA, outerBounds.height);\n\n this.sizeA = constrainedA;\n this.sizeB = constrainedB;\n\n this.#pendingNestedUpdate = {\n sizeA: newNestedFraction,\n sizeB: 1 - newNestedFraction,\n };\n requestAnimationFrame(() => this.#applyPendingNestedUpdate());\n\n const cornerZone = this.shadowRoot?.querySelector(`.corner-zone`) as HTMLElement | undefined;\n if (cornerZone) {\n cornerZone.style.left = `${cursorZoneLocalX - 6}px`;\n cornerZone.style.top = `${cursorZoneLocalY - 6}px`;\n }\n }\n\n event.preventDefault();\n };\n\n render() {\n const sizePrefix = this.layout === `vertical` ? `width` : `height`;\n let sizeA = this.sizeA;\n let sizeB = this.sizeB;\n\n if (this.collapsedA) {\n sizeA = `0px`;\n } else if (sizeA.length === 0 && sizeB.length === 0) {\n sizeB = sizeA = `50%`;\n } else if (sizeA.length === 0) {\n sizeA = `auto`;\n } else if (sizeB.length === 0) {\n sizeB = `auto`;\n }\n\n if (this.collapsedB) {\n sizeB = `0px`;\n }\n\n sizeA = `${sizePrefix}:${sizeA}`;\n sizeB = `${sizePrefix}:${sizeB}`;\n\n return html`\n <div id=\"zone\">\n <slot style=${sizeA} name=\"a\"></slot>\n ${this._hasCorner ? html`<div class=\"corner-zone\" @pointerdown=${this.#onCornerResizeDown}></div>` : ``}\n <div @pointerdown=${this.#onResizeHandleDown} class=\"resize-handle\"></div>\n <slot style=${sizeB} name=\"b\"></slot> \n </div>`;\n }\n\n static styles = [themeFallbacks, css`\n :host {\n --handle-size: 2px;\n --handle-colour: var(--surface-5);\n --handle-hover-colour: var(--surface-6);\n --handle-active-colour: var(--accent);\n\n display: block;\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n }\n * {\n box-sizing: border-box;\n }\n #zone {\n display: flex;\n height: 100%;\n position: relative;\n }\n slot {\n display: block;\n overflow: hidden;\n }\n :slotted(*) {\n width: 100%;\n height: 100%;\n }\n\n .resize-handle {\n background-color: var(--handle-colour);\n width: var(--handle-size);\n height: 100%;\n cursor: ew-resize;\n flex-shrink: 0;\n }\n #zone.user-resizing {\n slot {\n opacity: 0.5;\n }\n .resize-handle {\n background-color: var(--handle-active-colour);\n }\n }\n .resize-handle:hover {\n background-color: var(--handle-hover-colour);\n }\n\n .corner-zone {\n position: absolute;\n width: 12px;\n height: 12px;\n z-index: 10;\n border-radius: 50%;\n background: transparent;\n }\n .corner-zone:hover {\n background: transparent;\n }\n\n :host([layout='horizontal']) {\n #zone {\n flex-direction: column;\n }\n .resize-handle {\n background-color: silver;\n height: var(--handle-size);\n width: 100%;\n cursor: ns-resize;\n }\n .resize-handle:hover {\n background-color: var(--handle-hover-colour);\n }\n #zone.user-resizing .resize-handle {\n background-color: var(--handle-active-colour);\n }\n }\n\n :host([data-collapsed-a]) slot[name=\"a\"],\n :host([data-collapsed-b]) slot[name=\"b\"] {\n display: none;\n }\n `];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ixfx-split-layout\": SplitLayoutElement;\n }\n}\n"],"mappings":";;;;;;AA8BO,IAAM,qBAAN,MAAM,2BAA2B,WAAW;;;EAEb,KAAA,SAAA;EAG5B,KAAA,QAAA;EAGA,KAAA,QAAA;EAGC,KAAA,SAAA;EAGA,KAAA,SAAA;EAGK,KAAA,cAAA;EAGD,KAAA,aAAA;EAGA,KAAA,aAAA;EAGF,KAAA,WAAA;EAGA,KAAA,WAAA;EAGA,KAAA,WAAA;EAGA,KAAA,WAAA;EAGU,KAAA,aAAA;EAGP,KAAA,cAAA;EACA,KAAA,cAAA;EACE,KAAA,gBAAA;EACA,KAAA,gBAAA;EACW,KAAA,2BAAA;EAOqC,KAAA,uBAAA;EAGzC,KAAA,uBAAA;EAoQA,KAAA,uBAAA,UAAwB;GAC7C,MAAM,eAAe;GACrB,MAAM,SAAS,KAAK,QAAQ;GAC5B,IAAI,QACF,OAAO,UAAU,IAAI,eAAe;GAEtC,KAAKA,iBAAiB,KAAK,sBAAsB;GACjD,KAAKC,cAAc,KAAK;GACxB,KAAKC,cAAc,KAAK;GACxB,OAAO,iBAAiB,aAAa,KAAKC,iBAAiB;GAC3D,OAAO,iBAAiB,eAAe,KAAKC,mBAAmB;EACjE;EAEqB,KAAA,qBAAA,UAAwB;GAC3C,MAAM,eAAe;GACrB,MAAM,SAAS,KAAK,QAAQ;GAC5B,IAAI,QACF,OAAO,UAAU,OAAO,eAAe;GAEzC,OAAO,oBAAoB,aAAa,KAAKD,iBAAiB;GAC9D,OAAO,oBAAoB,eAAe,KAAKC,mBAAmB;EACpE;EAEuB,KAAA,uBAAA,UAAwB;GAC7C,MAAM,SAAS,KAAKJ;GACpB,IAAI,CAAC,QACH;GAEF,MAAM,YAAY;GAElB,IAAI,KAAK,WAAW,cAAc;IAChC,MAAM,IAAI,MAAM,IAAI,OAAO;IAC3B,MAAM,YAAY,MAAM,IAAI,OAAO,MAAM;IAEzC,IAAI,KAAK,eAAe,KAAK,YACvB;SAAA,aAAa,KAAKK,gCAAgC,OAAQ,KAAKC,sBAAsB;MACvF,KAAK,aAAa;MAClB,KAAKC,wBAAwB,KAAK,KAAK;MACvC,KAAKF,+BAA+B,KAAA;MACpC,MAAM,EAAE,OAAO,UAAU,KAAKG,kBAC5B,GAAG,YAAY,IAAI,IACnB,IAAI,IAAI,aAAa,IAAI,IACzB,OAAO,MACT;MACA,KAAK,QAAQ;MACb,KAAK,QAAQ;KACf;WACK,IAAI,KAAK,eAAe,CAAC,KAAK,cAAc,YAAY,YAAY,OAAO,QAAQ;KACxF,KAAK,aAAa;KAClB,KAAKD,wBAAwB,KAAK,IAAI;KACtC,KAAK,QAAQ;KACb,KAAK,QAAQ;KACb,KAAKF,+BAA+B;IACtC,OAAO,IAAI,CAAC,KAAK,YAAY;KAC3B,MAAM,EAAE,OAAO,UAAU,KAAKG,kBAC5B,GAAG,YAAY,IAAI,IACnB,IAAI,IAAI,aAAa,IAAI,IACzB,OAAO,MACT;KACA,KAAK,QAAQ;KACb,KAAK,QAAQ;IACf;IAEA,IAAI,KAAK,eAAe,KAAK,YACvB;SAAA,aAAa,KAAKC,gCAAgC,OAAQ,KAAKH,sBAAsB;MACvF,KAAK,aAAa;MAClB,KAAKC,wBAAwB,KAAK,KAAK;MACvC,KAAKE,+BAA+B,KAAA;MACpC,MAAM,EAAE,OAAO,UAAU,KAAKD,kBAC5B,GAAG,YAAY,IAAI,IACnB,IAAI,IAAI,aAAa,IAAI,IACzB,OAAO,MACT;MACA,KAAK,QAAQ;MACb,KAAK,QAAQ;KACf;WACK,IAAI,KAAK,eAAe,CAAC,KAAK,cAAc,YAAa,IAAI,YAAY,OAAO,QAAS;KAC9F,KAAK,aAAa;KAClB,KAAKD,wBAAwB,KAAK,IAAI;KACtC,KAAK,QAAQ;KACb,KAAK,QAAQ;KACb,KAAKE,+BAA+B;IACtC;GACF,OAAO;IACL,MAAM,IAAI,MAAM,IAAI,OAAO;IAC3B,MAAM,YAAY,MAAM,IAAI,OAAO,KAAK;IAExC,IAAI,KAAK,eAAe,KAAK,YACvB;SAAA,aAAa,KAAKJ,gCAAgC,OAAQ,KAAKC,sBAAsB;MACvF,KAAK,aAAa;MAClB,KAAKC,wBAAwB,KAAK,KAAK;MACvC,KAAKF,+BAA+B,KAAA;MACpC,MAAM,EAAE,OAAO,UAAU,KAAKG,kBAC5B,GAAG,YAAY,IAAI,IACnB,IAAI,IAAI,aAAa,IAAI,IACzB,OAAO,KACT;MACA,KAAK,QAAQ;MACb,KAAK,QAAQ;KACf;WACK,IAAI,KAAK,eAAe,CAAC,KAAK,cAAc,YAAY,YAAY,OAAO,OAAO;KACvF,KAAK,aAAa;KAClB,KAAKD,wBAAwB,KAAK,IAAI;KACtC,KAAK,QAAQ;KACb,KAAK,QAAQ;KACb,KAAKF,+BAA+B;IACtC,OAAO,IAAI,CAAC,KAAK,YAAY;KAC3B,MAAM,EAAE,OAAO,UAAU,KAAKG,kBAC5B,GAAG,YAAY,IAAI,IACnB,IAAI,IAAI,aAAa,IAAI,IACzB,OAAO,KACT;KACA,KAAK,QAAQ;KACb,KAAK,QAAQ;IACf;IAEA,IAAI,KAAK,eAAe,KAAK,YACvB;SAAA,aAAa,KAAKC,gCAAgC,OAAQ,KAAKH,sBAAsB;MACvF,KAAK,aAAa;MAClB,KAAKC,wBAAwB,KAAK,KAAK;MACvC,KAAKE,+BAA+B,KAAA;MACpC,MAAM,EAAE,OAAO,UAAU,KAAKD,kBAC5B,GAAG,YAAY,IAAI,IACnB,IAAI,IAAI,aAAa,IAAI,IACzB,OAAO,KACT;MACA,KAAK,QAAQ;MACb,KAAK,QAAQ;KACf;WACK,IAAI,KAAK,eAAe,CAAC,KAAK,cAAc,YAAa,IAAI,YAAY,OAAO,OAAQ;KAC7F,KAAK,aAAa;KAClB,KAAKD,wBAAwB,KAAK,IAAI;KACtC,KAAK,QAAQ;KACb,KAAK,QAAQ;KACb,KAAKE,+BAA+B;IACtC;GACF;GACA,MAAM,eAAe;EACvB;EAEuB,KAAA,uBAAA,UAAwB;GAC7C,MAAM,eAAe;GACrB,MAAM,gBAAgB;GAEtB,MAAM,SAAS,KAAK,QAAQ;GAC5B,IAAI,QACF,OAAO,UAAU,IAAI,eAAe;GAGtC,KAAKT,iBAAiB,KAAK,sBAAsB;GACjD,KAAKU,gBAAgB,MAAM;GAC3B,KAAKC,gBAAgB,MAAM;GAC3B,KAAKV,cAAc,KAAK;GACxB,KAAKC,cAAc,KAAK;GAExB,MAAM,cAAc,KAAKU,gBAAgB;GACzC,IAAI,aAAa;IACf,KAAKC,2BAA2B,YAAY;IAC5C,MAAM,eAAe,YAAY,sBAAsB;IACvD,MAAM,eAAe,YAAY,YAAY,cAAc,gBAAgB;IAC3E,IAAI,cAAc;KAChB,KAAKC,qBAAqB;KAC1B,KAAKC,sBAAsB,aAAa,sBAAsB;IAChE;IACA,MAAM,eAAe,YAAY,QAAQ;IACzC,IAAI,cACF,aAAa,UAAU,IAAI,eAAe;GAE9C;GAEA,OAAO,iBAAiB,aAAa,KAAKC,iBAAiB;GAC3D,OAAO,iBAAiB,eAAe,KAAKC,mBAAmB;EACjE;EAEqB,KAAA,qBAAA,UAAwB;GAC3C,MAAM,eAAe;GACrB,MAAM,SAAS,KAAK,QAAQ;GAC5B,IAAI,QACF,OAAO,UAAU,OAAO,eAAe;GAEzC,MAAM,cAAc,KAAKL,gBAAgB;GACzC,IAAI,aAAa;IACf,MAAM,eAAe,YAAY,QAAQ;IACzC,IAAI,cACF,aAAa,UAAU,OAAO,eAAe;GAEjD;GACA,OAAO,oBAAoB,aAAa,KAAKI,iBAAiB;GAC9D,OAAO,oBAAoB,eAAe,KAAKC,mBAAmB;EACpE;EAcuB,KAAA,uBAAA,UAAwB;GAC7C,MAAM,cAAc,KAAKjB;GACzB,MAAM,SAAS,KAAK,QAAQ;GAC5B,MAAM,cAAc,KAAKY,gBAAgB;GACzC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,aAC9B;GAEF,MAAM,aAAa,OAAO,sBAAsB;GAChD,MAAM,mBAAmB,MAAM,UAAU,WAAW;GACpD,MAAM,mBAAmB,MAAM,UAAU,WAAW;GAEpD,IAAI,KAAK,WAAW,cAAc,YAAY,WAAW,cAAc;IACrE,IAAI,mBAAmB,mBAAmB,YAAY;IACtD,MAAM,oBAAoB,mBAAmB,YAAY;IAEzD,MAAM,EAAE,OAAO,cAAc,OAAO,iBAAiB,KAAKJ,kBACxD,GAAG,mBAAmB,IAAI,IAC1B,IAAI,IAAI,oBAAoB,IAAI,IAChC,YAAY,KACd;IACA,mBAAmB,KAAKU,qBAAqB,cAAc,YAAY,KAAK;IAE5E,KAAK,QAAQ;IACb,KAAK,QAAQ;IAEb,KAAKC,uBAAuB;KAC1B,OAAO;KACP,OAAO,IAAI;IACb;IACA,4BAA4B,KAAKC,0BAA0B,CAAC;IAE5D,MAAM,aAAa,KAAK,YAAY,cAAc,cAAc;IAChE,IAAI,YAAY;KACd,WAAW,MAAM,OAAO,GAAG,mBAAmB,EAAE;KAChD,WAAW,MAAM,MAAM,GAAG,mBAAmB,EAAE;IACjD;GACF,OAAO,IAAI,KAAK,WAAW,gBAAgB,YAAY,WAAW,YAAY;IAC5E,MAAM,oBAAoB,mBAAmB,YAAY;IACzD,IAAI,mBAAmB,mBAAmB,YAAY;IAEtD,MAAM,EAAE,OAAO,cAAc,OAAO,iBAAiB,KAAKZ,kBACxD,GAAG,mBAAmB,IAAI,IAC1B,IAAI,IAAI,oBAAoB,IAAI,IAChC,YAAY,MACd;IACA,mBAAmB,KAAKU,qBAAqB,cAAc,YAAY,MAAM;IAE7E,KAAK,QAAQ;IACb,KAAK,QAAQ;IAEb,KAAKC,uBAAuB;KAC1B,OAAO;KACP,OAAO,IAAI;IACb;IACA,4BAA4B,KAAKC,0BAA0B,CAAC;IAE5D,MAAM,aAAa,KAAK,YAAY,cAAc,cAAc;IAChE,IAAI,YAAY;KACd,WAAW,MAAM,OAAO,GAAG,mBAAmB,EAAE;KAChD,WAAW,MAAM,MAAM,GAAG,mBAAmB,EAAE;IACjD;GACF;GAEA,MAAM,eAAe;EACvB;;CA9hBA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA,uBAAuB;EACrB,MAAM,qBAAqB;EAC3B,KAAKC,WAAW,WAAW;CAC7B;CAEA,eAAe;EACb,KAAKC,0BAA0B;CACjC;CAEA,QAAQ,mBAAyC;EAC/C,IAAI,kBAAkB,IAAI,OAAO,KAAK,kBAAkB,IAAI,OAAO,KAC9D,kBAAkB,IAAI,YAAY,KAAK,kBAAkB,IAAI,YAAY,GAC5E,KAAKC,sBAAsB;EAE7B,IAAI,kBAAkB,IAAI,OAAO,KAAK,kBAAkB,IAAI,OAAO,GACjE,KAAKC,qBAAqB;CAE9B;CAEA,uBAAuB;EACrB,IAAI,KAAK,YACP,KAAK,aAAa,oBAAoB,EAAE;OAExC,KAAK,gBAAgB,kBAAkB;EAEzC,IAAI,KAAK,YACP,KAAK,aAAa,oBAAoB,EAAE;OAExC,KAAK,gBAAgB,kBAAkB;CAE3C;CAEA,wBAAwB,OAAkB,WAAoB;EAC5D,KAAK,cAAc,IAAI,YAAY,wBAAwB;GACzD,QAAQ;IAAE;IAAO;GAAU;GAC3B,SAAS;GACT,UAAU;EACZ,CAAC,CAAC;CACJ;CAEA,4BAA4B;EAC1B,MAAM,QAAQ,KAAK,YAAY,cAAc,gBAAgB;EAC7D,IAAI,CAAC,OACH;EAEF,KAAKH,YAAY,IAAI,uBAAuB;GAC1C,KAAKI,qBAAqB;EAC5B,CAAC;EAED,KAAKJ,UAAU,QAAQ,OAAO;GAAE,eAAe;GAAM,WAAW;GAAM,SAAS;EAAK,CAAC;EACrF,KAAKI,qBAAqB;CAC5B;CAEA,uBAAuB;EACrB,MAAM,QAAQ,KAAK,YAAY,cAAc,gBAAgB;EAC7D,IAAI,CAAC,OACH;EAEF,MAAM,mBAAmB,MAAM,iBAAiB;EAEhD,MAAM,mBAAmB,aAAwD;GAC/E,KAAK,MAAM,MAAM,UAAU;IACzB,IAAI,GAAG,YAAY,qBACjB,OAAO;IAET,MAAM,SAAS,gBAAgB,MAAM,KAAK,GAAG,QAAQ,CAAC;IACtD,IAAI,QACF,OAAO;GACX;EAEF;EAEA,MAAM,cAAc,gBAAgB,gBAAgB;EAEpD,IAAI,aAAa;GACf,KAAKC,eAAe;GACpB,KAAK,aAAa;GAClB,4BAA4B,KAAKH,sBAAsB,CAAC;EAC1D,OAAO;GACL,KAAKG,eAAe,KAAA;GACpB,KAAK,aAAa;EACpB;CACF;CAEA,kBAAkD;EAChD,IAAI,KAAKA,cACP,OAAO,KAAKA;EAEd,MAAM,QAAQ,KAAK,YAAY,cAAc,gBAAgB;EAC7D,IAAI,CAAC,OACH,OAAO,KAAA;EAET,OADyB,MAAM,iBACT,CAAC,CAAC,MACtB,OAAM,GAAG,YAAY,mBACvB;CACF;CAEA,qBAAqB,MAAc,OAAuB;EACxD,IAAI,KAAK,SAAS,IAAI,GACpB,OAAO,OAAO,WAAW,KAAK,QAAQ,MAAM,EAAE,CAAC,IAAI;OAC9C,IAAI,KAAK,SAAS,GAAG,GAC1B,OAAO,OAAO,WAAW,KAAK,QAAQ,KAAK,EAAE,CAAC,IAAI;EAEpD,OAAO;CACT;CAEA,eAAe,MAAc,OAA8B;EACzD,IAAI,KAAK,SAAS,IAAI,GACpB,OAAO,OAAO,WAAW,KAAK,QAAQ,MAAM,EAAE,CAAC;OAC1C,IAAI,KAAK,SAAS,GAAG,GAC1B,OAAQ,OAAO,WAAW,KAAK,QAAQ,KAAK,EAAE,CAAC,IAAI,MAAO;EAE5D,OAAO;CACT;CAEA,kBAAkB,OAAe,OAAe,OAAiD;EAC/F,IAAI,YAAY,KAAKR,qBAAqB,OAAO,KAAK;EACtD,IAAI,YAAY,KAAKA,qBAAqB,OAAO,KAAK;EAEtD,MAAM,OAAO,KAAKS,mBAAmB,KAAK,UAAU,KAAK;EACzD,MAAM,OAAO,KAAKA,mBAAmB,KAAK,UAAU,KAAK;EACzD,MAAM,OAAO,KAAKC,mBAAmB,KAAK,UAAU,KAAK;EACzD,MAAM,OAAO,KAAKA,mBAAmB,KAAK,UAAU,KAAK;EAEzD,IAAI,SAAS,QAAQ,SAAS,MAAM;GAClC,MAAM,UAAU,QAAQ,MAAM,QAAQ;GACtC,IAAI,SAAS,GAAG;IACd,MAAM,QAAQ,IAAI;IAClB,IAAI,SAAS,MACX,SAAS,OAAO,YAAY,OAAO,QAAQ,YAAY;IACzD,IAAI,SAAS,MACX,SAAS,OAAO,YAAY,OAAO,QAAQ,YAAY;GAC3D;GAEA,IAAI,aAAa,QAAQ,IACvB,YAAY,QAAQ;GACtB,IAAI,aAAa,QAAQ,IACvB,YAAY,QAAQ;EACxB;EAEA,IAAI,SAAS,MACP;OAAA,YAAY,MACd,YAAY;EAAA;EAEhB,IAAI,SAAS,MACP;OAAA,YAAY,MACd,YAAY;EAAA;EAGhB,YAAY,IAAI;EAEhB,MAAM,aAAa,CAAC,KAAK,MAAM,SAAS,IAAI;EACvB,KAAK,MAAM,SAAS,IAAI;EAE7C,IAAI,YACF,OAAO;GAAE,OAAO,GAAG,YAAY,IAAI;GAAI,OAAO,GAAG,YAAY,IAAI;EAAG;OAEpE,OAAO;GAAE,OAAO,GAAG,YAAY,MAAM;GAAK,OAAO,GAAG,YAAY,MAAM;EAAI;CAE9E;CAEA,mBAAmB,SAAiB,OAA8B;EAChE,IAAI,QAAQ,WAAW,GACrB,OAAO;EACT,MAAM,KAAK,KAAKC,eAAe,SAAS,KAAK;EAC7C,IAAI,OAAO,MACT,OAAO,KAAK;EACd,IAAI,QAAQ,SAAS,GAAG,GACtB,OAAO,OAAO,WAAW,QAAQ,QAAQ,KAAK,EAAE,CAAC,IAAI;EACvD,OAAO;CACT;CAEA,mBAAmB,SAAiB,OAA8B;EAChE,IAAI,QAAQ,WAAW,GACrB,OAAO;EACT,MAAM,KAAK,KAAKA,eAAe,SAAS,KAAK;EAC7C,IAAI,OAAO,MACT,OAAO,KAAK;EACd,IAAI,QAAQ,SAAS,GAAG,GACtB,OAAO,OAAO,WAAW,QAAQ,QAAQ,KAAK,EAAE,CAAC,IAAI;EACvD,OAAO;CACT;CAEA,wBAAyD;EACvD,MAAM,cAAc,KAAK,sBAAsB;EAC/C,MAAM,SAAS,KAAK,QAAQ;EAC5B,IAAI,CAAC,QACH,OAAO;EAET,MAAM,cAAc,KAAKjB,gBAAgB;EACzC,IAAI,CAAC,aACH,OAAO;EAEW,OAAO,sBAAsB;EAEjD,MAAM,gBAAgB,KAAKM,qBAAqB,KAAK,SAAS,OAAO,YAAY,KAAK;EAEtF,IAAI,GAAW;EAEf,IAAI,KAAK,WAAW,cAAc,YAAY,WAAW,cAAc;GACrE,IAAI,gBAAgB,YAAY;GAEhC,IADuB,KAAKA,qBAAqB,YAAY,SAAS,OAAO,YAAY,MACxE,IAAI,YAAY;EACnC,OAAO,IAAI,KAAK,WAAW,gBAAgB,YAAY,WAAW,YAAY;GAE5E,IADuB,KAAKA,qBAAqB,YAAY,SAAS,OAAO,YAAY,KACxE,IAAI,YAAY;GACjC,IAAI,gBAAgB,YAAY;EAClC,OACE,OAAO;EAGT,OAAO;GAAE;GAAG;EAAE;CAChB;CAEA,wBAAwB;EACtB,IAAI,CAAC,KAAK,YACR;EAEF,MAAM,aAAa,KAAK,YAAY,cAAc,cAAc;EAChE,IAAI,CAAC,YACH;EAGF,IAAI,CADW,KAAK,QACV,GACR;EAEF,MAAM,eAAe,KAAKY,sBAAsB;EAChD,IAAI,CAAC,cAAc;GACjB,WAAW,MAAM,UAAU;GAC3B;EACF;EAEA,MAAM,UAAU,aAAa,IAAI;EACjC,MAAM,UAAU,aAAa,IAAI;EAEjC,WAAW,MAAM,OAAO,GAAG,QAAQ;EACnC,WAAW,MAAM,MAAM,GAAG,QAAQ;EAClC,WAAW,MAAM,UAAU;EAE3B,MAAM,cAAc,KAAKlB,gBAAgB;EACzC,IAAI,aAAa;GACf,IAAI,KAAK,WAAW,cAAc,YAAY,WAAW,cACvD,WAAW,MAAM,SAAS;QACrB,IAAI,KAAK,WAAW,gBAAgB,YAAY,WAAW,YAChE,WAAW,MAAM,SAAS;EAE9B;CACF;CAEA,UAAmC;EACjC,IAAI,CAAC,KAAK,YACR;EACF,MAAM,KAAK,KAAK,WAAW,cAAc,OAAO;EAChD,IAAI,CAAC,IACH,OAAO,KAAA;EACT,OAAO;CACT;CAEA;CAaA;CAUA;CAqHA;CAkCA;CAiBA,4BAA4B;EAC1B,IAAI,CAAC,KAAKO,sBACR;EACF,MAAM,EAAE,OAAO,UAAU,KAAKA;EAC9B,MAAM,SAAS,KAAKP,gBAAgB;EACpC,IAAI,QAAQ;GACV,OAAO,QAAQ,GAAG,QAAQ,IAAI;GAC9B,OAAO,QAAQ,GAAG,QAAQ,IAAI;EAChC;EACA,KAAKO,uBAAuB;CAC9B;CAEA;CAkEA,SAAS;EACP,MAAM,aAAa,KAAK,WAAW,aAAa,UAAU;EAC1D,IAAI,QAAQ,KAAK;EACjB,IAAI,QAAQ,KAAK;EAEjB,IAAI,KAAK,YACP,QAAQ;OACH,IAAI,MAAM,WAAW,KAAK,MAAM,WAAW,GAChD,QAAQ,QAAQ;OACX,IAAI,MAAM,WAAW,GAC1B,QAAQ;OACH,IAAI,MAAM,WAAW,GAC1B,QAAQ;EAGV,IAAI,KAAK,YACP,QAAQ;EAGV,QAAQ,GAAG,WAAW,GAAG;EACzB,QAAQ,GAAG,WAAW,GAAG;EAEzB,OAAO,IAAI;;oBAEK,MAAM;QAClB,KAAK,aAAa,IAAI,yCAAyC,KAAKY,oBAAoB,WAAW,GAAG;0BACpF,KAAKC,oBAAoB;oBAC/B,MAAM;;CAExB;;EAEgB,KAAA,SAAA,CAAC,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkFnC;;AACH;AAzrBG,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,mBAAA,WAAA,UAAA,KAAA,CAAA;AAGzB,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,mBAAA,WAAA,SAAA,KAAA,CAAA;AAGzB,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,mBAAA,WAAA,SAAA,KAAA,CAAA;AAGzB,WAAA,CAAA,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAA,mBAAA,WAAA,UAAA,KAAA,CAAA;AAG1B,WAAA,CAAA,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAA,mBAAA,WAAA,UAAA,KAAA,CAAA;AAG1B,WAAA,CAAA,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,GAAA,mBAAA,WAAA,eAAA,KAAA,CAAA;AAG1B,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,mBAAA,WAAA,cAAA,KAAA,CAAA;AAGzC,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,mBAAA,WAAA,cAAA,KAAA,CAAA;AAGzC,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,mBAAA,WAAA,YAAA,KAAA,CAAA;AAGzB,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,mBAAA,WAAA,YAAA,KAAA,CAAA;AAGzB,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,mBAAA,WAAA,YAAA,KAAA,CAAA;AAGzB,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,mBAAA,WAAA,YAAA,KAAA,CAAA;AAGzB,WAAA,CAAA,MAAM,CAAA,GAAA,mBAAA,WAAA,cAAA,KAAA,CAAA;AAtCRC,qBAAAA,WAAAA,CAAAA,kBAAc,mBAAmB,CAAA,GAAA,kBAAA"}
package/dist/swipe.d.ts CHANGED
@@ -1,5 +1,5 @@
1
+ import { n as WheelNudgeConsumerType, t as WheelDirection } from "./wheel-nudge-DGrNzWuE.js";
1
2
  import { CSSResultGroup, LitElement, html } from "lit";
2
-
3
3
  //#region src/swipe/swipe.d.ts
4
4
  type SwipeInputDetail = {
5
5
  readonly value: number;
@@ -16,7 +16,8 @@ declare global {
16
16
  'ixfx-swipe': SwipeElement;
17
17
  }
18
18
  }
19
- declare class SwipeElement extends LitElement {
19
+ declare const SwipeElement_base: (new (...args: any[]) => WheelNudgeConsumerType<LitElement>) & typeof LitElement;
20
+ declare class SwipeElement extends SwipeElement_base {
20
21
  #private;
21
22
  barSpacing: number;
22
23
  barWidth: number;
@@ -35,6 +36,15 @@ declare class SwipeElement extends LitElement {
35
36
  private _animStartOffset;
36
37
  private _animStartTime;
37
38
  private _resizeObserver;
39
+ /**
40
+ * Wheel handler — installed by WheelNudgeMixin on the host. Emits `input`
41
+ * synchronously on each tick (matching the user-confirmed "mirror drag"
42
+ * semantic) and schedules the same retraction animation the drag releases
43
+ * with, so the visual resets after a short idle.
44
+ *
45
+ * Step size: 10% of the [-1, 1] value range (= 0.1). Shift halves to 0.05.
46
+ */
47
+ _applyWheelDelta(direction: WheelDirection, event: WheelEvent): void;
38
48
  connectedCallback(): void;
39
49
  disconnectedCallback(): void;
40
50
  private _onPointerDown;
@@ -1 +1 @@
1
- {"version":3,"file":"swipe.d.ts","names":[],"sources":["../src/swipe/swipe.ts"],"mappings":";;;KA4BY,gBAAA;EAAA,SAA8B,KAAK;AAAA;AAAA,KACnC,eAAA,GAAkB,WAAW,CAAC,gBAAA;AAAA,UAEzB,oBAAA;EACf,KAAA,EAAO,eAAe;AAAA;AAAA,UAGP,YAAA;EACf,gBAAA,oBAAoC,oBAAA,EAClC,IAAA,EAAM,CAAA,EACN,QAAA,GAAW,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,oBAAA,CAAqB,CAAA,YAC3D,OAAA,aAAoB,uBAAA,eAEpB,IAAA,UACA,QAAA,EAAU,kCAAA,EACV,OAAA,aAAoB,uBAAA;AAAA;AAAA,QAIhB,MAAA;EAAA,UACI,qBAAA;IACR,YAAA,EAAc,YAAY;EAAA;AAAA;AAAA,cAKjB,YAAA,SAAqB,UAAA;EAAA;EACJ,UAAA;EACA,QAAA;EACA,UAAA;EACA,iBAAA;EAAA,QAEpB,OAAA;EAAA,QACA,SAAA;EAAA,QACA,UAAA;EAAA,QACA,eAAA;EAAA,QACA,WAAA;EAAA,QAEA,OAAA;EAAA,QACA,MAAA;EAAA,QACA,OAAA;EAAA,QAEA,UAAA;EAAA,QACA,cAAA;EAAA,QACA,gBAAA;EAAA,QACA,cAAA;EAAA,QACA,eAAA;EAyCC,iBAAA;EAaA,oBAAA;EAAA,QAUD,cAAA;EAAA,QAcA,cAAA;EAAA,OAoFQ,MAAA,EAAQ,cAAA;EA8Bf,MAAA,IAAU,UAAA,QAAkB,IAAA;AAAA"}
1
+ {"version":3,"file":"swipe.d.ts","names":[],"sources":["../src/swipe/swipe.ts"],"mappings":";;;KAmCY;WAA8B;;KAC9B,kBAAkB,YAAY;UAEzB;EACf,OAAO;;UAGQ;EACf,oBAAoB,gBAAgB,sBAClC,MAAM,GACN,WAAW,MAAM,cAAc,OAAO,qBAAqB,aAC3D,oBAAoB,sCAEpB,cACA,UAAU,oCACV,oBAAoB;;QAIhB;YACI;IACR,cAAc;;;;cAKL,qBAAqB;;EACJ;EACA;EACA;EACA;UAEpB;UACA;UACA;UACA;UACA;UAEA;UACA;UACA;UAEA;UACA;UACA;UACA;UACA;;;;;;;;;EAiDC,iBAAiB,WAAW,gBAAgB,OAAO;EAUnD;EAaA;UAUD;UAcA;SAoFQ,QAAQ;EA8Bf,UAAU,kBAAkB"}
package/dist/swipe.js CHANGED
@@ -1,10 +1,11 @@
1
1
  import { t as themeFallbacks } from "./fallbacks-pNMOMx38.js";
2
- import { n as safeCustomElement, t as __decorate } from "./decorate-DdjvVHS-.js";
2
+ import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
3
3
  import { t as prominenceStyles } from "./prominence-DlFShic3.js";
4
+ import { t as WheelNudgeMixin } from "./wheel-nudge-BlSCe_hD.js";
4
5
  import { LitElement, css, html, svg } from "lit";
5
6
  import { property } from "lit/decorators.js";
6
7
  //#region src/swipe/swipe.ts
7
- let SwipeElement = class SwipeElement extends LitElement {
8
+ let SwipeElement = class SwipeElement extends WheelNudgeMixin(LitElement) {
8
9
  constructor(..._args) {
9
10
  super(..._args);
10
11
  this.barSpacing = 20;
@@ -74,6 +75,23 @@ let SwipeElement = class SwipeElement extends LitElement {
74
75
  composed: true
75
76
  }));
76
77
  }
78
+ /**
79
+ * Wheel handler — installed by WheelNudgeMixin on the host. Emits `input`
80
+ * synchronously on each tick (matching the user-confirmed "mirror drag"
81
+ * semantic) and schedules the same retraction animation the drag releases
82
+ * with, so the visual resets after a short idle.
83
+ *
84
+ * Step size: 10% of the [-1, 1] value range (= 0.1). Shift halves to 0.05.
85
+ */
86
+ _applyWheelDelta(direction, event) {
87
+ this.#cancelAnimation();
88
+ const step = event.shiftKey ? .05 : .1;
89
+ const value = Math.max(-1, Math.min(1, direction * step));
90
+ this.#emitInput(value);
91
+ this._offset = value * this._height * .5;
92
+ this.requestUpdate();
93
+ this.#scheduleRetraction();
94
+ }
77
95
  connectedCallback() {
78
96
  super.connectedCallback();
79
97
  this._resizeObserver = new ResizeObserver((entries) => {
@@ -148,7 +166,8 @@ let SwipeElement = class SwipeElement extends LitElement {
148
166
  const x0 = cx - half;
149
167
  const x1 = cx + half;
150
168
  const colorVar = i % 2 === 0 ? `var(--swipe-color-a, var(--surface-4))` : `var(--swipe-color-b, var(--surface-5))`;
151
- return svg`<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>`;
169
+ const d = `M${x0},0 L${x1},0 L${x1 + off},${mid} L${x1},${h} L${x0},${h} L${x0 + off},${mid}Z`;
170
+ return svg`<path d=${d} style="fill:${colorVar}"></path>`;
152
171
  })}`;
153
172
  }
154
173
  static {
package/dist/swipe.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"swipe.js","names":["#removeWindowListeners","#emitInput","#scheduleRetraction","#cancelAnimation","#onWindowPointerUp","#onWindowPointerCancel","#startRetraction","#renderBars","customElement"],"sources":["../src/swipe/swipe.ts"],"sourcesContent":["/* eslint-disable ts/no-unsafe-declaration-merging */\n/**\n * <ixfx-swipe> — Touch-friendly swipe/nudge component.\n *\n * User taps and drags to generate a value in range [-1, 1].\n * A drag of full component width = ±1. Value is emitted only on pointerup.\n *\n * Properties\n * barSpacing – center-to-center pixel distance between bars (default 20)\n * barWidth – pixel width of each bar (default 14)\n * debounceMs – ms pause after release before retraction begins (default 200)\n * retractDurationMs – ms for the spring-back animation (default 400)\n *\n * CSS custom properties\n * --swipe-color-a – fill for even-indexed bars (default var(--surface-4))\n * --swipe-color-b – fill for odd-indexed bars (default var(--surface-5))\n * --swipe-border-color – border color (default var(--border))\n *\n * Events\n * input – CustomEvent<{ detail: { value: number } }>, bubbles + composed\n */\nimport type { CSSResultGroup } from 'lit';\nimport { css, html, LitElement, svg } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { prominenceStyles } from '../styles/prominence.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\nexport type SwipeInputDetail = { readonly value: number };\nexport type SwipeInputEvent = CustomEvent<SwipeInputDetail>;\n\nexport interface SwipeElementEventMap {\n input: SwipeInputEvent;\n}\n\nexport interface SwipeElement {\n addEventListener: (<K extends keyof SwipeElementEventMap>(\n type: K,\n listener: (this: SwipeElement, event: SwipeElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-swipe': SwipeElement;\n }\n}\n\n@customElement(`ixfx-swipe`)\nexport class SwipeElement extends LitElement {\n @property({ type: Number }) barSpacing = 20;\n @property({ type: Number }) barWidth = 14;\n @property({ type: Number }) debounceMs = 200;\n @property({ type: Number }) retractDurationMs = 400;\n\n private _startX = 0;\n private _currentX = 0;\n private _pointerId: number | null = null;\n private _componentWidth = 0;\n private _isDragging = false;\n\n private _offset = 0;\n private _width = 0;\n private _height = 0;\n\n private _animRafId: number | null = null;\n private _debounceTimer: ReturnType<typeof setTimeout> | null = null;\n private _animStartOffset = 0;\n private _animStartTime: number | null = null;\n private _resizeObserver: ResizeObserver | null = null;\n\n #onWindowPointerUp = (e: PointerEvent): void => {\n if (e.pointerId !== this._pointerId)\n return;\n this.#removeWindowListeners();\n\n const rect = this.getBoundingClientRect();\n const inside = e.clientX >= rect.left && e.clientX <= rect.right\n && e.clientY >= rect.top && e.clientY <= rect.bottom;\n\n if (inside) {\n const deltaX = this._currentX - this._startX;\n const value = Math.max(-1, Math.min(1, deltaX / this._componentWidth));\n this.#emitInput(value);\n }\n\n this._isDragging = false;\n this._pointerId = null;\n this.#scheduleRetraction();\n };\n\n #onWindowPointerCancel = (e: PointerEvent): void => {\n if (e.pointerId !== this._pointerId)\n return;\n this.#removeWindowListeners();\n this._isDragging = false;\n this._pointerId = null;\n this.#scheduleRetraction();\n };\n\n #emitInput(value: number): void {\n this.dispatchEvent(\n new CustomEvent<SwipeInputDetail>(`input`, {\n detail: { value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._resizeObserver = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (!entry)\n return;\n this._width = entry.contentRect.width;\n this._height = entry.contentRect.height;\n this.requestUpdate();\n });\n this._resizeObserver.observe(this);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._resizeObserver?.disconnect();\n this._resizeObserver = null;\n this.#cancelAnimation();\n this.#removeWindowListeners();\n this._isDragging = false;\n this._pointerId = null;\n }\n\n private _onPointerDown = (e: PointerEvent): void => {\n e.preventDefault();\n this.#cancelAnimation();\n const target = e.target as HTMLElement;\n target.setPointerCapture(e.pointerId);\n this._pointerId = e.pointerId;\n this._startX = e.clientX;\n this._currentX = e.clientX;\n this._componentWidth = this.getBoundingClientRect().width;\n this._isDragging = true;\n window.addEventListener(`pointerup`, this.#onWindowPointerUp);\n window.addEventListener(`pointercancel`, this.#onWindowPointerCancel);\n };\n\n private _onPointerMove = (e: PointerEvent): void => {\n if (!this._isDragging || e.pointerId !== this._pointerId)\n return;\n this._currentX = e.clientX;\n const deltaX = this._currentX - this._startX;\n const ratio = Math.max(-1, Math.min(1, deltaX / this._componentWidth));\n this._offset = ratio * this._height * 0.5;\n this.requestUpdate();\n };\n\n #removeWindowListeners(): void {\n window.removeEventListener(`pointerup`, this.#onWindowPointerUp);\n window.removeEventListener(`pointercancel`, this.#onWindowPointerCancel);\n }\n\n #scheduleRetraction(): void {\n if (this._debounceTimer !== null)\n clearTimeout(this._debounceTimer);\n this._debounceTimer = setTimeout(() => {\n this._debounceTimer = null;\n this.#startRetraction();\n }, this.debounceMs);\n }\n\n #startRetraction(): void {\n this._animStartOffset = this._offset;\n this._animStartTime = null;\n\n const animate = (time: number): void => {\n if (this._animStartTime === null)\n this._animStartTime = time;\n const elapsed = time - this._animStartTime;\n const t = Math.min(elapsed / this.retractDurationMs, 1);\n const eased = 1 - (1 - t) ** 3;\n this._offset = this._animStartOffset * (1 - eased);\n this.requestUpdate();\n\n if (t < 1) {\n this._animRafId = requestAnimationFrame(animate);\n } else {\n this._offset = 0;\n this._animRafId = null;\n this.requestUpdate();\n }\n };\n\n this._animRafId = requestAnimationFrame(animate);\n }\n\n #cancelAnimation(): void {\n if (this._animRafId !== null) {\n cancelAnimationFrame(this._animRafId);\n this._animRafId = null;\n }\n if (this._debounceTimer !== null) {\n clearTimeout(this._debounceTimer);\n this._debounceTimer = null;\n }\n }\n\n #renderBars(): ReturnType<typeof svg> {\n const w = this._width;\n const h = this._height;\n const off = this._offset;\n const { barSpacing, barWidth } = this;\n if (w === 0 || h === 0)\n return svg``;\n\n const half = barWidth / 2;\n const mid = h / 2;\n const count = Math.ceil(w / barSpacing) + 1;\n\n return svg`${Array.from({ length: count }, (_, i) => {\n const cx = i * barSpacing;\n const x0 = cx - half;\n const x1 = cx + half;\n const colorVar = i % 2 === 0\n ? `var(--swipe-color-a, var(--surface-4))`\n : `var(--swipe-color-b, var(--surface-5))`;\n const d = `M${x0},0 L${x1},0 L${x1 + off},${mid} L${x1},${h} L${x0},${h} L${x0 + off},${mid}Z`;\n return svg`<path d=${d} style=\"fill:${colorVar}\"></path>`;\n })}`;\n }\n\n static override styles: CSSResultGroup = [themeFallbacks, prominenceStyles, css`\n :host {\n display: block;\n user-select: none;\n touch-action: none;\n width: 100%;\n height: 2.5rem;\n --swipe-border-color: var(--border);\n }\n\n .swipe-area {\n position: relative;\n width: 100%;\n height: 100%;\n cursor: grab;\n border: var(--swipe-border-color);\n overflow: hidden;\n }\n\n .swipe-area:active {\n cursor: grabbing;\n }\n\n svg {\n display: block;\n width: 100%;\n height: 100%;\n }\n `];\n\n override render(): ReturnType<typeof html> {\n return html`\n <div\n class=\"swipe-area\"\n @pointerdown=${this._onPointerDown}\n @pointermove=${this._onPointerMove}\n >\n <svg aria-hidden=\"true\">${this.#renderBars()}</svg>\n </div>\n `;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"swipe.js","names":["#removeWindowListeners","#emitInput","#scheduleRetraction","#cancelAnimation","#onWindowPointerUp","#onWindowPointerCancel","#startRetraction","#renderBars","customElement"],"sources":["../src/swipe/swipe.ts"],"sourcesContent":["/* eslint-disable ts/no-unsafe-declaration-merging */\n/**\n * <ixfx-swipe> — Touch-friendly swipe/nudge component.\n *\n * User taps and drags to generate a value in range [-1, 1].\n * A drag of full component width = ±1. Value is emitted only on pointerup.\n *\n * Properties\n * barSpacing – center-to-center pixel distance between bars (default 20)\n * barWidth – pixel width of each bar (default 14)\n * debounceMs – ms pause after release before retraction begins (default 200)\n * retractDurationMs – ms for the spring-back animation (default 400)\n * lighttouch – boolean — wheel adjusts the value on hover instead of requiring focus\n *\n * Mouse wheel: up = +0.1, down = -0.1; Shift halves to ±0.05. Each tick fires\n * `input` and triggers the same retraction animation as a drag release. See\n * `docs/infra-mousewheel.md`.\n *\n * CSS custom properties\n * --swipe-color-a – fill for even-indexed bars (default var(--surface-4))\n * --swipe-color-b – fill for odd-indexed bars (default var(--surface-5))\n * --swipe-border-color – border color (default var(--border))\n *\n * Events\n * input – CustomEvent<{ detail: { value: number } }>, bubbles + composed\n */\nimport type { CSSResultGroup } from 'lit';\nimport type { WheelDirection } from '../mixins/wheel-nudge.js';\nimport { css, html, LitElement, svg } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { WheelNudgeMixin } from '../mixins/wheel-nudge.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { prominenceStyles } from '../styles/prominence.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\nexport type SwipeInputDetail = { readonly value: number };\nexport type SwipeInputEvent = CustomEvent<SwipeInputDetail>;\n\nexport interface SwipeElementEventMap {\n input: SwipeInputEvent;\n}\n\nexport interface SwipeElement {\n addEventListener: (<K extends keyof SwipeElementEventMap>(\n type: K,\n listener: (this: SwipeElement, event: SwipeElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-swipe': SwipeElement;\n }\n}\n\n@customElement(`ixfx-swipe`)\nexport class SwipeElement extends WheelNudgeMixin(LitElement) {\n @property({ type: Number }) barSpacing = 20;\n @property({ type: Number }) barWidth = 14;\n @property({ type: Number }) debounceMs = 200;\n @property({ type: Number }) retractDurationMs = 400;\n\n private _startX = 0;\n private _currentX = 0;\n private _pointerId: number | null = null;\n private _componentWidth = 0;\n private _isDragging = false;\n\n private _offset = 0;\n private _width = 0;\n private _height = 0;\n\n private _animRafId: number | null = null;\n private _debounceTimer: ReturnType<typeof setTimeout> | null = null;\n private _animStartOffset = 0;\n private _animStartTime: number | null = null;\n private _resizeObserver: ResizeObserver | null = null;\n\n #onWindowPointerUp = (e: PointerEvent): void => {\n if (e.pointerId !== this._pointerId)\n return;\n this.#removeWindowListeners();\n\n const rect = this.getBoundingClientRect();\n const inside = e.clientX >= rect.left && e.clientX <= rect.right\n && e.clientY >= rect.top && e.clientY <= rect.bottom;\n\n if (inside) {\n const deltaX = this._currentX - this._startX;\n const value = Math.max(-1, Math.min(1, deltaX / this._componentWidth));\n this.#emitInput(value);\n }\n\n this._isDragging = false;\n this._pointerId = null;\n this.#scheduleRetraction();\n };\n\n #onWindowPointerCancel = (e: PointerEvent): void => {\n if (e.pointerId !== this._pointerId)\n return;\n this.#removeWindowListeners();\n this._isDragging = false;\n this._pointerId = null;\n this.#scheduleRetraction();\n };\n\n #emitInput(value: number): void {\n this.dispatchEvent(\n new CustomEvent<SwipeInputDetail>(`input`, {\n detail: { value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n /**\n * Wheel handler — installed by WheelNudgeMixin on the host. Emits `input`\n * synchronously on each tick (matching the user-confirmed \"mirror drag\"\n * semantic) and schedules the same retraction animation the drag releases\n * with, so the visual resets after a short idle.\n *\n * Step size: 10% of the [-1, 1] value range (= 0.1). Shift halves to 0.05.\n */\n override _applyWheelDelta(direction: WheelDirection, event: WheelEvent): void {\n this.#cancelAnimation();\n const step = event.shiftKey ? 0.05 : 0.1;\n const value = Math.max(-1, Math.min(1, direction * step));\n this.#emitInput(value);\n this._offset = value * this._height * 0.5;\n this.requestUpdate();\n this.#scheduleRetraction();\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._resizeObserver = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (!entry)\n return;\n this._width = entry.contentRect.width;\n this._height = entry.contentRect.height;\n this.requestUpdate();\n });\n this._resizeObserver.observe(this);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._resizeObserver?.disconnect();\n this._resizeObserver = null;\n this.#cancelAnimation();\n this.#removeWindowListeners();\n this._isDragging = false;\n this._pointerId = null;\n }\n\n private _onPointerDown = (e: PointerEvent): void => {\n e.preventDefault();\n this.#cancelAnimation();\n const target = e.target as HTMLElement;\n target.setPointerCapture(e.pointerId);\n this._pointerId = e.pointerId;\n this._startX = e.clientX;\n this._currentX = e.clientX;\n this._componentWidth = this.getBoundingClientRect().width;\n this._isDragging = true;\n window.addEventListener(`pointerup`, this.#onWindowPointerUp);\n window.addEventListener(`pointercancel`, this.#onWindowPointerCancel);\n };\n\n private _onPointerMove = (e: PointerEvent): void => {\n if (!this._isDragging || e.pointerId !== this._pointerId)\n return;\n this._currentX = e.clientX;\n const deltaX = this._currentX - this._startX;\n const ratio = Math.max(-1, Math.min(1, deltaX / this._componentWidth));\n this._offset = ratio * this._height * 0.5;\n this.requestUpdate();\n };\n\n #removeWindowListeners(): void {\n window.removeEventListener(`pointerup`, this.#onWindowPointerUp);\n window.removeEventListener(`pointercancel`, this.#onWindowPointerCancel);\n }\n\n #scheduleRetraction(): void {\n if (this._debounceTimer !== null)\n clearTimeout(this._debounceTimer);\n this._debounceTimer = setTimeout(() => {\n this._debounceTimer = null;\n this.#startRetraction();\n }, this.debounceMs);\n }\n\n #startRetraction(): void {\n this._animStartOffset = this._offset;\n this._animStartTime = null;\n\n const animate = (time: number): void => {\n if (this._animStartTime === null)\n this._animStartTime = time;\n const elapsed = time - this._animStartTime;\n const t = Math.min(elapsed / this.retractDurationMs, 1);\n const eased = 1 - (1 - t) ** 3;\n this._offset = this._animStartOffset * (1 - eased);\n this.requestUpdate();\n\n if (t < 1) {\n this._animRafId = requestAnimationFrame(animate);\n } else {\n this._offset = 0;\n this._animRafId = null;\n this.requestUpdate();\n }\n };\n\n this._animRafId = requestAnimationFrame(animate);\n }\n\n #cancelAnimation(): void {\n if (this._animRafId !== null) {\n cancelAnimationFrame(this._animRafId);\n this._animRafId = null;\n }\n if (this._debounceTimer !== null) {\n clearTimeout(this._debounceTimer);\n this._debounceTimer = null;\n }\n }\n\n #renderBars(): ReturnType<typeof svg> {\n const w = this._width;\n const h = this._height;\n const off = this._offset;\n const { barSpacing, barWidth } = this;\n if (w === 0 || h === 0)\n return svg``;\n\n const half = barWidth / 2;\n const mid = h / 2;\n const count = Math.ceil(w / barSpacing) + 1;\n\n return svg`${Array.from({ length: count }, (_, i) => {\n const cx = i * barSpacing;\n const x0 = cx - half;\n const x1 = cx + half;\n const colorVar = i % 2 === 0\n ? `var(--swipe-color-a, var(--surface-4))`\n : `var(--swipe-color-b, var(--surface-5))`;\n const d = `M${x0},0 L${x1},0 L${x1 + off},${mid} L${x1},${h} L${x0},${h} L${x0 + off},${mid}Z`;\n return svg`<path d=${d} style=\"fill:${colorVar}\"></path>`;\n })}`;\n }\n\n static override styles: CSSResultGroup = [themeFallbacks, prominenceStyles, css`\n :host {\n display: block;\n user-select: none;\n touch-action: none;\n width: 100%;\n height: 2.5rem;\n --swipe-border-color: var(--border);\n }\n\n .swipe-area {\n position: relative;\n width: 100%;\n height: 100%;\n cursor: grab;\n border: var(--swipe-border-color);\n overflow: hidden;\n }\n\n .swipe-area:active {\n cursor: grabbing;\n }\n\n svg {\n display: block;\n width: 100%;\n height: 100%;\n }\n `];\n\n override render(): ReturnType<typeof html> {\n return html`\n <div\n class=\"swipe-area\"\n @pointerdown=${this._onPointerDown}\n @pointermove=${this._onPointerMove}\n >\n <svg aria-hidden=\"true\">${this.#renderBars()}</svg>\n </div>\n `;\n }\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
+ import "./icon-DpA9x2Ve.js";
1
2
  import { LitElement, PropertyValues } from "lit";
2
3
  import { CommandRegistry } from "@clinth/ui-commands";
3
-
4
4
  //#region src/tabs/tab-list-item.d.ts
5
5
  /**
6
6
  * CSS vars (can be overridden per-instance):
@@ -30,12 +30,13 @@ declare global {
30
30
  interface HTMLElementTagNameMap {
31
31
  "ixfx-tab-list-item": TabListItemElement;
32
32
  }
33
- } //# sourceMappingURL=tab-list-item.d.ts.map
33
+ }
34
34
  //#endregion
35
35
  //#region src/tabs/tab-list.d.ts
36
36
  /**
37
37
  * Events
38
38
  * 'change' - new tab selected { previous:string, selected:string, for:string }
39
+ * 'reorder' - tab moved within the list { id:string, fromIndex:number, toIndex:number }
39
40
  */
40
41
  type TabListChangeDetail = {
41
42
  readonly previous: string | undefined;
@@ -43,11 +44,19 @@ type TabListChangeDetail = {
43
44
  readonly for: string;
44
45
  };
45
46
  type TabListChangeEvent = CustomEvent<TabListChangeDetail>;
47
+ type TabListReorderDetail = {
48
+ readonly id: string;
49
+ readonly fromIndex: number;
50
+ readonly toIndex: number;
51
+ };
52
+ type TabListReorderEvent = CustomEvent<TabListReorderDetail>;
53
+ type TabListDragMode = `off` | `reorder`;
46
54
  declare class TabListElement extends LitElement {
47
55
  #private;
48
56
  orientation: `horizontal` | `vertical-stack` | `vertical-side`;
49
57
  flip: boolean;
50
58
  scrollable: boolean;
59
+ dragMode: TabListDragMode;
51
60
  render(): import("lit").TemplateResult<1>;
52
61
  firstUpdated(): void;
53
62
  updated(changedProperties: PropertyValues): void;
@@ -59,7 +68,7 @@ declare global {
59
68
  interface HTMLElementTagNameMap {
60
69
  "ixfx-tab-list": TabListElement;
61
70
  }
62
- } //# sourceMappingURL=tab-list.d.ts.map
71
+ }
63
72
  //#endregion
64
- export { TabListItemElement as i, TabListChangeEvent as n, TabListElement as r, TabListChangeDetail as t };
65
- //# sourceMappingURL=tab-list-DLzb-m-I.d.ts.map
73
+ export { TabListReorderDetail as a, TabListElement as i, TabListChangeEvent as n, TabListReorderEvent as o, TabListDragMode as r, TabListItemElement as s, TabListChangeDetail as t };
74
+ //# sourceMappingURL=tab-list-BohmbvqF.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tab-list-BohmbvqF.d.ts","names":[],"sources":["../src/tabs/tab-list-item.ts","../src/tabs/tab-list.ts"],"mappings":";;;;;;;;;;cAgBa,2BAA2B;EAEtC;EAGA;EAGA;EAGA;EAGA,UAAU;UAEO;UACT;UACA;EAEC;EAQA;EAQA,QAAQ,SAAS;UAQlB;UAUA;EAWC,wBAAM;UAyBP;SAWQ,sBAAM;;QAwGhB;YACI;IACR,sBAAsB;;;;;;;;;;KCjNd;WACD;WACA;WACA;;KAGC,qBAAqB,YAAY;KAEjC;WACD;WACA;WACA;;KAGC,sBAAsB,YAAY;KAElC;cAMC,uBAAuB;;EAElC;EAGA;EAGA;EAGA,UAAU;EA2BD,wBAAM;EA4BN;EAQA,QAAQ,mBAAmB;EA8FpC,sBAAkB;EAwBlB,cAAc,IAAI;SAwaX,sBAAM;;QA2FP;YACI;IACR,iBAAiB"}