@weasel-js/ui 1.1.0 → 1.3.0-pre.0

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 (237) hide show
  1. package/dist/chunks/{ActionBar-BvPEd_GW.js → ActionBar-BTev_ZZl.js} +21 -21
  2. package/dist/chunks/ActionBar-BTev_ZZl.js.map +1 -0
  3. package/dist/chunks/{ActionsBar-9aR5N3lU.js → ActionsBar-gTuCtkv8.js} +4 -4
  4. package/dist/chunks/{ActionsBar-9aR5N3lU.js.map → ActionsBar-gTuCtkv8.js.map} +1 -1
  5. package/dist/chunks/{Badge-DZQqAV4d.js → Badge-9dPfvYOk.js} +715 -707
  6. package/dist/chunks/Badge-9dPfvYOk.js.map +1 -0
  7. package/dist/chunks/{BandEditor-D3i6l299.js → BandEditor-DKbcHG2_.js} +46 -46
  8. package/dist/chunks/BandEditor-DKbcHG2_.js.map +1 -0
  9. package/dist/chunks/{Button-9QNIYugK.js → Button-CIu40Epu.js} +28 -28
  10. package/dist/chunks/Button-CIu40Epu.js.map +1 -0
  11. package/dist/chunks/{Callout-NSOjza6G.js → Callout-CHs98djt.js} +40 -39
  12. package/dist/chunks/Callout-CHs98djt.js.map +1 -0
  13. package/dist/chunks/Checkbox-BLEw-wEb.js +47 -0
  14. package/dist/chunks/Checkbox-BLEw-wEb.js.map +1 -0
  15. package/dist/chunks/ColorField-D1t-BdSa.js +60 -0
  16. package/dist/chunks/ColorField-D1t-BdSa.js.map +1 -0
  17. package/dist/chunks/{ComboBox-ONQISwtI.js → ComboBox-cvdKolWv.js} +28 -28
  18. package/dist/chunks/ComboBox-cvdKolWv.js.map +1 -0
  19. package/dist/chunks/{CurveEditor-SmwwvrsA.js → CurveEditor-BaA-PabB.js} +116 -116
  20. package/dist/chunks/CurveEditor-BaA-PabB.js.map +1 -0
  21. package/dist/chunks/DataGrid-D15I779H.js +210 -0
  22. package/dist/chunks/DataGrid-D15I779H.js.map +1 -0
  23. package/dist/chunks/Dialog-DC1x46Sq.js +59 -0
  24. package/dist/chunks/Dialog-DC1x46Sq.js.map +1 -0
  25. package/dist/chunks/{Field-VQwmrIna.js → Field-BjFl_yng.js} +6 -6
  26. package/dist/chunks/Field-BjFl_yng.js.map +1 -0
  27. package/dist/chunks/GradientEditor-BJRD0n1g.js +308 -0
  28. package/dist/chunks/GradientEditor-BJRD0n1g.js.map +1 -0
  29. package/dist/chunks/InlineRange-C6UYKxLD.js +24 -0
  30. package/dist/chunks/InlineRange-C6UYKxLD.js.map +1 -0
  31. package/dist/chunks/Input-DhWBgpRx.js +55 -0
  32. package/dist/chunks/Input-DhWBgpRx.js.map +1 -0
  33. package/dist/chunks/{Keycaps-CFX7UAj8.js → Keycaps-BhCKdyws.js} +15 -15
  34. package/dist/chunks/Keycaps-BhCKdyws.js.map +1 -0
  35. package/dist/chunks/NumberField-ZdVa4bpJ.js +59 -0
  36. package/dist/chunks/NumberField-ZdVa4bpJ.js.map +1 -0
  37. package/dist/chunks/{OptionsBar-CHvH4n4u.js → OptionsBar-DahCI4Aq.js} +4 -4
  38. package/dist/chunks/{OptionsBar-CHvH4n4u.js.map → OptionsBar-DahCI4Aq.js.map} +1 -1
  39. package/dist/chunks/PaintInput-Cggm9OIl.js +205 -0
  40. package/dist/chunks/PaintInput-Cggm9OIl.js.map +1 -0
  41. package/dist/chunks/PatternPicker-B63SlDoF.js +93 -0
  42. package/dist/chunks/PatternPicker-B63SlDoF.js.map +1 -0
  43. package/dist/chunks/{Plot2D-CEnhzodm.js → Plot2D-sPXTw_-l.js} +27 -27
  44. package/dist/chunks/{Plot2D-CEnhzodm.js.map → Plot2D-sPXTw_-l.js.map} +1 -1
  45. package/dist/chunks/{PointPlotter-BUIse9c4.js → PointPlotter-CLd9u5Bq.js} +2 -2
  46. package/dist/chunks/{PointPlotter-BUIse9c4.js.map → PointPlotter-CLd9u5Bq.js.map} +1 -1
  47. package/dist/chunks/{Powerline-Dd9Ukhcl.js → Powerline-DhQJYaUg.js} +2 -2
  48. package/dist/chunks/{Powerline-Dd9Ukhcl.js.map → Powerline-DhQJYaUg.js.map} +1 -1
  49. package/dist/chunks/Prefs-BSJ0lMmJ.js +300 -0
  50. package/dist/chunks/Prefs-BSJ0lMmJ.js.map +1 -0
  51. package/dist/chunks/RadioGroup-vtwjRiUm.js +49 -0
  52. package/dist/chunks/RadioGroup-vtwjRiUm.js.map +1 -0
  53. package/dist/chunks/RangeSlider-B-n_7AgJ.js +52 -0
  54. package/dist/chunks/RangeSlider-B-n_7AgJ.js.map +1 -0
  55. package/dist/chunks/{ResizeHandle-BOpmtOOj.js → ResizeHandle--ZExnMfa.js} +8 -8
  56. package/dist/chunks/{ResizeHandle-BOpmtOOj.js.map → ResizeHandle--ZExnMfa.js.map} +1 -1
  57. package/dist/chunks/{Select-CHsuQCp0.js → Select--BVTi-j0.js} +32 -32
  58. package/dist/chunks/Select--BVTi-j0.js.map +1 -0
  59. package/dist/chunks/SelectionPanel-C7kygTFE.js +446 -0
  60. package/dist/chunks/SelectionPanel-C7kygTFE.js.map +1 -0
  61. package/dist/chunks/{Sidebar-DP_nyJze.js → Sidebar-CtwBdr4n.js} +1 -1
  62. package/dist/chunks/{Sidebar-DP_nyJze.js.map → Sidebar-CtwBdr4n.js.map} +1 -1
  63. package/dist/chunks/SidebarPanel-AeSc7wNR.js +59 -0
  64. package/dist/chunks/SidebarPanel-AeSc7wNR.js.map +1 -0
  65. package/dist/chunks/{Slider-tGbqoAZH.js → Slider-cxWR47gi.js} +39 -39
  66. package/dist/chunks/Slider-cxWR47gi.js.map +1 -0
  67. package/dist/chunks/{StatusBar-DBO0E0Yd.js → StatusBar-D_wu-SZh.js} +6 -6
  68. package/dist/chunks/StatusBar-D_wu-SZh.js.map +1 -0
  69. package/dist/chunks/Switch-CtZwp5zm.js +27 -0
  70. package/dist/chunks/Switch-CtZwp5zm.js.map +1 -0
  71. package/dist/chunks/Tabs-lB0IB4TX.js +41 -0
  72. package/dist/chunks/Tabs-lB0IB4TX.js.map +1 -0
  73. package/dist/chunks/{Toast-DFw4IrD_.js → Toast-hr9BYsho.js} +31 -31
  74. package/dist/chunks/{Toast-DFw4IrD_.js.map → Toast-hr9BYsho.js.map} +1 -1
  75. package/dist/chunks/{ToggleBar-BP1zFcvg.js → ToggleBar-BxgWq-wO.js} +11 -10
  76. package/dist/chunks/ToggleBar-BxgWq-wO.js.map +1 -0
  77. package/dist/chunks/{ToolButton-ClPz5L6j.js → ToolButton-CJrPjbsj.js} +16 -16
  78. package/dist/chunks/ToolButton-CJrPjbsj.js.map +1 -0
  79. package/dist/chunks/{ToolGroup-BTIwd4U4.js → ToolGroup-D_lDzkvU.js} +1 -1
  80. package/dist/chunks/{ToolGroup-BTIwd4U4.js.map → ToolGroup-D_lDzkvU.js.map} +1 -1
  81. package/dist/chunks/{ToolOptionsBar-JvmY7iNe.js → ToolOptionsBar-BA6Sb3U2.js} +4 -4
  82. package/dist/chunks/ToolOptionsBar-BA6Sb3U2.js.map +1 -0
  83. package/dist/chunks/{ToolPalette-DAiVhdtV.js → ToolPalette-TMvkaJwr.js} +24 -24
  84. package/dist/chunks/ToolPalette-TMvkaJwr.js.map +1 -0
  85. package/dist/chunks/Tooltip-Di7vxbFa.js +40 -0
  86. package/dist/chunks/Tooltip-Di7vxbFa.js.map +1 -0
  87. package/dist/chunks/{keyGlyph-BDH5fqkO.js → keyGlyph-DNpLxF8u.js} +1 -1
  88. package/dist/chunks/{keyGlyph-BDH5fqkO.js.map → keyGlyph-DNpLxF8u.js.map} +1 -1
  89. package/dist/chunks/segmentedControl.module-D4b7x19O.js +11 -0
  90. package/dist/chunks/segmentedControl.module-D4b7x19O.js.map +1 -0
  91. package/dist/chunks/{useRovingTabIndex-DBZtq4IH.js → useRovingTabIndex-CQz8EiKh.js} +1 -1
  92. package/dist/chunks/{useRovingTabIndex-DBZtq4IH.js.map → useRovingTabIndex-CQz8EiKh.js.map} +1 -1
  93. package/dist/components/ActionBar/index.js +1 -1
  94. package/dist/components/ActionsBar/index.js +1 -1
  95. package/dist/components/Badge/Badge.d.ts.map +1 -1
  96. package/dist/components/Badge/bases/index.d.ts.map +1 -1
  97. package/dist/components/Badge/effects/index.d.ts.map +1 -1
  98. package/dist/components/Badge/index.js +1 -1
  99. package/dist/components/Badge/shapes/index.d.ts.map +1 -1
  100. package/dist/components/BandEditor/index.js +1 -1
  101. package/dist/components/Button/index.js +1 -1
  102. package/dist/components/Callout/Callout.d.ts.map +1 -1
  103. package/dist/components/Callout/index.js +1 -1
  104. package/dist/components/Checkbox/Checkbox.d.ts +1 -1
  105. package/dist/components/Checkbox/index.js +1 -1
  106. package/dist/components/ColorField/ColorField.d.ts.map +1 -1
  107. package/dist/components/ColorField/index.js +1 -1
  108. package/dist/components/ComboBox/index.js +1 -1
  109. package/dist/components/CurveEditor/LayeredCurveEditor.d.ts +1 -1
  110. package/dist/components/CurveEditor/LayeredCurveEditor.d.ts.map +1 -1
  111. package/dist/components/CurveEditor/createFunctionLayer.d.ts +1 -2
  112. package/dist/components/CurveEditor/createFunctionLayer.d.ts.map +1 -1
  113. package/dist/components/CurveEditor/index.js +1 -1
  114. package/dist/components/DataGrid/index.js +1 -1
  115. package/dist/components/Dialog/index.js +1 -1
  116. package/dist/components/Field/index.js +1 -1
  117. package/dist/components/GradientEditor/SceneGradientHandles.d.ts +41 -0
  118. package/dist/components/GradientEditor/SceneGradientHandles.d.ts.map +1 -0
  119. package/dist/components/GradientEditor/index.d.ts +1 -0
  120. package/dist/components/GradientEditor/index.d.ts.map +1 -1
  121. package/dist/components/GradientEditor/index.js +2 -2
  122. package/dist/components/InlineRange/InlineRange.d.ts +17 -0
  123. package/dist/components/InlineRange/InlineRange.d.ts.map +1 -0
  124. package/dist/components/InlineRange/index.d.ts +2 -0
  125. package/dist/components/InlineRange/index.d.ts.map +1 -0
  126. package/dist/components/InlineRange/index.js +2 -0
  127. package/dist/components/Input/Input.d.ts +1 -1
  128. package/dist/components/Input/index.js +1 -1
  129. package/dist/components/Keycaps/index.js +2 -2
  130. package/dist/components/NumberField/NumberField.d.ts +1 -1
  131. package/dist/components/NumberField/index.js +1 -1
  132. package/dist/components/OptionsBar/index.js +1 -1
  133. package/dist/components/PaintInput/PaintInput.d.ts +40 -0
  134. package/dist/components/PaintInput/PaintInput.d.ts.map +1 -0
  135. package/dist/components/PaintInput/index.d.ts +2 -0
  136. package/dist/components/PaintInput/index.d.ts.map +1 -0
  137. package/dist/components/PaintInput/index.js +2 -0
  138. package/dist/components/PatternPicker/PatternPicker.d.ts +31 -0
  139. package/dist/components/PatternPicker/PatternPicker.d.ts.map +1 -0
  140. package/dist/components/PatternPicker/index.d.ts +2 -0
  141. package/dist/components/PatternPicker/index.d.ts.map +1 -0
  142. package/dist/components/PatternPicker/index.js +2 -0
  143. package/dist/components/Plot2D/Plot2D.d.ts.map +1 -1
  144. package/dist/components/Plot2D/index.js +1 -1
  145. package/dist/components/PointPlotter/index.js +1 -1
  146. package/dist/components/Powerline/index.js +2 -2
  147. package/dist/components/Prefs/PrefsForm.d.ts.map +1 -1
  148. package/dist/components/Prefs/index.d.ts +1 -1
  149. package/dist/components/Prefs/index.d.ts.map +1 -1
  150. package/dist/components/Prefs/index.js +1 -1
  151. package/dist/components/Prefs/schema.d.ts +4 -93
  152. package/dist/components/Prefs/schema.d.ts.map +1 -1
  153. package/dist/components/RadioGroup/index.js +1 -1
  154. package/dist/components/RangeSlider/index.js +1 -1
  155. package/dist/components/ResizeHandle/index.js +1 -1
  156. package/dist/components/Select/index.js +1 -1
  157. package/dist/components/SelectionPanel/SelectionPanel.d.ts +32 -1
  158. package/dist/components/SelectionPanel/SelectionPanel.d.ts.map +1 -1
  159. package/dist/components/SelectionPanel/index.js +1 -1
  160. package/dist/components/Sidebar/index.js +1 -1
  161. package/dist/components/SidebarPanel/index.js +1 -1
  162. package/dist/components/Slider/index.js +1 -1
  163. package/dist/components/StatusBar/index.js +1 -1
  164. package/dist/components/Switch/Switch.d.ts +1 -1
  165. package/dist/components/Switch/index.js +1 -1
  166. package/dist/components/Tabs/index.js +1 -1
  167. package/dist/components/Toast/index.js +1 -1
  168. package/dist/components/ToggleBar/ToggleBar.d.ts +1 -1
  169. package/dist/components/ToggleBar/ToggleBar.d.ts.map +1 -1
  170. package/dist/components/ToggleBar/index.js +1 -1
  171. package/dist/components/ToolButton/index.js +1 -1
  172. package/dist/components/ToolGroup/index.js +1 -1
  173. package/dist/components/ToolOptionsBar/index.js +1 -1
  174. package/dist/components/ToolPalette/index.js +1 -1
  175. package/dist/components/Tooltip/index.js +1 -1
  176. package/dist/components/paintValue.d.ts +8 -0
  177. package/dist/components/paintValue.d.ts.map +1 -0
  178. package/dist/icons/Icon.d.ts +17 -0
  179. package/dist/icons/Icon.d.ts.map +1 -0
  180. package/dist/icons/index.d.ts +50 -0
  181. package/dist/icons/index.d.ts.map +1 -0
  182. package/dist/icons/paths.d.ts +71 -0
  183. package/dist/icons/paths.d.ts.map +1 -0
  184. package/dist/index.d.ts +5 -0
  185. package/dist/index.d.ts.map +1 -1
  186. package/dist/index.js +184 -48
  187. package/dist/index.js.map +1 -1
  188. package/dist/style.css +1 -1
  189. package/package.json +4 -3
  190. package/dist/chunks/ActionBar-BvPEd_GW.js.map +0 -1
  191. package/dist/chunks/Badge-DZQqAV4d.js.map +0 -1
  192. package/dist/chunks/BandEditor-D3i6l299.js.map +0 -1
  193. package/dist/chunks/Button-9QNIYugK.js.map +0 -1
  194. package/dist/chunks/Callout-NSOjza6G.js.map +0 -1
  195. package/dist/chunks/Checkbox-KQ5L8APP.js +0 -47
  196. package/dist/chunks/Checkbox-KQ5L8APP.js.map +0 -1
  197. package/dist/chunks/ColorField-ykpiD3XU.js +0 -60
  198. package/dist/chunks/ColorField-ykpiD3XU.js.map +0 -1
  199. package/dist/chunks/ComboBox-ONQISwtI.js.map +0 -1
  200. package/dist/chunks/CurveEditor-SmwwvrsA.js.map +0 -1
  201. package/dist/chunks/DataGrid-DZQ4Chbd.js +0 -210
  202. package/dist/chunks/DataGrid-DZQ4Chbd.js.map +0 -1
  203. package/dist/chunks/Dialog-CqwdJv_t.js +0 -59
  204. package/dist/chunks/Dialog-CqwdJv_t.js.map +0 -1
  205. package/dist/chunks/Field-VQwmrIna.js.map +0 -1
  206. package/dist/chunks/GradientEditor-Bg6SX64V.js +0 -280
  207. package/dist/chunks/GradientEditor-Bg6SX64V.js.map +0 -1
  208. package/dist/chunks/Input-DpkwYtUY.js +0 -55
  209. package/dist/chunks/Input-DpkwYtUY.js.map +0 -1
  210. package/dist/chunks/Keycaps-CFX7UAj8.js.map +0 -1
  211. package/dist/chunks/NumberField-BbzI0GtU.js +0 -59
  212. package/dist/chunks/NumberField-BbzI0GtU.js.map +0 -1
  213. package/dist/chunks/Prefs-BMR9wMiZ.js +0 -238
  214. package/dist/chunks/Prefs-BMR9wMiZ.js.map +0 -1
  215. package/dist/chunks/RadioGroup-CIpHr3g6.js +0 -49
  216. package/dist/chunks/RadioGroup-CIpHr3g6.js.map +0 -1
  217. package/dist/chunks/RangeSlider-CaDogGTj.js +0 -52
  218. package/dist/chunks/RangeSlider-CaDogGTj.js.map +0 -1
  219. package/dist/chunks/Select-CHsuQCp0.js.map +0 -1
  220. package/dist/chunks/SelectionPanel-D_wk_8ZN.js +0 -303
  221. package/dist/chunks/SelectionPanel-D_wk_8ZN.js.map +0 -1
  222. package/dist/chunks/SidebarPanel-BVTQ1ZyM.js +0 -59
  223. package/dist/chunks/SidebarPanel-BVTQ1ZyM.js.map +0 -1
  224. package/dist/chunks/Slider-tGbqoAZH.js.map +0 -1
  225. package/dist/chunks/StatusBar-DBO0E0Yd.js.map +0 -1
  226. package/dist/chunks/Switch-JyVSSAzC.js +0 -27
  227. package/dist/chunks/Switch-JyVSSAzC.js.map +0 -1
  228. package/dist/chunks/Tabs-Df0sDomx.js +0 -41
  229. package/dist/chunks/Tabs-Df0sDomx.js.map +0 -1
  230. package/dist/chunks/ToggleBar-BP1zFcvg.js.map +0 -1
  231. package/dist/chunks/ToolButton-ClPz5L6j.js.map +0 -1
  232. package/dist/chunks/ToolOptionsBar-JvmY7iNe.js.map +0 -1
  233. package/dist/chunks/ToolPalette-DAiVhdtV.js.map +0 -1
  234. package/dist/chunks/Tooltip-DXJbdR5B.js +0 -40
  235. package/dist/chunks/Tooltip-DXJbdR5B.js.map +0 -1
  236. package/dist/chunks/segmentedControl.module-DCyuDbj1.js +0 -11
  237. package/dist/chunks/segmentedControl.module-DCyuDbj1.js.map +0 -1
@@ -1,210 +0,0 @@
1
- import { useCallback as e, useMemo as t, useRef as n, useState as r } from "react";
2
- import { Fragment as i, jsx as a, jsxs as o } from "react/jsx-runtime";
3
- //#region src/useReorderDragList.ts
4
- function s(e, t) {
5
- let n = 0;
6
- for (let r = t - 1; r >= 0; r--) if (e[r]?.locked) {
7
- n = r + 1;
8
- break;
9
- }
10
- let r = e.length;
11
- for (let n = t + 1; n < e.length; n++) if (e[n]?.locked) {
12
- r = n;
13
- break;
14
- }
15
- return [n, r];
16
- }
17
- function c(t) {
18
- let { threshold: i = 4 } = t, a = n(t);
19
- a.current = t;
20
- let o = n(null), c = n(null), l = n(null), [u, d] = r({
21
- draggedIds: null,
22
- targetIndex: null
23
- }), f = e((e, t) => {
24
- let [n, r] = s(a.current.items, t), i = o.current;
25
- if (!i) return n;
26
- let c = Array.from(i.children), l = c.length;
27
- for (let t = 0; t < c.length; t++) {
28
- let n = c[t];
29
- if (n && e < n.getBoundingClientRect().bottom) {
30
- l = t;
31
- break;
32
- }
33
- }
34
- return Math.max(n, Math.min(l, r));
35
- }, []), p = e((e) => {
36
- o.current = e;
37
- }, []), m = e((e, t, n) => {
38
- if (!a.current.items[t]?.locked) {
39
- try {
40
- n.currentTarget.setPointerCapture?.(n.pointerId);
41
- } catch {}
42
- c.current = {
43
- id: e,
44
- sourceIndex: t,
45
- startX: n.clientX,
46
- startY: n.clientY,
47
- pointerId: n.pointerId
48
- };
49
- }
50
- }, []), h = e(() => {
51
- c.current = null, l.current = null, d({
52
- draggedIds: null,
53
- targetIndex: null
54
- });
55
- }, []);
56
- return {
57
- rowProps: (e, t) => ({ onPointerDown: (n) => m(e, t, n) }),
58
- containerProps: {
59
- ref: p,
60
- onPointerMove: e((e) => {
61
- let t = l.current;
62
- if (t) {
63
- let n = f(e.clientY, t.sourceIndex);
64
- n !== t.targetIndex && (t.targetIndex = n, d({
65
- draggedIds: t.draggedIds,
66
- targetIndex: n
67
- }));
68
- return;
69
- }
70
- let n = c.current;
71
- if (!n) return;
72
- let r = e.clientX - n.startX, o = e.clientY - n.startY;
73
- if (Math.hypot(r, o) < i) return;
74
- let u = a.current.selectedIds, p = u.includes(n.id), [m, h] = s(a.current.items, n.sourceIndex), g = (p ? [...u] : [n.id]).filter((e) => {
75
- let t = a.current.items.findIndex((t) => t.id === e);
76
- return t >= m && t < h;
77
- }), _ = f(e.clientY, n.sourceIndex);
78
- l.current = {
79
- ...n,
80
- draggedIds: g,
81
- targetIndex: _
82
- }, d({
83
- draggedIds: g,
84
- targetIndex: _
85
- });
86
- }, [f, i]),
87
- onPointerUp: e((e) => {
88
- let t = l.current;
89
- if (!t) {
90
- h();
91
- return;
92
- }
93
- let n = f(e.clientY, t.sourceIndex), r = a.current.items, i = t.draggedIds.map((e) => r.findIndex((t) => t.id === e)).filter((e) => e >= 0).sort((e, t) => e - t), o = i.length > 0 && i.every((e, t) => {
94
- if (t === 0) return !0;
95
- let n = i[t - 1];
96
- return n !== void 0 && e === n + 1;
97
- }), s = i[0], c = i[i.length - 1];
98
- o && s !== void 0 && c !== void 0 && n >= s && n <= c + 1 || a.current.onReorder(t.draggedIds, n), h();
99
- }, [f, h]),
100
- onPointerCancel: e(() => {
101
- h();
102
- }, [h])
103
- },
104
- state: u
105
- };
106
- }
107
- var l = {
108
- grid: "_grid_1uuch_1",
109
- table: "_table_1uuch_6",
110
- sortButton: "_sortButton_1uuch_34",
111
- sortActive: "_sortActive_1uuch_46",
112
- empty: "_empty_1uuch_48",
113
- handleCol: "_handleCol_1uuch_56",
114
- handleCell: "_handleCell_1uuch_57",
115
- dragging: "_dragging_1uuch_66",
116
- dropBefore: "_dropBefore_1uuch_68",
117
- dropAfter: "_dropAfter_1uuch_69"
118
- };
119
- //#endregion
120
- //#region src/components/DataGrid/DataGrid.tsx
121
- function u(e) {
122
- let { rows: n, columns: s, defaultSort: u, onReorder: d, empty: f = "—", className: p } = e, [m, h] = r(u ?? null), g = t(() => {
123
- if (!m) return [...n];
124
- let e = s.find((e) => e.id === m.columnId);
125
- if (!e) return [...n];
126
- let t = e.accessor ?? ((t) => t[e.id]), r = m.direction === "asc" ? 1 : -1;
127
- return [...n].sort((e, n) => {
128
- let i = t(e), a = t(n);
129
- return i == null && a == null ? 0 : i == null ? 1 : a == null ? -1 : i < a ? -1 * r : i > a ? 1 * r : 0;
130
- });
131
- }, [
132
- n,
133
- s,
134
- m
135
- ]), _ = (e) => {
136
- h((t) => !t || t.columnId !== e ? {
137
- columnId: e,
138
- direction: "asc"
139
- } : t.direction === "asc" ? {
140
- columnId: e,
141
- direction: "desc"
142
- } : null);
143
- }, v = c({
144
- items: g.map((e) => ({
145
- id: e.id,
146
- label: ""
147
- })),
148
- selectedIds: [],
149
- onReorder: d ?? (() => {})
150
- }), y = !!d;
151
- return /* @__PURE__ */ a("div", {
152
- className: [l.grid, p].filter(Boolean).join(" "),
153
- onPointerMove: y ? v.containerProps.onPointerMove : void 0,
154
- onPointerUp: y ? v.containerProps.onPointerUp : void 0,
155
- onPointerCancel: y ? v.containerProps.onPointerCancel : void 0,
156
- children: /* @__PURE__ */ o("table", {
157
- className: l.table,
158
- children: [/* @__PURE__ */ a("thead", { children: /* @__PURE__ */ o("tr", { children: [y && /* @__PURE__ */ a("th", {
159
- className: l.handleCol,
160
- "aria-label": "drag"
161
- }), s.map((e) => {
162
- let t = e.sortable !== !1, n = m?.columnId === e.id, r = n ? m.direction === "asc" ? " ↑" : " ↓" : "";
163
- return /* @__PURE__ */ a("th", {
164
- className: [e.className, n ? l.sortActive : ""].filter(Boolean).join(" "),
165
- "aria-sort": t ? n ? m.direction === "asc" ? "ascending" : "descending" : "none" : void 0,
166
- children: t ? /* @__PURE__ */ o("button", {
167
- type: "button",
168
- className: l.sortButton,
169
- onClick: () => _(e.id),
170
- children: [e.header, r]
171
- }) : /* @__PURE__ */ o(i, { children: [e.header, r] })
172
- }, e.id);
173
- })] }) }), /* @__PURE__ */ o("tbody", {
174
- ref: y ? v.containerProps.ref : void 0,
175
- children: [g.length === 0 && /* @__PURE__ */ a("tr", { children: /* @__PURE__ */ a("td", {
176
- colSpan: s.length + +!!y,
177
- className: l.empty,
178
- children: f
179
- }) }), g.map((e, t) => {
180
- let n = v.state.draggedIds?.includes(e.id) ?? !1, r = v.state.targetIndex;
181
- return /* @__PURE__ */ o("tr", {
182
- className: [
183
- n && l.dragging,
184
- r === t && l.dropBefore,
185
- r === g.length && t === g.length - 1 && l.dropAfter
186
- ].filter(Boolean).join(" ") || void 0,
187
- children: [y && /* @__PURE__ */ a("td", {
188
- className: l.handleCell,
189
- onPointerDown: (n) => v.rowProps(e.id, t).onPointerDown(n),
190
- children: /* @__PURE__ */ a("span", {
191
- "aria-hidden": "true",
192
- children: "⋮⋮"
193
- })
194
- }), s.map((t) => {
195
- let n = t.accessor ?? ((e) => e[t.id]), r = t.render ? t.render(e) : String(n(e) ?? "");
196
- return /* @__PURE__ */ a("td", {
197
- className: t.className,
198
- children: r
199
- }, t.id);
200
- })]
201
- }, e.id);
202
- })]
203
- })]
204
- })
205
- });
206
- }
207
- //#endregion
208
- export { c as n, u as t };
209
-
210
- //# sourceMappingURL=DataGrid-DZQ4Chbd.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DataGrid-DZQ4Chbd.js","names":[],"sources":["../../src/useReorderDragList.ts","../../src/components/DataGrid/DataGrid.module.css","../../src/components/DataGrid/DataGrid.tsx"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\nimport type { ReactNode, PointerEvent as ReactPointerEvent, RefCallback } from 'react';\n\n/** One row in a reorderable list. */\nexport interface LayerListItem {\n id: string;\n label: ReactNode;\n /** Locked rows cannot be dragged, cannot be crossed by drops, and\n * never combine with other rows in a multi-selection. */\n locked?: boolean;\n /** Optional color swatch rendered before the label. Any CSS color string. */\n swatch?: string;\n}\n\n/**\n * Options for {@link useReorderDragList}. `onReorder` receives the dragged ids\n * and the index they were dropped at, measured against the pre-drag `items`.\n */\nexport interface UseReorderDragListOptions {\n items: LayerListItem[];\n selectedIds: string[];\n onReorder(ids: string[], targetIndex: number): void;\n /** Pointer-move distance (px) before pending drag engages. Default 4. */\n threshold?: number;\n}\n\n/**\n * Live drag state for rendering feedback: which ids are being dragged and the\n * insertion index the drop would use. Both `null` when no drag is engaged.\n */\nexport interface ReorderDragState {\n draggedIds: string[] | null;\n targetIndex: number | null;\n}\n\n/**\n * Props to spread onto the list container and each row, plus the live\n * {@link ReorderDragState}.\n */\nexport interface ReorderDragHandlers {\n rowProps(id: string, index: number): { onPointerDown(e: ReactPointerEvent): void };\n containerProps: {\n ref: RefCallback<HTMLElement>;\n onPointerMove(e: ReactPointerEvent): void;\n onPointerUp(e: ReactPointerEvent): void;\n onPointerCancel(e: ReactPointerEvent): void;\n };\n state: ReorderDragState;\n}\n\ninterface PendingState {\n id: string;\n sourceIndex: number;\n startX: number;\n startY: number;\n pointerId: number;\n}\n\ninterface ActiveState extends PendingState {\n draggedIds: string[];\n targetIndex: number;\n}\n\n/**\n * The half-open run of indices a row at `sourceIndex` may be dropped into:\n * bounded by the nearest locked row above and below it, so a locked row is a\n * wall in both directions rather than a global ceiling.\n */\nfunction unlockedSegment(items: readonly LayerListItem[], sourceIndex: number): [number, number] {\n let lo = 0;\n for (let i = sourceIndex - 1; i >= 0; i--) {\n if (items[i]?.locked) { lo = i + 1; break; }\n }\n let hi = items.length;\n for (let i = sourceIndex + 1; i < items.length; i++) {\n if (items[i]?.locked) { hi = i; break; }\n }\n return [lo, hi];\n}\n\n/**\n * Drag-to-reorder for a vertical list of rows. Dragging a row that is part of\n * the current selection drags the whole selection; dragging any other row\n * drags just that row. Locked rows can neither be dragged nor crossed by a\n * drop. A drop that would leave a contiguous block where it already is does\n * not call `onReorder`.\n *\n * The pointer is captured on the row, so a drag that leaves the list still\n * tracks and still releases cleanly.\n */\nexport function useReorderDragList(opts: UseReorderDragListOptions): ReorderDragHandlers {\n const { threshold = 4 } = opts;\n const optsRef = useRef(opts);\n optsRef.current = opts;\n const containerRef = useRef<HTMLElement | null>(null);\n const pendingRef = useRef<PendingState | null>(null);\n const activeRef = useRef<ActiveState | null>(null);\n const [state, setState] = useState<ReorderDragState>({ draggedIds: null, targetIndex: null });\n\n const computeTargetIndex = useCallback((clientY: number, sourceIndex: number): number => {\n const [lo, hi] = unlockedSegment(optsRef.current.items, sourceIndex);\n const c = containerRef.current;\n if (!c) return lo;\n const rows = Array.from(c.children) as HTMLElement[];\n let raw = rows.length;\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i];\n if (!row) continue;\n const r = row.getBoundingClientRect();\n if (clientY < r.bottom) { raw = i; break; }\n }\n return Math.max(lo, Math.min(raw, hi));\n }, []);\n\n const refCb = useCallback<RefCallback<HTMLElement>>((el) => {\n containerRef.current = el;\n }, []);\n\n const onPointerDownRow = useCallback((id: string, index: number, e: ReactPointerEvent) => {\n // Locked items cannot be dragged — skip recording the pending state so\n // pointer-move cannot engage. Plain click still works because LayerList\n // tracks click intent in its own ref, separate from drag candidacy.\n const item = optsRef.current.items[index];\n if (item?.locked) return;\n // Capture the pointer to the row so subsequent move/up events keep firing\n // (on the row, bubbling to the container) even when the user drags\n // outside the list's bounding box. Without capture, releasing outside\n // the container leaves the drag state stuck because pointerup fires on\n // the document, not the list.\n try { (e.currentTarget as Element).setPointerCapture?.(e.pointerId); } catch { /* unsupported / already captured */ }\n pendingRef.current = {\n id,\n sourceIndex: index,\n startX: e.clientX,\n startY: e.clientY,\n pointerId: e.pointerId,\n };\n }, []);\n\n const reset = useCallback(() => {\n pendingRef.current = null;\n activeRef.current = null;\n setState({ draggedIds: null, targetIndex: null });\n }, []);\n\n const onPointerMove = useCallback((e: ReactPointerEvent) => {\n const active = activeRef.current;\n if (active) {\n const targetIndex = computeTargetIndex(e.clientY, active.sourceIndex);\n if (targetIndex !== active.targetIndex) {\n active.targetIndex = targetIndex;\n setState({ draggedIds: active.draggedIds, targetIndex });\n }\n return;\n }\n const pending = pendingRef.current;\n if (!pending) return;\n const dx = e.clientX - pending.startX;\n const dy = e.clientY - pending.startY;\n if (Math.hypot(dx, dy) < threshold) return;\n // Engage.\n const selected = optsRef.current.selectedIds;\n const inSelection = selected.includes(pending.id);\n const [lo, hi] = unlockedSegment(optsRef.current.items, pending.sourceIndex);\n const draggedIds = (inSelection ? [...selected] : [pending.id]).filter((id) => {\n const i = optsRef.current.items.findIndex((it) => it.id === id);\n return i >= lo && i < hi;\n });\n const targetIndex = computeTargetIndex(e.clientY, pending.sourceIndex);\n activeRef.current = { ...pending, draggedIds, targetIndex };\n setState({ draggedIds, targetIndex });\n }, [computeTargetIndex, threshold]);\n\n const onPointerUp = useCallback((e: ReactPointerEvent) => {\n const active = activeRef.current;\n if (!active) {\n reset();\n return;\n }\n const targetIndex = computeTargetIndex(e.clientY, active.sourceIndex);\n // Skip no-op: target lands inside the dragged-ids contiguous block.\n const items = optsRef.current.items;\n const indices = active.draggedIds\n .map((id) => items.findIndex((it) => it.id === id))\n .filter((i) => i >= 0)\n .sort((a, b) => a - b);\n const isContiguous =\n indices.length > 0 &&\n indices.every((v, i) => {\n if (i === 0) return true;\n const prev = indices[i - 1];\n return prev !== undefined && v === prev + 1;\n });\n const first = indices[0];\n const last = indices[indices.length - 1];\n const wouldBeNoop =\n isContiguous &&\n first !== undefined &&\n last !== undefined &&\n targetIndex >= first &&\n targetIndex <= last + 1;\n if (!wouldBeNoop) {\n optsRef.current.onReorder(active.draggedIds, targetIndex);\n }\n reset();\n }, [computeTargetIndex, reset]);\n\n const onPointerCancel = useCallback(() => {\n reset();\n }, [reset]);\n\n return {\n rowProps: (id, index) => ({\n onPointerDown: (e) => onPointerDownRow(id, index, e),\n }),\n containerProps: {\n ref: refCb,\n onPointerMove,\n onPointerUp,\n onPointerCancel,\n },\n state,\n };\n}\n",".grid {\n position: relative;\n width: 100%;\n}\n\n.table {\n width: 100%;\n border-collapse: collapse;\n font-size: 11px;\n}\n\n.table th,\n.table td {\n text-align: left;\n padding: 3px 6px;\n vertical-align: middle;\n}\n.table tbody tr {\n /* Subtle row separator — was a full-weight border on every cell.\n Drastically toned down per visual-weight feedback. */\n border-bottom: 1px solid rgba(255, 255, 255, 0.04);\n}\n\n.table th {\n font-weight: 600;\n color: var(--wzl-fg-muted);\n position: sticky;\n top: 0;\n background: var(--wzl-surface, #2a2018);\n z-index: 1;\n border-bottom: 1px solid var(--wzl-border);\n}\n\n.sortButton {\n all: unset;\n cursor: pointer;\n user-select: none;\n display: block;\n width: 100%;\n}\n.sortButton:hover { color: var(--wzl-fg, #e6e7e9); }\n.sortButton:focus-visible {\n outline: 2px solid var(--wzl-focus-ring, var(--wzl-accent, #7fb069));\n outline-offset: -2px;\n}\n.sortActive { color: var(--wzl-fg, #e6e7e9); }\n\n.empty {\n color: var(--wzl-fg-muted);\n font-style: italic;\n padding: 8px 0;\n text-align: center;\n}\n\n/* Drag-handle column. */\n.handleCol { width: 14px; }\n.handleCell {\n width: 14px;\n cursor: grab;\n color: var(--wzl-fg-muted);\n user-select: none;\n text-align: center;\n}\n.handleCell:active { cursor: grabbing; }\n\n.dragging { opacity: 0.4; }\n\n.dropBefore > td { box-shadow: inset 0 2px 0 0 var(--wzl-accent, #7fb069); }\n.dropAfter > td { box-shadow: inset 0 -2px 0 0 var(--wzl-accent, #7fb069); }\n","/**\n * Lightweight sortable data grid. Use for inspector tables — action\n * registries, route maps, telemetry rows. Intentionally narrow:\n *\n * - Sortable columns (click header to cycle asc → desc → none)\n * - Custom cell render via per-column `render`\n * - Optional drag handles for row reordering (when `onReorder` is set)\n *\n * Not: virtual scrolling, column resizing, multi-column sort, filtering,\n * inline editing. Reach for a real grid library when you need those.\n */\nimport { useMemo, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { useReorderDragList } from '../../useReorderDragList';\nimport s from './DataGrid.module.css';\n\n/**\n * One column of a {@link DataGrid}. `id` doubles as the default property name\n * read off each row when no `accessor` is given.\n */\nexport interface DataGridColumn<Row> {\n id: string;\n header: ReactNode;\n /** Pull a sortable value from the row. Defaults to `(row as any)[column.id]`. */\n accessor?: (row: Row) => string | number | null | undefined;\n /** Render the cell. Defaults to `String(accessor(row) ?? '')`. */\n render?: (row: Row) => ReactNode;\n /** Default true. Set false to suppress the sort affordance on this column. */\n sortable?: boolean;\n /** Optional CSS class on every <td> in this column. */\n className?: string;\n}\n\n/** Props for {@link DataGrid}. */\nexport interface DataGridProps<Row extends { id: string }> {\n rows: readonly Row[];\n columns: readonly DataGridColumn<Row>[];\n /** Initial sort. Omit for unsorted (rows render in input order). */\n defaultSort?: { columnId: string; direction: 'asc' | 'desc' };\n /** Enable drag handles in a leading column. Receives the reorder spec\n * (the existing `useReorderDragList` semantics — see weasel-ui). */\n onReorder?: (ids: string[], targetIndex: number) => void;\n /** Empty-state row text. Default `'—'`. */\n empty?: ReactNode;\n className?: string;\n}\n\ntype SortState = { columnId: string; direction: 'asc' | 'desc' } | null;\n\n/**\n * Sortable table for inspector-style data. Rows are keyed by `id`. Clicking a\n * sortable header cycles ascending, descending, unsorted; nullish values sort\n * last regardless of direction. Passing `onReorder` adds a leading drag-handle\n * column — note that the drag indices it reports are into the *sorted* row\n * order, not the input order.\n */\nexport function DataGrid<Row extends { id: string }>(props: DataGridProps<Row>) {\n const { rows, columns, defaultSort, onReorder, empty = '—', className } = props;\n const [sort, setSort] = useState<SortState>(defaultSort ?? null);\n\n const sortedRows = useMemo(() => {\n if (!sort) return [...rows];\n const col = columns.find((c) => c.id === sort.columnId);\n if (!col) return [...rows];\n const get = col.accessor ?? ((row: Row) => (row as unknown as Record<string, unknown>)[col.id] as string | number | null | undefined);\n const dir = sort.direction === 'asc' ? 1 : -1;\n return [...rows].sort((a, b) => {\n const av = get(a);\n const bv = get(b);\n if (av == null && bv == null) return 0;\n if (av == null) return 1;\n if (bv == null) return -1;\n if (av < bv) return -1 * dir;\n if (av > bv) return 1 * dir;\n return 0;\n });\n }, [rows, columns, sort]);\n\n const cycleSort = (columnId: string) => {\n setSort((cur) => {\n if (!cur || cur.columnId !== columnId) return { columnId, direction: 'asc' };\n if (cur.direction === 'asc') return { columnId, direction: 'desc' };\n return null;\n });\n };\n\n // Drag handles via useReorderDragList. Adapter: the hook expects\n // `{ id, label }`-shaped items; we map our rows to that shape (label\n // unused — the hook only uses id and locked).\n const drag = useReorderDragList({\n items: sortedRows.map((r) => ({ id: r.id, label: '' })),\n selectedIds: [],\n onReorder: onReorder ?? (() => {}),\n });\n const dragEnabled = !!onReorder;\n\n const cls = [s.grid, className].filter(Boolean).join(' ');\n\n return (\n <div\n className={cls}\n onPointerMove={dragEnabled ? drag.containerProps.onPointerMove : undefined}\n onPointerUp={dragEnabled ? drag.containerProps.onPointerUp : undefined}\n onPointerCancel={dragEnabled ? drag.containerProps.onPointerCancel : undefined}\n >\n <table className={s.table}>\n <thead>\n <tr>\n {dragEnabled && <th className={s.handleCol} aria-label=\"drag\" />}\n {columns.map((col) => {\n const sortable = col.sortable !== false;\n const active = sort?.columnId === col.id;\n const indicator = active ? (sort.direction === 'asc' ? ' ↑' : ' ↓') : '';\n return (\n <th\n key={col.id}\n className={[col.className, active ? s.sortActive : ''].filter(Boolean).join(' ')}\n aria-sort={sortable ? (active ? (sort.direction === 'asc' ? 'ascending' : 'descending') : 'none') : undefined}\n >\n {sortable ? (\n <button type=\"button\" className={s.sortButton} onClick={() => cycleSort(col.id)}>\n {col.header}{indicator}\n </button>\n ) : (\n <>{col.header}{indicator}</>\n )}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody ref={dragEnabled ? (drag.containerProps.ref as React.RefCallback<HTMLTableSectionElement>) : undefined}>\n {sortedRows.length === 0 && (\n <tr>\n <td colSpan={columns.length + (dragEnabled ? 1 : 0)} className={s.empty}>\n {empty}\n </td>\n </tr>\n )}\n {sortedRows.map((row, i) => {\n const isDragging = drag.state.draggedIds?.includes(row.id) ?? false;\n const target = drag.state.targetIndex;\n const rowCls = [\n isDragging && s.dragging,\n target === i && s.dropBefore,\n target === sortedRows.length && i === sortedRows.length - 1 && s.dropAfter,\n ].filter(Boolean).join(' ');\n return (\n <tr key={row.id} className={rowCls || undefined}>\n {dragEnabled && (\n <td\n className={s.handleCell}\n onPointerDown={(e) => drag.rowProps(row.id, i).onPointerDown(e)}\n >\n <span aria-hidden=\"true\">⋮⋮</span>\n </td>\n )}\n {columns.map((col) => {\n const get = col.accessor ?? ((r: Row) => (r as unknown as Record<string, unknown>)[col.id] as string | number | null | undefined);\n const content = col.render ? col.render(row) : String(get(row) ?? '');\n return (\n <td key={col.id} className={col.className}>\n {content}\n </td>\n );\n })}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,59 +0,0 @@
1
- import { Dialog as e, Heading as t, Modal as n, ModalOverlay as r } from "react-aria-components";
2
- import { Fragment as i, jsx as a, jsxs as o } from "react/jsx-runtime";
3
- var s = {
4
- overlay: "_overlay_13xy9_1",
5
- modal: "_modal_13xy9_29",
6
- dialog: "_dialog_13xy9_43",
7
- header: "_header_13xy9_51",
8
- title: "_title_13xy9_60",
9
- close: "_close_13xy9_68",
10
- body: "_body_13xy9_90",
11
- footer: "_footer_13xy9_97"
12
- };
13
- //#endregion
14
- //#region src/components/Dialog/Dialog.tsx
15
- function c(c) {
16
- let { title: l, showCloseButton: u, children: d, footer: f, role: p = "dialog", className: m, isOpen: h, onOpenChange: g, ..._ } = c, v = u ?? !!g;
17
- return /* @__PURE__ */ a(r, {
18
- ..._,
19
- isOpen: h,
20
- onOpenChange: g,
21
- className: s.overlay,
22
- "data-weasel-overlay": "",
23
- children: /* @__PURE__ */ a(n, {
24
- className: [s.modal, m].filter(Boolean).join(" "),
25
- children: /* @__PURE__ */ a(e, {
26
- role: p,
27
- className: s.dialog,
28
- children: ({ close: e }) => /* @__PURE__ */ o(i, { children: [
29
- (l !== void 0 || v) && /* @__PURE__ */ o("header", {
30
- className: s.header,
31
- children: [l !== void 0 && /* @__PURE__ */ a(t, {
32
- slot: "title",
33
- className: s.title,
34
- children: l
35
- }), v && /* @__PURE__ */ a("button", {
36
- type: "button",
37
- className: s.close,
38
- onClick: e,
39
- "aria-label": "Close dialog",
40
- children: "×"
41
- })]
42
- }),
43
- /* @__PURE__ */ a("div", {
44
- className: s.body,
45
- children: d
46
- }),
47
- f !== void 0 && /* @__PURE__ */ a("footer", {
48
- className: s.footer,
49
- children: f
50
- })
51
- ] })
52
- })
53
- })
54
- });
55
- }
56
- //#endregion
57
- export { c as t };
58
-
59
- //# sourceMappingURL=Dialog-CqwdJv_t.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Dialog-CqwdJv_t.js","names":[],"sources":["../../src/components/Dialog/Dialog.module.css","../../src/components/Dialog/Dialog.tsx"],"sourcesContent":[".overlay {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.4);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n opacity: 0;\n transition: opacity var(--wzl-motion-fast);\n}\n\n.overlay[data-entering] {\n opacity: 0;\n}\n\n.overlay[data-entering][data-rac] {\n opacity: 1;\n}\n\n.overlay[data-exiting] {\n opacity: 0;\n}\n\n.overlay[data-rac]:not([data-entering]):not([data-exiting]) {\n opacity: 1;\n}\n\n.modal {\n background: var(--wzl-surface);\n border: 1px solid var(--wzl-border);\n border-radius: var(--wzl-radius-md);\n box-shadow: 0 24px 64px rgba(0, 0, 0, 0.45);\n color: var(--wzl-fg);\n font-family: var(--wzl-font-ui);\n max-width: min(900px, calc(100vw - 32px));\n max-height: calc(100vh - 32px);\n display: flex;\n flex-direction: column;\n outline: none;\n}\n\n.dialog {\n display: flex;\n flex-direction: column;\n min-height: 0;\n flex: 1;\n outline: none;\n}\n\n.header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px 16px;\n border-bottom: 1px solid var(--wzl-border);\n flex: 0 0 auto;\n}\n\n.title {\n flex: 1;\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--wzl-fg);\n}\n\n.close {\n flex: 0 0 auto;\n width: 22px;\n height: 22px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: 1px solid transparent;\n border-radius: var(--wzl-radius-sm);\n color: var(--wzl-fg-muted);\n cursor: pointer;\n padding: 0;\n font-size: 16px;\n line-height: 1;\n}\n\n.close:hover {\n background: color-mix(in srgb, var(--wzl-fg) 10%, transparent);\n color: var(--wzl-fg);\n}\n\n.body {\n flex: 1;\n min-height: 0;\n overflow: auto;\n padding: 16px;\n}\n\n.footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n padding: 12px 16px;\n border-top: 1px solid var(--wzl-border);\n flex: 0 0 auto;\n}\n","import type { ReactNode } from 'react';\nimport {\n Modal as RACModal,\n ModalOverlay,\n Dialog as RACDialog,\n Heading,\n type ModalOverlayProps,\n type DialogProps as RACDialogProps,\n} from 'react-aria-components';\nimport s from './Dialog.module.css';\n\n/** Props for {@link Dialog}, on top of React Aria's `ModalOverlay` props. */\nexport type DialogProps = Omit<ModalOverlayProps, 'children' | 'className'> & {\n /** Heading rendered in the dialog's default header. Omit when supplying\n * a custom `header` slot via children. */\n title?: ReactNode;\n /** Show the built-in close button. Defaults to true when `onOpenChange`\n * is wired so the user has an escape hatch. */\n showCloseButton?: boolean;\n /** Body content. */\n children?: ReactNode;\n /** Footer slot — typically action buttons. */\n footer?: ReactNode;\n /** ARIA role. Defaults to `dialog`. Use `alertdialog` for confirms. */\n role?: RACDialogProps['role'];\n /** Class applied to the modal box (inside the overlay). */\n className?: string;\n};\n\n/**\n * Modal dialog wrapping React Aria. Supplies a default header (title +\n * close), scrollable body, and footer slot. Pass `isOpen` + `onOpenChange`\n * for controlled visibility, or omit both and use a `<DialogTrigger>` from\n * `react-aria-components` upstream of this component.\n *\n * Escape, click-outside, focus trap, and scroll lock all come from the\n * underlying primitives.\n */\nexport function Dialog(props: DialogProps) {\n const {\n title,\n showCloseButton,\n children,\n footer,\n role = 'dialog',\n className,\n isOpen,\n onOpenChange,\n ...rest\n } = props;\n\n const showClose = showCloseButton ?? Boolean(onOpenChange);\n\n return (\n <ModalOverlay {...rest} isOpen={isOpen} onOpenChange={onOpenChange} className={s.overlay} data-weasel-overlay=\"\">\n <RACModal className={[s.modal, className].filter(Boolean).join(' ')}>\n <RACDialog role={role} className={s.dialog}>\n {({ close }) => (\n <>\n {(title !== undefined || showClose) && (\n <header className={s.header}>\n {title !== undefined && (\n <Heading slot=\"title\" className={s.title}>{title}</Heading>\n )}\n {showClose && (\n <button\n type=\"button\"\n className={s.close}\n onClick={close}\n aria-label=\"Close dialog\"\n >\n ×\n </button>\n )}\n </header>\n )}\n <div className={s.body}>{children}</div>\n {footer !== undefined && <footer className={s.footer}>{footer}</footer>}\n </>\n )}\n </RACDialog>\n </RACModal>\n </ModalOverlay>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;ACsCA,SAAgB,EAAO,GAAoB;CACzC,IAAM,EACJ,UACA,oBACA,aACA,WACA,UAAO,UACP,cACA,WACA,iBACA,GAAG,MACD,GAEE,IAAY,KAAmB,EAAQ;AAE7C,QACE,kBAAC,GAAD;EAAc,GAAI;EAAc;EAAsB;EAAc,WAAW,EAAE;EAAS,uBAAoB;YAC5G,kBAAC,GAAD;GAAU,WAAW,CAAC,EAAE,OAAO,EAAU,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI;aACjE,kBAAC,GAAD;IAAiB;IAAM,WAAW,EAAE;eAChC,EAAE,eACF,kBAAA,GAAA,EAAA,UAAA;MACI,MAAU,KAAA,KAAa,MACvB,kBAAC,UAAD;MAAQ,WAAW,EAAE;gBAArB,CACG,MAAU,KAAA,KACT,kBAAC,GAAD;OAAS,MAAK;OAAQ,WAAW,EAAE;iBAAQ;OAAgB,CAAA,EAE5D,KACC,kBAAC,UAAD;OACE,MAAK;OACL,WAAW,EAAE;OACb,SAAS;OACT,cAAW;iBACZ;OAEQ,CAAA,CAEJ;;KAEX,kBAAC,OAAD;MAAK,WAAW,EAAE;MAAO;MAAe,CAAA;KACvC,MAAW,KAAA,KAAa,kBAAC,UAAD;MAAQ,WAAW,EAAE;gBAAS;MAAgB,CAAA;KACtE,EAAA,CAAA;IAEK,CAAA;GACH,CAAA;EACE,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Field-VQwmrIna.js","names":[],"sources":["../../src/components/Field/Field.module.css","../../src/components/Field/Field.tsx"],"sourcesContent":[".field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-family: var(--wzl-font-ui);\n color: var(--wzl-fg);\n}\n\n.label {\n font-size: 12px;\n font-weight: 500;\n color: var(--wzl-fg);\n cursor: default;\n}\n\n.hint {\n font-size: 11px;\n color: var(--wzl-fg-subtle);\n line-height: 1.4;\n}\n\n.error {\n font-size: 11px;\n color: var(--wzl-danger, #ff5b5b);\n line-height: 1.4;\n}\n\n.row {\n flex-direction: row;\n align-items: center;\n gap: 8px;\n}\n\n.row .label {\n flex: 1;\n min-width: 0;\n}\n","import type { ReactNode } from 'react';\nimport s from './Field.module.css';\n\n/**\n * Whether a {@link Field} stacks its label above the control or sits them\n * side by side.\n */\nexport type FieldOrientation = 'stacked' | 'row';\n\n/** Props for {@link Field}. */\nexport type FieldProps = {\n orientation?: FieldOrientation;\n className?: string;\n children?: ReactNode;\n};\n\n/**\n * Layout primitive that arranges a label, control, hint, and error in the\n * canonical weasel-ui form-row shape. The control itself owns its semantics\n * (RAC `TextField`, `Checkbox`, etc.); this just paints the layout.\n *\n * Most users will instead reach for `Input` / `Checkbox` / `Switch`, which\n * compose Field internally. Use Field directly when you need a custom\n * control to sit in the same visual rhythm.\n */\nexport function Field({ orientation = 'stacked', className, children }: FieldProps) {\n const cls = [s.field, orientation === 'row' && s.row, className].filter(Boolean).join(' ');\n return <div className={cls}>{children}</div>;\n}\n\n/**\n * The class names {@link Field} paints its slots with, so a control composing\n * its own layout can match the same form-row rhythm.\n */\nexport const fieldClasses = {\n root: s.field,\n row: s.row,\n label: s.label,\n hint: s.hint,\n error: s.error,\n};\n"],"mappings":";;;;;;;;;;ACyBA,SAAgB,EAAM,EAAE,iBAAc,WAAW,cAAW,eAAwB;AAElF,QAAO,kBAAC,OAAD;EAAK,WADA;GAAC,EAAE;GAAO,MAAgB,SAAS,EAAE;GAAK;GAAU,CAAC,OAAO,QAAQ,CAAC,KAAK,IAC/D;EAAM;EAAe,CAAA;;AAO9C,IAAa,IAAe;CAC1B,MAAM,EAAE;CACR,KAAK,EAAE;CACP,OAAO,EAAE;CACT,MAAM,EAAE;CACR,OAAO,EAAE;CACV"}
@@ -1,280 +0,0 @@
1
- import { t as e } from "./Slider-tGbqoAZH.js";
2
- import { t } from "./ToggleBar-BP1zFcvg.js";
3
- import { t as n } from "./ColorField-ykpiD3XU.js";
4
- import { useCallback as r, useRef as i } from "react";
5
- import { gradientGeometry as a, sampleGradientStops as o, useHandleDrag as s, withGradientKind as c } from "@weasel-js/core";
6
- import { Fragment as l, jsx as u, jsxs as d } from "react/jsx-runtime";
7
- //#region src/paintGradientTrack.tsx
8
- var f = {
9
- angleDeg: 135,
10
- stripe: 2,
11
- gap: 4,
12
- dim: 75
13
- };
14
- function p(e) {
15
- let { gradient: t, samples: n = 16, activeRange: r, hatch: i } = e;
16
- return (e) => {
17
- let a = [];
18
- for (let e = 0; e <= n; e++) {
19
- let r = e / n;
20
- a.push(`${t(r)} ${(r * 100).toFixed(1)}%`);
21
- }
22
- let o = `linear-gradient(to right, ${a.join(", ")})`, s = [];
23
- if (r) {
24
- let t = e.valueToFraction(r[0]) * 100, n = e.valueToFraction(r[1]) * 100, a = {
25
- ...f,
26
- ...i
27
- }, o = `repeating-linear-gradient(${a.angleDeg}deg, transparent 0 ${a.stripe}px, var(--wzl-surface) ${a.stripe}px ${a.stripe + a.gap}px)`, c = `color-mix(in srgb, var(--wzl-surface) ${a.dim}%, transparent)`, l = `linear-gradient(${c}, ${c})`;
28
- if (t > 0 && (s.push(`${l} left 0 / ${t.toFixed(2)}% 100% no-repeat`), s.push(`${o} left 0 / ${t.toFixed(2)}% 100% no-repeat`)), n < 100) {
29
- let e = (100 - n).toFixed(2);
30
- s.push(`${l} right 0 / ${e}% 100% no-repeat`), s.push(`${o} right 0 / ${e}% 100% no-repeat`);
31
- }
32
- }
33
- return s.push(o), /* @__PURE__ */ u("div", { style: {
34
- position: "absolute",
35
- inset: 0,
36
- background: s.join(", ")
37
- } });
38
- };
39
- }
40
- var m = {
41
- root: "_root_15yko_1",
42
- swatches: "_swatches_15yko_8",
43
- swatch: "_swatch_15yko_8"
44
- }, h = [
45
- {
46
- value: "linear-gradient",
47
- label: "Linear"
48
- },
49
- {
50
- value: "radial-gradient",
51
- label: "Radial"
52
- },
53
- {
54
- value: "conic-gradient",
55
- label: "Conic"
56
- }
57
- ], g = 2;
58
- function _(i) {
59
- let { value: a, onInput: s, onChange: l, kindSwitch: f = !0, className: _ } = i, v = a.stops, y = r((e) => ({
60
- ...a,
61
- stops: e
62
- }), [a]), b = v.map((e) => ({
63
- value: e.offset,
64
- color: e.color
65
- })), x = (e) => e.map((e) => ({
66
- offset: e.value,
67
- color: e.color
68
- })), S = (e, t) => v.map((n, r) => r === e ? {
69
- ...n,
70
- color: t
71
- } : n), C = v.map((e, t) => ({
72
- stop: e,
73
- index: t
74
- })).sort((e, t) => e.stop.offset - t.stop.offset);
75
- return /* @__PURE__ */ d("div", {
76
- className: [m.root, _].filter(Boolean).join(" "),
77
- children: [
78
- f && /* @__PURE__ */ u(t, {
79
- items: h,
80
- value: a.fill,
81
- size: "sm",
82
- ariaLabel: "Gradient kind",
83
- onChange: (e) => e && l(c(a, e))
84
- }),
85
- /* @__PURE__ */ u(e, {
86
- min: 0,
87
- max: 1,
88
- step: .005,
89
- constraint: "free",
90
- thumbs: b,
91
- ariaLabel: "Gradient stops",
92
- readoutPlacement: "none",
93
- onInput: (e) => s?.(y(x(e))),
94
- onChange: (e) => l(y(x(e))),
95
- onAddThumb: (e) => ({
96
- value: e,
97
- color: o(v, e)
98
- }),
99
- onRemoveThumb: () => v.length > g,
100
- renderTrack: p({
101
- gradient: (e) => o(v, e),
102
- samples: 32
103
- })
104
- }),
105
- /* @__PURE__ */ u("div", {
106
- className: m.swatches,
107
- children: C.map(({ stop: e, index: t }) => /* @__PURE__ */ u(n, {
108
- value: e.color,
109
- alpha: !0,
110
- "aria-label": `Stop ${t + 1} at ${Math.round(e.offset * 100)}%`,
111
- className: m.swatch,
112
- onInput: (e) => s?.(y(S(t, e))),
113
- onChange: (e) => l(y(S(t, e)))
114
- }, t))
115
- })
116
- ]
117
- });
118
- }
119
- var v = {
120
- overlay: "_overlay_6yu3h_3",
121
- guide: "_guide_6yu3h_13",
122
- handle: "_handle_6yu3h_21"
123
- };
124
- //#endregion
125
- //#region src/components/GradientEditor/GradientHandles.tsx
126
- function y(e) {
127
- let { value: t, toScreen: n, toLocal: r, onInput: i, onChange: a, width: o, height: s, className: c } = e;
128
- return /* @__PURE__ */ u("svg", {
129
- className: [v.overlay, c].filter(Boolean).join(" "),
130
- width: o,
131
- height: s,
132
- children: b(t, n, r, i, a)
133
- });
134
- }
135
- function b(e, t, n, r, i) {
136
- let o = (e, t) => {
137
- t === "input" ? r?.(e) : i(e);
138
- };
139
- if (e.fill === "linear-gradient") {
140
- let r = t(e.from), i = t(e.to);
141
- return /* @__PURE__ */ d(l, { children: [
142
- /* @__PURE__ */ u(S, {
143
- x1: r.x,
144
- y1: r.y,
145
- x2: i.x,
146
- y2: i.y
147
- }),
148
- /* @__PURE__ */ u(C, {
149
- at: r,
150
- label: "Gradient start",
151
- onDrag: (t, r) => o({
152
- ...e,
153
- from: n(t)
154
- }, r)
155
- }),
156
- /* @__PURE__ */ u(C, {
157
- at: i,
158
- label: "Gradient end",
159
- onDrag: (t, r) => o({
160
- ...e,
161
- to: n(t)
162
- }, r)
163
- })
164
- ] });
165
- }
166
- if (e.fill === "radial-gradient") {
167
- let r = t(e.center), i = t({
168
- x: e.center.x + e.radius,
169
- y: e.center.y
170
- }), a = Math.hypot(i.x - r.x, i.y - r.y);
171
- return /* @__PURE__ */ d(l, { children: [
172
- /* @__PURE__ */ u("circle", {
173
- className: v.guide,
174
- cx: r.x,
175
- cy: r.y,
176
- r: a
177
- }),
178
- /* @__PURE__ */ u(C, {
179
- at: r,
180
- label: "Gradient center",
181
- onDrag: (t, r) => o({
182
- ...e,
183
- center: n(t)
184
- }, r)
185
- }),
186
- /* @__PURE__ */ u(C, {
187
- at: i,
188
- label: "Gradient radius",
189
- onDrag: (t, r) => {
190
- let i = n(t), a = Math.hypot(i.x - e.center.x, i.y - e.center.y);
191
- o({
192
- ...e,
193
- radius: Math.max(x, a)
194
- }, r);
195
- }
196
- })
197
- ] });
198
- }
199
- let s = t(e.center), { radius: c } = a(e), f = t({
200
- x: e.center.x + Math.cos(e.angle) * c,
201
- y: e.center.y + Math.sin(e.angle) * c
202
- });
203
- return /* @__PURE__ */ d(l, { children: [
204
- /* @__PURE__ */ u(S, {
205
- x1: s.x,
206
- y1: s.y,
207
- x2: f.x,
208
- y2: f.y
209
- }),
210
- /* @__PURE__ */ u(C, {
211
- at: s,
212
- label: "Gradient center",
213
- onDrag: (t, r) => o({
214
- ...e,
215
- center: n(t)
216
- }, r)
217
- }),
218
- /* @__PURE__ */ u(C, {
219
- at: f,
220
- label: "Gradient angle",
221
- onDrag: (t, r) => {
222
- let i = n(t), a = Math.atan2(i.y - e.center.y, i.x - e.center.x);
223
- o({
224
- ...e,
225
- angle: a
226
- }, r);
227
- }
228
- })
229
- ] });
230
- }
231
- var x = 1;
232
- function S(e) {
233
- return /* @__PURE__ */ u("line", {
234
- className: v.guide,
235
- ...e
236
- });
237
- }
238
- function C({ at: e, label: t, onDrag: n }) {
239
- let r = i(null), a = i(e), o = s({
240
- onStart: () => {
241
- a.current = e, r.current = null;
242
- },
243
- onMove: (e) => {
244
- r.current = e, n(e, "input");
245
- },
246
- onEnd: (e) => {
247
- let t = r.current;
248
- r.current = null, t !== null && (e.type === "pointercancel" ? n(a.current, "input") : n(t, "commit"));
249
- }
250
- });
251
- return /* @__PURE__ */ u("circle", {
252
- className: v.handle,
253
- cx: e.x,
254
- cy: e.y,
255
- r: w,
256
- role: "button",
257
- "aria-label": t,
258
- tabIndex: 0,
259
- onKeyDown: (t) => {
260
- let r = t.shiftKey ? T * 10 : T, i = 0, a = 0;
261
- if (t.key === "ArrowLeft") i = -r;
262
- else if (t.key === "ArrowRight") i = r;
263
- else if (t.key === "ArrowUp") a = -r;
264
- else if (t.key === "ArrowDown") a = r;
265
- else return;
266
- t.preventDefault();
267
- let o = {
268
- x: e.x + i,
269
- y: e.y + a
270
- };
271
- n(o, "input"), n(o, "commit");
272
- },
273
- ...o
274
- });
275
- }
276
- var w = 7, T = 1;
277
- //#endregion
278
- export { _ as n, p as r, y as t };
279
-
280
- //# sourceMappingURL=GradientEditor-Bg6SX64V.js.map