@number10/jsx-components 5.0.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 (256) hide show
  1. package/LICENSE +667 -0
  2. package/README.md +43 -0
  3. package/dist/Accordion.cjs +1 -0
  4. package/dist/Accordion.d.ts +43 -0
  5. package/dist/Accordion.d.ts.map +1 -0
  6. package/dist/Accordion.js +71 -0
  7. package/dist/Accordion.test.d.ts +2 -0
  8. package/dist/Accordion.test.d.ts.map +1 -0
  9. package/dist/ActivityIndicator.cjs +1 -0
  10. package/dist/ActivityIndicator.d.ts +21 -0
  11. package/dist/ActivityIndicator.d.ts.map +1 -0
  12. package/dist/ActivityIndicator.js +133 -0
  13. package/dist/AlertDialog.cjs +1 -0
  14. package/dist/AlertDialog.d.ts +53 -0
  15. package/dist/AlertDialog.d.ts.map +1 -0
  16. package/dist/AlertDialog.js +76 -0
  17. package/dist/Badge.cjs +1 -0
  18. package/dist/Badge.d.ts +96 -0
  19. package/dist/Badge.d.ts.map +1 -0
  20. package/dist/Badge.js +238 -0
  21. package/dist/Badge.test.d.ts +2 -0
  22. package/dist/Badge.test.d.ts.map +1 -0
  23. package/dist/BottomSheet.cjs +1 -0
  24. package/dist/BottomSheet.d.ts +72 -0
  25. package/dist/BottomSheet.d.ts.map +1 -0
  26. package/dist/BottomSheet.js +132 -0
  27. package/dist/Button.cjs +1 -0
  28. package/dist/Button.d.ts +61 -0
  29. package/dist/Button.d.ts.map +1 -0
  30. package/dist/Button.js +251 -0
  31. package/dist/Checkbox.cjs +1 -0
  32. package/dist/Checkbox.d.ts +40 -0
  33. package/dist/Checkbox.d.ts.map +1 -0
  34. package/dist/Checkbox.js +84 -0
  35. package/dist/Checkbox.test.d.ts +2 -0
  36. package/dist/Checkbox.test.d.ts.map +1 -0
  37. package/dist/ColorPicker.cjs +1 -0
  38. package/dist/ColorPicker.d.ts +48 -0
  39. package/dist/ColorPicker.d.ts.map +1 -0
  40. package/dist/ColorPicker.js +256 -0
  41. package/dist/DebugPanel.cjs +1 -0
  42. package/dist/DebugPanel.d.ts +63 -0
  43. package/dist/DebugPanel.d.ts.map +1 -0
  44. package/dist/DebugPanel.js +116 -0
  45. package/dist/Dialog.cjs +1 -0
  46. package/dist/Dialog.d.ts +59 -0
  47. package/dist/Dialog.d.ts.map +1 -0
  48. package/dist/Dialog.js +142 -0
  49. package/dist/Divider.cjs +1 -0
  50. package/dist/Divider.d.ts +19 -0
  51. package/dist/Divider.d.ts.map +1 -0
  52. package/dist/Divider.js +15 -0
  53. package/dist/Divider.test.d.ts +2 -0
  54. package/dist/Divider.test.d.ts.map +1 -0
  55. package/dist/Dropdown.cjs +1 -0
  56. package/dist/Dropdown.d.ts +35 -0
  57. package/dist/Dropdown.d.ts.map +1 -0
  58. package/dist/Dropdown.js +222 -0
  59. package/dist/Icon.cjs +1 -0
  60. package/dist/Icon.d.ts +71 -0
  61. package/dist/Icon.d.ts.map +1 -0
  62. package/dist/Icon.js +57 -0
  63. package/dist/Icon.test.d.ts +2 -0
  64. package/dist/Icon.test.d.ts.map +1 -0
  65. package/dist/Image.cjs +1 -0
  66. package/dist/Image.d.ts +10 -0
  67. package/dist/Image.d.ts.map +1 -0
  68. package/dist/Image.js +18 -0
  69. package/dist/Joystick.cjs +1 -0
  70. package/dist/Joystick.d.ts +32 -0
  71. package/dist/Joystick.d.ts.map +1 -0
  72. package/dist/Joystick.js +185 -0
  73. package/dist/ListBox.cjs +1 -0
  74. package/dist/ListBox.d.ts +67 -0
  75. package/dist/ListBox.d.ts.map +1 -0
  76. package/dist/ListBox.js +104 -0
  77. package/dist/ListBox.test.d.ts +2 -0
  78. package/dist/ListBox.test.d.ts.map +1 -0
  79. package/dist/MenuButton.cjs +1 -0
  80. package/dist/MenuButton.d.ts +33 -0
  81. package/dist/MenuButton.d.ts.map +1 -0
  82. package/dist/MenuButton.js +63 -0
  83. package/dist/Modal.cjs +1 -0
  84. package/dist/Modal.d.ts +27 -0
  85. package/dist/Modal.d.ts.map +1 -0
  86. package/dist/Modal.js +174 -0
  87. package/dist/Modal.test.d.ts +2 -0
  88. package/dist/Modal.test.d.ts.map +1 -0
  89. package/dist/NineSlice.cjs +1 -0
  90. package/dist/NineSlice.d.ts +40 -0
  91. package/dist/NineSlice.d.ts.map +1 -0
  92. package/dist/NineSlice.js +314 -0
  93. package/dist/NineSlice.props.test.d.ts +2 -0
  94. package/dist/NineSlice.props.test.d.ts.map +1 -0
  95. package/dist/NineSlice.test.d.ts +2 -0
  96. package/dist/NineSlice.test.d.ts.map +1 -0
  97. package/dist/NineSliceButton.cjs +1 -0
  98. package/dist/NineSliceButton.d.ts +94 -0
  99. package/dist/NineSliceButton.d.ts.map +1 -0
  100. package/dist/NineSliceButton.js +61 -0
  101. package/dist/NineSliceButton.test.d.ts +2 -0
  102. package/dist/NineSliceButton.test.d.ts.map +1 -0
  103. package/dist/NumberInput.cjs +1 -0
  104. package/dist/NumberInput.d.ts +90 -0
  105. package/dist/NumberInput.d.ts.map +1 -0
  106. package/dist/NumberInput.js +222 -0
  107. package/dist/NumberInput.test.d.ts +2 -0
  108. package/dist/NumberInput.test.d.ts.map +1 -0
  109. package/dist/PalettePicker.cjs +1 -0
  110. package/dist/PalettePicker.d.ts +49 -0
  111. package/dist/PalettePicker.d.ts.map +1 -0
  112. package/dist/PalettePicker.js +152 -0
  113. package/dist/PalettePicker.test.d.ts +2 -0
  114. package/dist/PalettePicker.test.d.ts.map +1 -0
  115. package/dist/Popover.cjs +1 -0
  116. package/dist/Popover.d.ts +95 -0
  117. package/dist/Popover.d.ts.map +1 -0
  118. package/dist/Popover.js +267 -0
  119. package/dist/Portal.cjs +1 -0
  120. package/dist/Portal.d.ts +30 -0
  121. package/dist/Portal.d.ts.map +1 -0
  122. package/dist/Portal.js +64 -0
  123. package/dist/Portal.test.d.ts +2 -0
  124. package/dist/Portal.test.d.ts.map +1 -0
  125. package/dist/ProgressBar.cjs +1 -0
  126. package/dist/ProgressBar.d.ts +61 -0
  127. package/dist/ProgressBar.d.ts.map +1 -0
  128. package/dist/ProgressBar.js +80 -0
  129. package/dist/ProgressBar.test.d.ts +2 -0
  130. package/dist/ProgressBar.test.d.ts.map +1 -0
  131. package/dist/ProgressView.cjs +1 -0
  132. package/dist/ProgressView.d.ts +37 -0
  133. package/dist/ProgressView.d.ts.map +1 -0
  134. package/dist/ProgressView.js +71 -0
  135. package/dist/RadioButton.cjs +1 -0
  136. package/dist/RadioButton.d.ts +21 -0
  137. package/dist/RadioButton.d.ts.map +1 -0
  138. package/dist/RadioButton.js +53 -0
  139. package/dist/RadioGroup.cjs +1 -0
  140. package/dist/RadioGroup.d.ts +26 -0
  141. package/dist/RadioGroup.d.ts.map +1 -0
  142. package/dist/RadioGroup.js +32 -0
  143. package/dist/RatingBar.cjs +1 -0
  144. package/dist/RatingBar.d.ts +24 -0
  145. package/dist/RatingBar.d.ts.map +1 -0
  146. package/dist/RatingBar.js +84 -0
  147. package/dist/ScrollSlider.cjs +1 -0
  148. package/dist/ScrollSlider.d.ts +48 -0
  149. package/dist/ScrollSlider.d.ts.map +1 -0
  150. package/dist/ScrollSlider.js +93 -0
  151. package/dist/ScrollView.cjs +1 -0
  152. package/dist/ScrollView.d.ts +121 -0
  153. package/dist/ScrollView.d.ts.map +1 -0
  154. package/dist/ScrollView.js +541 -0
  155. package/dist/ScrollView.test.d.ts +2 -0
  156. package/dist/ScrollView.test.d.ts.map +1 -0
  157. package/dist/SegmentedControl.cjs +1 -0
  158. package/dist/SegmentedControl.d.ts +50 -0
  159. package/dist/SegmentedControl.d.ts.map +1 -0
  160. package/dist/SegmentedControl.js +201 -0
  161. package/dist/SegmentedControl.test.d.ts +2 -0
  162. package/dist/SegmentedControl.test.d.ts.map +1 -0
  163. package/dist/Sidebar.cjs +1 -0
  164. package/dist/Sidebar.d.ts +36 -0
  165. package/dist/Sidebar.d.ts.map +1 -0
  166. package/dist/Sidebar.js +122 -0
  167. package/dist/Slider.cjs +1 -0
  168. package/dist/Slider.d.ts +80 -0
  169. package/dist/Slider.d.ts.map +1 -0
  170. package/dist/Slider.js +233 -0
  171. package/dist/Tabs.cjs +1 -0
  172. package/dist/Tabs.d.ts +23 -0
  173. package/dist/Tabs.d.ts.map +1 -0
  174. package/dist/Tabs.js +101 -0
  175. package/dist/TextInput.cjs +17 -0
  176. package/dist/TextInput.d.ts +82 -0
  177. package/dist/TextInput.d.ts.map +1 -0
  178. package/dist/TextInput.js +441 -0
  179. package/dist/Toast.cjs +1 -0
  180. package/dist/Toast.d.ts +66 -0
  181. package/dist/Toast.d.ts.map +1 -0
  182. package/dist/Toast.js +188 -0
  183. package/dist/Toast.test.d.ts +2 -0
  184. package/dist/Toast.test.d.ts.map +1 -0
  185. package/dist/Toggle.cjs +1 -0
  186. package/dist/Toggle.d.ts +14 -0
  187. package/dist/Toggle.d.ts.map +1 -0
  188. package/dist/Toggle.js +135 -0
  189. package/dist/Toolbar.cjs +1 -0
  190. package/dist/Toolbar.d.ts +129 -0
  191. package/dist/Toolbar.d.ts.map +1 -0
  192. package/dist/Toolbar.js +159 -0
  193. package/dist/Toolbar.test.d.ts +2 -0
  194. package/dist/Toolbar.test.d.ts.map +1 -0
  195. package/dist/TransformOriginView.cjs +1 -0
  196. package/dist/TransformOriginView.d.ts +8 -0
  197. package/dist/TransformOriginView.d.ts.map +1 -0
  198. package/dist/TransformOriginView.js +38 -0
  199. package/dist/WheelPicker.cjs +1 -0
  200. package/dist/WheelPicker.d.ts +58 -0
  201. package/dist/WheelPicker.d.ts.map +1 -0
  202. package/dist/WheelPicker.js +167 -0
  203. package/dist/WrapText.cjs +1 -0
  204. package/dist/WrapText.d.ts +83 -0
  205. package/dist/WrapText.d.ts.map +1 -0
  206. package/dist/WrapText.js +93 -0
  207. package/dist/WrapText.test.d.ts +2 -0
  208. package/dist/WrapText.test.d.ts.map +1 -0
  209. package/dist/contrast-slot-map.d.ts +33 -0
  210. package/dist/contrast-slot-map.d.ts.map +1 -0
  211. package/dist/index.cjs +1 -0
  212. package/dist/index.d.ts +64 -0
  213. package/dist/index.d.ts.map +1 -0
  214. package/dist/index.js +54 -0
  215. package/dist/primitives/Image.cjs +1 -0
  216. package/dist/primitives/Image.d.ts +11 -0
  217. package/dist/primitives/Image.d.ts.map +1 -0
  218. package/dist/primitives/Image.js +7 -0
  219. package/dist/primitives/Sprite.cjs +1 -0
  220. package/dist/primitives/Sprite.d.ts +11 -0
  221. package/dist/primitives/Sprite.d.ts.map +1 -0
  222. package/dist/primitives/Sprite.js +7 -0
  223. package/dist/primitives/Text.cjs +1 -0
  224. package/dist/primitives/Text.d.ts +14 -0
  225. package/dist/primitives/Text.d.ts.map +1 -0
  226. package/dist/primitives/Text.js +15 -0
  227. package/dist/primitives/VectorDrawContent.cjs +1 -0
  228. package/dist/primitives/VectorDrawContent.d.ts +3 -0
  229. package/dist/primitives/VectorDrawContent.d.ts.map +1 -0
  230. package/dist/primitives/VectorDrawContent.js +7 -0
  231. package/dist/primitives/View.cjs +1 -0
  232. package/dist/primitives/View.d.ts +13 -0
  233. package/dist/primitives/View.d.ts.map +1 -0
  234. package/dist/primitives/View.js +7 -0
  235. package/dist/primitives/index.d.ts +13 -0
  236. package/dist/primitives/index.d.ts.map +1 -0
  237. package/dist/primitives/primitives.test.d.ts +2 -0
  238. package/dist/primitives/primitives.test.d.ts.map +1 -0
  239. package/dist/primitives.cjs +1 -0
  240. package/dist/primitives.d.ts +2 -0
  241. package/dist/primitives.js +6 -0
  242. package/dist/theme-defaults.cjs +1 -0
  243. package/dist/theme-defaults.d.ts +12 -0
  244. package/dist/theme-defaults.d.ts.map +1 -0
  245. package/dist/theme-defaults.js +1288 -0
  246. package/dist/theme-defaults.test.d.ts +2 -0
  247. package/dist/theme-defaults.test.d.ts.map +1 -0
  248. package/dist/theme-types.cjs +0 -0
  249. package/dist/theme-types.d.ts +708 -0
  250. package/dist/theme-types.d.ts.map +1 -0
  251. package/dist/theme-types.js +0 -0
  252. package/dist/useOverlayPresence.cjs +1 -0
  253. package/dist/useOverlayPresence.d.ts +24 -0
  254. package/dist/useOverlayPresence.d.ts.map +1 -0
  255. package/dist/useOverlayPresence.js +19 -0
  256. package/package.json +83 -0
@@ -0,0 +1,185 @@
1
+ import { VectorDrawContent as e } from "./primitives/VectorDrawContent.js";
2
+ import { View as t } from "./primitives/View.js";
3
+ import "./primitives.js";
4
+ import { createTween as n, useRef as r, useState as i, useSurface as a } from "@number10/jsx-core";
5
+ import { jsx as o, jsxs as s } from "@number10/jsx-core/jsx-runtime";
6
+ //#region src/Joystick.tsx
7
+ function c(t, n) {
8
+ function r(t, n = 65280) {
9
+ return /* @__PURE__ */ o(e, { onDraw: (e) => {
10
+ e.fillStyle(n, .1).fillCircle(0, 0, t + 10), e.fillStyle(0, .4).fillCircle(0, 0, t), e.lineStyle(3, n, 1).strokeCircle(0, 0, t), e.lineStyle(1, n, .5).strokeCircle(0, 0, t - 5);
11
+ for (let r = 0; r < 4; r++) {
12
+ let i = r * 90 * Math.PI / 180;
13
+ e.lineStyle(2, n, .7).lineBetween(Math.cos(i) * (t - 15), Math.sin(i) * (t - 15), Math.cos(i) * (t - 5), Math.sin(i) * (t - 5));
14
+ }
15
+ } });
16
+ }
17
+ function i(t, n = 65280) {
18
+ let r = t * .4;
19
+ return /* @__PURE__ */ o(e, { onDraw: (e) => {
20
+ e.fillStyle(n, .2).fillCircle(0, 0, r + 5), e.fillStyle(n, .8).fillCircle(0, 0, r), e.lineStyle(2, n, 1).strokeCircle(0, 0, r), e.lineStyle(2, 0, .8), e.moveTo(0, -r * .6).lineTo(0, r * .6), e.moveTo(-r * .6, 0).lineTo(r * .6, 0), e.strokePath();
21
+ } });
22
+ }
23
+ function a(t, n = 16711680) {
24
+ return /* @__PURE__ */ o(e, { onDraw: (e) => {
25
+ e.fillStyle(0, .3).fillCircle(0, 0, t);
26
+ for (let r = 0; r < 3; r++) e.lineStyle(2, n, .6 - r * .15).strokeCircle(0, 0, t - r * 20);
27
+ e.lineStyle(1, n, .5), e.moveTo(-t, 0).lineTo(t, 0), e.moveTo(0, -t).lineTo(0, t), e.strokePath(), e.fillStyle(n, .8).fillCircle(0, 0, 5);
28
+ } });
29
+ }
30
+ function s(t, n = 16711680) {
31
+ let r = t * .35;
32
+ return /* @__PURE__ */ o(e, { onDraw: (e) => {
33
+ e.fillStyle(n, .7).fillCircle(0, 0, r), e.fillStyle(16777215, .9).fillCircle(0, 0, r * .5), e.fillStyle(n, 1).fillCircle(0, 0, r * .2), e.lineStyle(3, n, 1), e.beginPath(), e.moveTo(0, -r).lineTo(r * .3, -r * .6).lineTo(-r * .3, -r * .6), e.closePath().fillPath();
34
+ } });
35
+ }
36
+ function c(t, n = 16777215) {
37
+ return /* @__PURE__ */ o(e, { onDraw: (e) => {
38
+ e.fillStyle(n, .15).fillCircle(0, 0, t), e.fillStyle(n, .3).fillCircle(-t * .3, -t * .3, t * .4), e.lineStyle(2, n, .5).strokeCircle(0, 0, t), e.lineStyle(1, n, .3).strokeCircle(0, 0, t - 3);
39
+ } });
40
+ }
41
+ function l(t, n = 16777215) {
42
+ let r = t * .4;
43
+ return /* @__PURE__ */ o(e, { onDraw: (e) => {
44
+ e.fillStyle(0, .2).fillCircle(r * .1, r * .1, r), e.fillStyle(n, .4).fillCircle(0, 0, r), e.fillStyle(n, .6).fillCircle(-r * .3, -r * .3, r * .4), e.lineStyle(2, n, .7).strokeCircle(0, 0, r);
45
+ } });
46
+ }
47
+ function u(t, n = 65280) {
48
+ return /* @__PURE__ */ o(e, { onDraw: (e) => {
49
+ e.fillStyle(1710618, .8).fillCircle(0, 0, t), e.lineStyle(1, n, .3);
50
+ for (let n = -t; n <= t; n += 20) e.moveTo(-t, n).lineTo(t, n), e.moveTo(n, -t).lineTo(n, t);
51
+ e.strokePath(), e.lineStyle(2, n, .6), e.strokeCircle(0, 0, t), e.strokeCircle(0, 0, t * .66), e.strokeCircle(0, 0, t * .33);
52
+ let r = [-t * .7, t * .7];
53
+ e.lineStyle(3, n, .8), r.forEach((t) => r.forEach((n) => {
54
+ e.moveTo(t - 10, n).lineTo(t + 10, n), e.moveTo(t, n - 10).lineTo(t, n + 10);
55
+ })), e.strokePath();
56
+ } });
57
+ }
58
+ function d(t, n = 65280) {
59
+ let r = t * .3;
60
+ return /* @__PURE__ */ o(e, { onDraw: (e) => {
61
+ e.fillStyle(n, .9).fillCircle(0, 0, r), e.fillStyle(0, 1), e.beginPath(), e.moveTo(0, -r).lineTo(r * .5, r * .3).lineTo(-r * .5, r * .3), e.closePath().fillPath(), e.lineStyle(2, 0, .8).strokeCircle(0, 0, r);
62
+ } });
63
+ }
64
+ function f(t, n = 65280) {
65
+ return /* @__PURE__ */ o(e, { onDraw: (e) => {
66
+ e.fillStyle(0, .25).lineStyle(1, n), e.fillCircle(0, 0, t).strokeCircle(0, 0, t);
67
+ } });
68
+ }
69
+ function p(t, n = 65280) {
70
+ let r = t * .2;
71
+ return /* @__PURE__ */ o(e, { onDraw: (e) => {
72
+ e.lineStyle(2, 0, 1), e.moveTo(0, -r).lineTo(0, r), e.moveTo(-r, 0).lineTo(r, 0), e.strokePath(), e.lineStyle(2, n, .75).strokeCircle(0, 0, r * 1.1);
73
+ } });
74
+ }
75
+ let m = t == null ? "default" : t.theme, h = (t == null ? 65280 : t.tint) ?? 65280;
76
+ switch (m) {
77
+ case "neon": return {
78
+ base: r(n, h),
79
+ thumb: i(n, h),
80
+ rotateThumb: !1
81
+ };
82
+ case "target": return {
83
+ base: a(n, h),
84
+ thumb: s(n, h),
85
+ rotateThumb: !0
86
+ };
87
+ case "glass": return {
88
+ base: c(n, h),
89
+ thumb: l(n, h),
90
+ rotateThumb: !1
91
+ };
92
+ case "military": return {
93
+ base: u(n, h),
94
+ thumb: d(n, h),
95
+ rotateThumb: !0
96
+ };
97
+ default: return {
98
+ base: f(n, h),
99
+ thumb: p(n, h),
100
+ rotateThumb: !1
101
+ };
102
+ }
103
+ }
104
+ function l(e) {
105
+ let [l, u] = i({
106
+ x: 0,
107
+ y: 0
108
+ }), [d, f] = i(0), [p, m] = i({
109
+ width: 0,
110
+ height: 0
111
+ }), h = r(!1), g = r(null), _ = r(!1), v = r(null), y = a()?.scheduler, b = typeof e.width == "number" ? e.width : 200, x = typeof e.height == "number" ? e.height : 200, S = {
112
+ x: b / 2,
113
+ y: x / 2
114
+ }, C = Math.min(b, x) / 2;
115
+ p.width === 0 && Promise.resolve().then(() => {
116
+ m({
117
+ width: b,
118
+ height: x
119
+ }), u(S);
120
+ });
121
+ let w = e.base != null && e.thumb ? {
122
+ base: e.base,
123
+ thumb: e.thumb,
124
+ rotateThumb: e.rotateThumb ?? !1
125
+ } : c(e.joystickTheme, C), T = (e) => {
126
+ let t = e;
127
+ return t ? t.pointerId ?? t.id ?? null : null;
128
+ }, E = (t) => {
129
+ t.stopPropagation();
130
+ let r = T(t.pointer);
131
+ if (_.current && r !== v.current) return;
132
+ if (t.state === "start" && (h.current = !1, _.current = !0, v.current = r), t.state === "end") {
133
+ _.current = !1, v.current = null, g.current &&= (g.current.stop(), null), y ? g.current = n({
134
+ x: l.x,
135
+ y: l.y,
136
+ angle: d
137
+ }, {
138
+ to: {
139
+ x: S.x,
140
+ y: S.y,
141
+ angle: 0
142
+ },
143
+ duration: 150,
144
+ onUpdate: (e) => {
145
+ u({
146
+ x: e.x,
147
+ y: e.y
148
+ }), f(e.angle ?? 0);
149
+ },
150
+ onComplete: () => {
151
+ g.current = null, e.onMove?.(!1, 0, 0);
152
+ }
153
+ }, y) : (u(S), f(0), e.onMove?.(!1, 0, 0));
154
+ return;
155
+ }
156
+ if (!_.current) return;
157
+ let i = t.localX - S.x, a = t.localY - S.y, o = Math.sqrt(i * i + a * a), s = C * .6, c = Math.min(o, s), p = Math.atan2(a, i), m = (p * 180 / Math.PI + 360) % 360, b = o > 0 ? Math.min(o / s, 1) : 0;
158
+ u({
159
+ x: S.x + (o > 0 ? c / o * i : 0),
160
+ y: S.y + (o > 0 ? c / o * a : 0)
161
+ }), (e.rotateThumb ?? w.rotateThumb) && f(p);
162
+ let x = e.minForce ?? .1;
163
+ b > x && (h.current = !0), e.onMove?.(b > x || h.current, m, b);
164
+ };
165
+ return /* @__PURE__ */ s(t, {
166
+ width: e.width,
167
+ height: e.height,
168
+ direction: "stack",
169
+ enableGestures: !0,
170
+ onTouchMove: E,
171
+ onTouchOutside: E,
172
+ children: [/* @__PURE__ */ o(t, {
173
+ x: S.x,
174
+ y: S.y,
175
+ children: w.base
176
+ }), /* @__PURE__ */ o(t, {
177
+ x: l.x,
178
+ y: l.y,
179
+ ...w.rotateThumb ? { rotation: d } : {},
180
+ children: w.thumb
181
+ })]
182
+ });
183
+ }
184
+ //#endregion
185
+ export { l as Joystick };
@@ -0,0 +1 @@
1
+ const e=require(`./primitives/Text.cjs`),t=require(`./primitives/View.cjs`);require(`./primitives.cjs`);const n=require(`./ScrollView.cjs`);let r=require(`@number10/jsx-core`),i=require(`@number10/jsx-core/jsx-runtime`);function a(e,t){if(t!==void 0)return e.find(e=>e.value===t)}function o(e,t,n){if(t!==void 0)return a(e,t)?.value??``;let r=a(e,n);return r?r.value:e.find(e=>!e.disabled)?.value??e[0]?.value??``}function s(...e){return Object.assign({},...e.filter(Boolean))}function c(c){let{items:l,value:u,defaultValue:d,onChange:f,renderItem:p,hoverable:m=!1,scrollViewProps:h,labels:g,disabled:_=!1,maxVisibleItems:v,theme:y,alpha:b,...x}=c,S=(0,r.useTheme)(),C=y?(0,r.mergeThemes)(S??{},y):S,{props:w,nestedTheme:T}=(0,r.resolveComponentTheme)({componentName:`ListBox`,globalTheme:(0,r.getGlobalThemeDefaults)(),localTheme:C,knownComponents:r.KNOWN_COMPONENTS}),[E,D]=(0,r.useState)(void 0),O=u!==void 0,[k,A]=(0,r.useState)(o(l,u,d)),j=O?o(l,u):o(l,k);(0,r.useEffect)(()=>{!O&&k!==j&&A(j)},[O,k,j]);let M={...w.labels??{},...g??{}},N=s({color:`#e0e7ff`,fontSize:`14px`},w.textStyle),P=s(N,w.selectedTextStyle),F=s(N,w.disabledTextStyle),I=w.emptyStyle??{color:`#6b7280`,fontSize:`14px`},L=_?w.disabledAlpha??.5:b,R=e=>{let t=a(l,e);!t||t.disabled||_||(O||A(e),f?.(e))},z=w.itemHeight??36,B=w.itemGap??1,V=l.length*(z+B)-(l.length>0?B:0),H=v&&v>0?Math.min(V,v*(z+B)):V,U=(n,a)=>{let o=n.value===j,c=_||!!n.disabled,l=m?E===n.value:!1,u=!c,d=s({height:z},w.itemStyle??{},m&&l&&!o&&!c?w.itemHoverStyle??{}:{},o?w.itemSelectedStyle??{}:{},c?w.itemDisabledStyle??{}:{}),f=c?F:o?P:N,h=(0,r.mergeThemes)(T,{Text:f?{style:f}:{}}),g=p?.({item:n,selected:o,disabled:c,hovered:l,index:a,...f?{textStyle:f}:{}}),v=m&&u&&(w.itemHoverStyle||w.itemSelectedStyle)?{onHoverStart:()=>D(n.value),onHoverEnd:()=>D(e=>e===n.value?void 0:e)}:{};return(0,i.jsx)(t.View,{width:`fill`,direction:`row`,alignItems:`center`,padding:w.itemPadding,cornerRadius:w.itemCornerRadius,...d,enableGestures:u,onTouch:()=>R(n.value),...v,theme:h,children:g??(0,i.jsx)(e.Text,{text:n.label??n.value,...f?{style:f}:{}})},n.value)},W=M.empty??`No items`;return(0,i.jsx)(t.View,{...x,...w,...L===void 0?{}:{alpha:L},theme:T,overflow:`hidden`,children:l.length===0?(0,i.jsx)(t.View,{alignItems:`center`,justifyContent:`center`,height:z*3,children:(0,i.jsx)(e.Text,{text:W,style:I})}):(0,i.jsx)(n.ScrollView,{height:H>0?H:void 0,width:`fill`,theme:T,...h,children:(0,i.jsx)(t.View,{direction:`column`,gap:B,width:`fill`,theme:T,children:l.map(U)})})})}exports.ListBox=c,exports.findListBoxItem=a,exports.resolveListBoxValue=o;
@@ -0,0 +1,67 @@
1
+ import { PortableTextStyle, VNodeLike } from '@number10/jsx-core';
2
+ import { ScrollViewProps } from './ScrollView';
3
+ import { PortableComponentPartialTheme } from './theme-types';
4
+ export interface ListBoxLabels {
5
+ empty?: string;
6
+ }
7
+ export interface ListBoxItem {
8
+ /** Unique item value used for selection. */
9
+ value: string;
10
+ /** Visible label. Falls back to value when no children/renderItem provided. */
11
+ label?: string;
12
+ /** Disabled items cannot be selected. */
13
+ disabled?: boolean;
14
+ }
15
+ export interface ListBoxItemRenderProps {
16
+ item: ListBoxItem;
17
+ selected: boolean;
18
+ disabled: boolean;
19
+ hovered: boolean;
20
+ index: number;
21
+ textStyle?: PortableTextStyle;
22
+ }
23
+ export interface ListBoxProps {
24
+ /** Unique key for VDOM identification. */
25
+ key?: string | number | undefined;
26
+ /** Available items. */
27
+ items: ListBoxItem[];
28
+ /** Selected value in controlled mode. */
29
+ value?: string;
30
+ /** Initial selected value in uncontrolled mode. */
31
+ defaultValue?: string;
32
+ /** Called when a selectable item is selected. */
33
+ onChange?: (value: string) => void;
34
+ /** Render custom item content. */
35
+ renderItem?: (props: ListBoxItemRenderProps) => VNodeLike;
36
+ /** Enable hover state tracking and hover styling. Default true. */
37
+ hoverable?: boolean;
38
+ /** Localized labels. */
39
+ labels?: ListBoxLabels;
40
+ /** Disabled state for the whole control. */
41
+ disabled?: boolean;
42
+ /** Maximum visible items before scrolling. If unset, the list grows to fit. */
43
+ maxVisibleItems?: number;
44
+ /** Props forwarded to the underlying ScrollView. */
45
+ scrollViewProps?: Pick<ScrollViewProps, 'sliderSize' | 'showVerticalSlider' | 'showHorizontalSlider' | 'momentum' | 'snap' | 'snapAlignment' | 'snapThreshold' | 'onSnap'>;
46
+ /** Theme overrides. */
47
+ theme?: PortableComponentPartialTheme<'ListBox'>;
48
+ /** Alpha transparency. */
49
+ alpha?: number;
50
+ /** Width. */
51
+ width?: import('@number10/jsx-core').SizeValue | undefined;
52
+ /** Height. */
53
+ height?: import('@number10/jsx-core').SizeValue | undefined;
54
+ }
55
+ /**
56
+ * Finds an item by its value in the items array.
57
+ */
58
+ export declare function findListBoxItem(items: ListBoxItem[], value: string | undefined): ListBoxItem | undefined;
59
+ /**
60
+ * Resolves the effective value considering controlled/uncontrolled mode and disabled items.
61
+ */
62
+ export declare function resolveListBoxValue(items: ListBoxItem[], value?: string, defaultValue?: string): string;
63
+ /**
64
+ * ListBox — scrollable single-selection list.
65
+ */
66
+ export declare function ListBox(props: ListBoxProps): VNodeLike;
67
+ //# sourceMappingURL=ListBox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListBox.d.ts","sourceRoot":"","sources":["../src/ListBox.tsx"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAWtE,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,KAAK,EAAgB,6BAA6B,EAAE,MAAM,eAAe,CAAA;AAIhF,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAA;IACb,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,yCAAyC;IACzC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,WAAW,CAAA;IACjB,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,OAAO,CAAA;IACjB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,iBAAiB,CAAA;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,0CAA0C;IAC1C,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IACjC,uBAAuB;IACvB,KAAK,EAAE,WAAW,EAAE,CAAA;IACpB,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,mDAAmD;IACnD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,kCAAkC;IAClC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,SAAS,CAAA;IACzD,mEAAmE;IACnE,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,wBAAwB;IACxB,MAAM,CAAC,EAAE,aAAa,CAAA;IACtB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,+EAA+E;IAC/E,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,oDAAoD;IACpD,eAAe,CAAC,EAAE,IAAI,CACpB,eAAe,EACb,YAAY,GACZ,oBAAoB,GACpB,sBAAsB,GACtB,UAAU,GACV,MAAM,GACN,eAAe,GACf,eAAe,GACf,QAAQ,CACX,CAAA;IACD,uBAAuB;IACvB,KAAK,CAAC,EAAE,6BAA6B,CAAC,SAAS,CAAC,CAAA;IAChD,0BAA0B;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa;IACb,KAAK,CAAC,EAAE,OAAO,oBAAoB,EAAE,SAAS,GAAG,SAAS,CAAA;IAC1D,cAAc;IACd,MAAM,CAAC,EAAE,OAAO,oBAAoB,EAAE,SAAS,GAAG,SAAS,CAAA;CAC5D;AAID;;GAEG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,WAAW,EAAE,EACpB,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,WAAW,GAAG,SAAS,CAGzB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,WAAW,EAAE,EACpB,KAAK,CAAC,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,MAAM,GACpB,MAAM,CASR;AAQD;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,CA0LtD"}
@@ -0,0 +1,104 @@
1
+ import { Text as e } from "./primitives/Text.js";
2
+ import { View as t } from "./primitives/View.js";
3
+ import "./primitives.js";
4
+ import { ScrollView as n } from "./ScrollView.js";
5
+ import { KNOWN_COMPONENTS as r, getGlobalThemeDefaults as i, mergeThemes as a, resolveComponentTheme as o, useEffect as s, useState as c, useTheme as l } from "@number10/jsx-core";
6
+ import { jsx as u } from "@number10/jsx-core/jsx-runtime";
7
+ //#region src/ListBox.tsx
8
+ function d(e, t) {
9
+ if (t !== void 0) return e.find((e) => e.value === t);
10
+ }
11
+ function f(e, t, n) {
12
+ if (t !== void 0) return d(e, t)?.value ?? "";
13
+ let r = d(e, n);
14
+ return r ? r.value : e.find((e) => !e.disabled)?.value ?? e[0]?.value ?? "";
15
+ }
16
+ function p(...e) {
17
+ return Object.assign({}, ...e.filter(Boolean));
18
+ }
19
+ function m(m) {
20
+ let { items: h, value: g, defaultValue: _, onChange: v, renderItem: y, hoverable: b = !1, scrollViewProps: x, labels: S, disabled: C = !1, maxVisibleItems: w, theme: T, alpha: E, ...D } = m, O = l(), k = T ? a(O ?? {}, T) : O, { props: A, nestedTheme: j } = o({
21
+ componentName: "ListBox",
22
+ globalTheme: i(),
23
+ localTheme: k,
24
+ knownComponents: r
25
+ }), [M, N] = c(void 0), P = g !== void 0, [F, I] = c(f(h, g, _)), L = P ? f(h, g) : f(h, F);
26
+ s(() => {
27
+ !P && F !== L && I(L);
28
+ }, [
29
+ P,
30
+ F,
31
+ L
32
+ ]);
33
+ let R = {
34
+ ...A.labels ?? {},
35
+ ...S ?? {}
36
+ }, z = p({
37
+ color: "#e0e7ff",
38
+ fontSize: "14px"
39
+ }, A.textStyle), B = p(z, A.selectedTextStyle), V = p(z, A.disabledTextStyle), H = A.emptyStyle ?? {
40
+ color: "#6b7280",
41
+ fontSize: "14px"
42
+ }, U = C ? A.disabledAlpha ?? .5 : E, W = (e) => {
43
+ let t = d(h, e);
44
+ !t || t.disabled || C || (P || I(e), v?.(e));
45
+ }, G = A.itemHeight ?? 36, K = A.itemGap ?? 1, q = h.length * (G + K) - (h.length > 0 ? K : 0), J = w && w > 0 ? Math.min(q, w * (G + K)) : q, Y = (n, r) => {
46
+ let i = n.value === L, o = C || !!n.disabled, s = b ? M === n.value : !1, c = !o, l = p({ height: G }, A.itemStyle ?? {}, b && s && !i && !o ? A.itemHoverStyle ?? {} : {}, i ? A.itemSelectedStyle ?? {} : {}, o ? A.itemDisabledStyle ?? {} : {}), d = o ? V : i ? B : z, f = a(j, { Text: d ? { style: d } : {} }), m = y?.({
47
+ item: n,
48
+ selected: i,
49
+ disabled: o,
50
+ hovered: s,
51
+ index: r,
52
+ ...d ? { textStyle: d } : {}
53
+ }), h = b && c && (A.itemHoverStyle || A.itemSelectedStyle) ? {
54
+ onHoverStart: () => N(n.value),
55
+ onHoverEnd: () => N((e) => e === n.value ? void 0 : e)
56
+ } : {};
57
+ return /* @__PURE__ */ u(t, {
58
+ width: "fill",
59
+ direction: "row",
60
+ alignItems: "center",
61
+ padding: A.itemPadding,
62
+ cornerRadius: A.itemCornerRadius,
63
+ ...l,
64
+ enableGestures: c,
65
+ onTouch: () => W(n.value),
66
+ ...h,
67
+ theme: f,
68
+ children: m ?? /* @__PURE__ */ u(e, {
69
+ text: n.label ?? n.value,
70
+ ...d ? { style: d } : {}
71
+ })
72
+ }, n.value);
73
+ }, X = R.empty ?? "No items";
74
+ return /* @__PURE__ */ u(t, {
75
+ ...D,
76
+ ...A,
77
+ ...U === void 0 ? {} : { alpha: U },
78
+ theme: j,
79
+ overflow: "hidden",
80
+ children: h.length === 0 ? /* @__PURE__ */ u(t, {
81
+ alignItems: "center",
82
+ justifyContent: "center",
83
+ height: G * 3,
84
+ children: /* @__PURE__ */ u(e, {
85
+ text: X,
86
+ style: H
87
+ })
88
+ }) : /* @__PURE__ */ u(n, {
89
+ height: J > 0 ? J : void 0,
90
+ width: "fill",
91
+ theme: j,
92
+ ...x,
93
+ children: /* @__PURE__ */ u(t, {
94
+ direction: "column",
95
+ gap: K,
96
+ width: "fill",
97
+ theme: j,
98
+ children: h.map(Y)
99
+ })
100
+ })
101
+ });
102
+ }
103
+ //#endregion
104
+ export { m as ListBox, d as findListBoxItem, f as resolveListBoxValue };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ListBox.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListBox.test.d.ts","sourceRoot":"","sources":["../src/ListBox.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ const e=require(`./primitives/Text.cjs`),t=require(`./primitives/View.cjs`);require(`./primitives.cjs`);const n=require(`./Button.cjs`),r=require(`./Popover.cjs`);let i=require(`@number10/jsx-core`),a=require(`@number10/jsx-core/jsx-runtime`);function o(o){let{items:s,onSelect:c,children:l,label:u,icon:d,trigger:f,open:p,defaultOpen:m,onOpenChange:h,placement:g,width:_,buttonVariant:v,buttonSize:y,buttonProps:b,disabled:x=!1,theme:S,...C}=o,w=(0,i.useTheme)(),T=S?(0,i.mergeThemes)(w??{},S):w,{props:E,nestedTheme:D}=(0,i.resolveComponentTheme)({componentName:`MenuButton`,globalTheme:(0,i.getGlobalThemeDefaults)(),localTheme:T,knownComponents:i.KNOWN_COMPONENTS}),[O,k]=(0,i.useState)(m??!1),A=p!==void 0,j=A?p:O,M=e=>{A||k(e),h?.(e)},N=e=>{c?.(e)},P=()=>{if(f)return f({isOpen:j,disabled:x});if(l!==void 0)return(0,a.jsx)(n.Button,{...b,variant:v??E.buttonVariant??`secondary`,size:y??E.buttonSize??`medium`,disabled:x,theme:D,children:l});let r=d!==void 0,i=u!==void 0;return(0,a.jsx)(n.Button,{...b,variant:v??E.buttonVariant??`secondary`,size:y??E.buttonSize??`medium`,disabled:x,label:r?void 0:u,theme:D,children:r&&(0,a.jsxs)(t.View,{direction:`row`,alignItems:`center`,justifyContent:`center`,gap:E.iconGap??8,children:[d,i&&(0,a.jsx)(e.Text,{text:String(u)})]})})},F=_??E.width;return(0,a.jsx)(r.ContextMenu,{...C,items:s,onSelect:N,isOpen:j,onOpenChange:M,placement:g??E.placement??`bottom-start`,...F===void 0?{}:{width:F},disabled:x,theme:D,trigger:P()})}exports.MenuButton=o;
@@ -0,0 +1,33 @@
1
+ import { VNodeLike } from '@number10/jsx-core';
2
+ import { ButtonProps, ButtonSize, ButtonVariant } from './Button';
3
+ import { ContextMenuItem, ContextMenuProps } from './Popover';
4
+ export interface MenuButtonTriggerRenderProps {
5
+ isOpen: boolean;
6
+ disabled: boolean;
7
+ }
8
+ export interface MenuButtonProps extends Omit<ContextMenuProps, 'items' | 'onSelect' | 'trigger' | 'isOpen'> {
9
+ /** Unique key for VDOM identification. */
10
+ key?: string | number | undefined;
11
+ /** Menu items shown when the button is clicked. */
12
+ items: ContextMenuItem[];
13
+ /** Called when an item is selected. */
14
+ onSelect?: (item: ContextMenuItem) => void;
15
+ /** Button content. Takes precedence over icon/label convenience rendering. */
16
+ children?: VNodeLike | undefined;
17
+ /** Convenience label for the default button. */
18
+ label?: string | number | undefined;
19
+ /** Optional icon/glyph content. */
20
+ icon?: VNodeLike;
21
+ /** Custom trigger renderer. Replaces the default Button. */
22
+ trigger?: (props: MenuButtonTriggerRenderProps) => VNodeLike;
23
+ /** Controlled open state. */
24
+ open?: boolean;
25
+ /** Button visual variant. */
26
+ buttonVariant?: ButtonVariant;
27
+ /** Button size variant. */
28
+ buttonSize?: ButtonSize;
29
+ /** Additional props for the generated default Button. */
30
+ buttonProps?: Omit<ButtonProps, 'children' | 'label' | 'text' | 'onClick' | 'disabled' | 'variant' | 'size' | 'theme'>;
31
+ }
32
+ export declare function MenuButton(props: MenuButtonProps): VNodeLike;
33
+ //# sourceMappingURL=MenuButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MenuButton.d.ts","sourceRoot":"","sources":["../src/MenuButton.tsx"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAUnD,OAAO,EAAU,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAA;AACxF,OAAO,EAAe,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAOpF,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,OAAO,CAAA;IACf,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAC3C,gBAAgB,EAChB,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,CAC5C;IACC,0CAA0C;IAC1C,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IACjC,mDAAmD;IACnD,KAAK,EAAE,eAAe,EAAE,CAAA;IACxB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;IAC1C,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,SAAS,GAAG,SAAS,CAAA;IAChC,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IACnC,mCAAmC;IACnC,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,4BAA4B,KAAK,SAAS,CAAA;IAC5D,6BAA6B;IAC7B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,6BAA6B;IAC7B,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,2BAA2B;IAC3B,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,yDAAyD;IACzD,WAAW,CAAC,EAAE,IAAI,CAChB,WAAW,EACX,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CACtF,CAAA;CACF;AAMD,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,SAAS,CA2G5D"}
@@ -0,0 +1,63 @@
1
+ import { Text as e } from "./primitives/Text.js";
2
+ import { View as t } from "./primitives/View.js";
3
+ import "./primitives.js";
4
+ import { Button as n } from "./Button.js";
5
+ import { ContextMenu as r } from "./Popover.js";
6
+ import { KNOWN_COMPONENTS as i, getGlobalThemeDefaults as a, mergeThemes as o, resolveComponentTheme as s, useState as c, useTheme as l } from "@number10/jsx-core";
7
+ import { jsx as u, jsxs as d } from "@number10/jsx-core/jsx-runtime";
8
+ //#region src/MenuButton.tsx
9
+ function f(f) {
10
+ let { items: p, onSelect: m, children: h, label: g, icon: _, trigger: v, open: y, defaultOpen: b, onOpenChange: x, placement: S, width: C, buttonVariant: w, buttonSize: T, buttonProps: E, disabled: D = !1, theme: O, ...k } = f, A = l(), j = O ? o(A ?? {}, O) : A, { props: M, nestedTheme: N } = s({
11
+ componentName: "MenuButton",
12
+ globalTheme: a(),
13
+ localTheme: j,
14
+ knownComponents: i
15
+ }), [P, F] = c(b ?? !1), I = y !== void 0, L = I ? y : P, R = (e) => {
16
+ I || F(e), x?.(e);
17
+ }, z = (e) => {
18
+ m?.(e);
19
+ }, B = () => {
20
+ if (v) return v({
21
+ isOpen: L,
22
+ disabled: D
23
+ });
24
+ if (h !== void 0) return /* @__PURE__ */ u(n, {
25
+ ...E,
26
+ variant: w ?? M.buttonVariant ?? "secondary",
27
+ size: T ?? M.buttonSize ?? "medium",
28
+ disabled: D,
29
+ theme: N,
30
+ children: h
31
+ });
32
+ let r = _ !== void 0, i = g !== void 0;
33
+ return /* @__PURE__ */ u(n, {
34
+ ...E,
35
+ variant: w ?? M.buttonVariant ?? "secondary",
36
+ size: T ?? M.buttonSize ?? "medium",
37
+ disabled: D,
38
+ label: r ? void 0 : g,
39
+ theme: N,
40
+ children: r && /* @__PURE__ */ d(t, {
41
+ direction: "row",
42
+ alignItems: "center",
43
+ justifyContent: "center",
44
+ gap: M.iconGap ?? 8,
45
+ children: [_, i && /* @__PURE__ */ u(e, { text: String(g) })]
46
+ })
47
+ });
48
+ }, V = C ?? M.width;
49
+ return /* @__PURE__ */ u(r, {
50
+ ...k,
51
+ items: p,
52
+ onSelect: z,
53
+ isOpen: L,
54
+ onOpenChange: R,
55
+ placement: S ?? M.placement ?? "bottom-start",
56
+ ...V === void 0 ? {} : { width: V },
57
+ disabled: D,
58
+ theme: N,
59
+ trigger: B()
60
+ });
61
+ }
62
+ //#endregion
63
+ export { f as MenuButton };
package/dist/Modal.cjs ADDED
@@ -0,0 +1 @@
1
+ const e=require(`./primitives/View.cjs`);require(`./primitives.cjs`);const t=require(`./Portal.cjs`),n=require(`./useOverlayPresence.cjs`);let r=require(`@number10/jsx-core`),i=require(`@number10/jsx-core/jsx-runtime`);function a(e,t){if(!e||typeof e!=`object`)return;let n=e;if(typeof n.setVisible==`function`){n.setVisible(t);return}`visible`in n&&(n.visible=t)}(0,r.registerComponentDefaultsIfMissing)(`Modal`,{backdropColor:0,backdropOpacity:.5,openDuration:320,closeDuration:260});function o(t){let n=(0,r.useViewportSize)(),o=(0,r.useRef)(null),s=(0,r.useRef)(null),c=(0,r.useRef)(!1),l=(0,r.useRef)(!1),u=(0,r.useRef)(0),d=(0,r.useRef)(null),f=(0,r.useRef)(null),p=(0,r.useRef)(t.onOpen),m=(0,r.useRef)(t.onClosed),h=(0,r.useRef)(t.onRequestClose),g=(0,r.useCallback)(e=>{o.current=e},[]),_=(0,r.useCallback)(e=>{s.current=e},[]),v=(0,r.useCallback)(()=>{d.current!==null&&(window.clearTimeout(d.current),d.current=null)},[]),y=(0,r.useCallback)(()=>{f.current!==null&&(window.clearTimeout(f.current),f.current=null)},[]),b=(0,r.useCallback)(e=>{e&&typeof e==`object`&&(0,r.stopAnimationEffect)(e)},[]);return(0,r.useEffect)(()=>{p.current=t.onOpen,m.current=t.onClosed,h.current=t.onRequestClose},[t.onClosed,t.onOpen,t.onRequestClose]),(0,r.useEffect)(()=>{t.show||(c.current=!1,l.current=!1)},[t.show]),(0,r.useEffect)(()=>{let e=o.current,n=s.current;if(!e||!n)return;v(),y(),b(n),b(e);let i=()=>{let i=++u.current;c.current=!0,l.current=!1,t.closeRequestedRef.current=!1,a(e,!0),a(n,!0),p.current?.();let o=()=>{i===u.current&&(v(),t.finishEnter())};return d.current=window.setTimeout(()=>{o()},t.openDurationMs),(0,r.applyEffect)(n,t.viewOpenEffect,{time:t.openDurationMs,onComplete:o}),(0,r.applyEffect)(e,`fadeIn`,{time:t.openDurationMs}),()=>{i===u.current&&v()}};if(t.show&&t.phase===`entering`&&!c.current)return i();if(t.show&&t.phase===`entered`&&!c.current)return console.warn(`[Modal] starting enter animation on entered phase (likely async portal timing)`),i();if(!t.show&&t.phase===`exiting`&&!l.current){let i=++u.current;l.current=!0,a(e,!0),a(n,!0);let o=()=>{i===u.current&&(y(),a(e,!1),a(n,!1),t.finishExit(),(h.current!==void 0||!t.closeRequestedRef.current)&&m.current?.(),t.closeRequestedRef.current=!1)};return f.current=window.setTimeout(()=>{o()},t.closeDurationMs),(0,r.applyEffect)(n,t.viewCloseEffect,{time:t.closeDurationMs,onComplete:o}),(0,r.applyEffect)(e,`fadeOut`,{time:t.closeDurationMs}),()=>{i===u.current&&y()}}},[y,v,t.closeDurationMs,t.closeRequestedRef,t.finishEnter,t.finishExit,t.openDurationMs,t.phase,t.show,t.viewCloseEffect,t.viewOpenEffect,b]),(0,r.useEffect)(()=>()=>{v(),y(),b(s.current),b(o.current)},[y,v,b]),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(e.View,{ref:g,width:n.width,height:n.height,backgroundColor:t.themedModal.backdropColor??0,alpha:t.themedModal.backdropOpacity??.5,onTouch:e=>{e.stopPropagation(),t.closeOnBackdrop&&t.requestClose()},onTouchMove:e=>{e.stopPropagation()}}),(0,i.jsx)(e.View,{width:n.width,height:n.height,direction:`row`,justifyContent:`center`,alignItems:`center`,children:(0,i.jsx)(e.View,{ref:_,onTouch:e=>e.stopPropagation(),onTouchMove:e=>e.stopPropagation(),theme:t.nestedTheme,children:t.children})})]})}function s(e){let a=(0,r.useTheme)(),{props:s,nestedTheme:c}=(0,r.resolveComponentTheme)({componentName:`Modal`,globalTheme:(0,r.getGlobalThemeDefaults)(),localTheme:a,knownComponents:r.KNOWN_COMPONENTS}),l=s,u=e.closeOnBackdrop??!0,d=e.closeOnEscape??!0,f=l.openDuration??320,p=l.closeDuration??260,m=n.useOverlayPresence(e.show),h=(0,r.useRef)(!1),g=e.viewOpenEffect??`fadeIn`,_=e.viewCloseEffect??`fadeOut`,v=(0,r.useCallback)(()=>{if(h.current=!0,e.onRequestClose){e.onRequestClose();return}e.onClosed?.()},[e.onClosed,e.onRequestClose]);return(0,r.useEffect)(()=>{if(!d||!e.show)return;let t=e=>{e.key===`Escape`&&v()};return window.addEventListener(`keydown`,t),()=>window.removeEventListener(`keydown`,t)},[d,e.show,v]),m.isPresent?(0,i.jsx)(t.Portal,{...e.key&&{key:e.key},depth:e.depth??1e3,blockEvents:!1,children:(0,i.jsx)(o,{show:e.show,phase:m.phase,finishEnter:m.finishEnter,finishExit:m.finishExit,closeOnBackdrop:u,themedModal:l,nestedTheme:c,openDurationMs:f,closeDurationMs:p,viewOpenEffect:g,viewCloseEffect:_,onOpen:e.onOpen,onClosed:e.onClosed,onRequestClose:e.onRequestClose,requestClose:v,closeRequestedRef:h,children:e.children})}):null}exports.Modal=s;
@@ -0,0 +1,27 @@
1
+ import { ChildrenType, VNodeLike } from '@number10/jsx-core';
2
+ export interface ModalProps {
3
+ /** Unique key for VDOM identification */
4
+ key?: string;
5
+ /** request if modal should change its open/close state */
6
+ show: boolean;
7
+ /** Callback when modal should start closing (backdrop/Escape) */
8
+ onRequestClose?: (() => void) | undefined;
9
+ /** Callback when modal has been opened (at start of animation) */
10
+ onOpen?: (() => void) | undefined;
11
+ /** Callback when modal has been closed (at end of animation) */
12
+ onClosed?: (() => void) | undefined;
13
+ /** Close on backdrop click (default: true) */
14
+ closeOnBackdrop?: boolean | undefined;
15
+ /** Close on Escape key (default: true) */
16
+ closeOnEscape?: boolean | undefined;
17
+ /** Portal depth (default: 1000) */
18
+ depth?: number | undefined;
19
+ /** Custom effect name for showing modal content (default: fadeIn) */
20
+ viewOpenEffect?: string | undefined;
21
+ /** Custom effect name for hiding modal content (default: fadeOut) */
22
+ viewCloseEffect?: string | undefined;
23
+ /** Modal content */
24
+ children?: ChildrenType;
25
+ }
26
+ export declare function Modal(props: ModalProps): VNodeLike;
27
+ //# sourceMappingURL=Modal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../src/Modal.tsx"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C;;;;;GAKG;AACH,OAAO,KAAK,EAAE,YAAY,EAAgC,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAkB/F,MAAM,WAAW,UAAU;IACzB,yCAAyC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,0DAA0D;IAC1D,IAAI,EAAE,OAAO,CAAA;IACb,iEAAiE;IACjE,cAAc,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAA;IACzC,kEAAkE;IAClE,MAAM,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAA;IACjC,gEAAgE;IAChE,QAAQ,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAA;IACnC,8CAA8C;IAC9C,eAAe,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACrC,0CAA0C;IAC1C,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACnC,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1B,qEAAqE;IACrE,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACnC,qEAAqE;IACrE,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACpC,oBAAoB;IACpB,QAAQ,CAAC,EAAE,YAAY,CAAA;CACxB;AAgRD,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,CAsElD"}