@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.
- package/LICENSE +667 -0
- package/README.md +43 -0
- package/dist/Accordion.cjs +1 -0
- package/dist/Accordion.d.ts +43 -0
- package/dist/Accordion.d.ts.map +1 -0
- package/dist/Accordion.js +71 -0
- package/dist/Accordion.test.d.ts +2 -0
- package/dist/Accordion.test.d.ts.map +1 -0
- package/dist/ActivityIndicator.cjs +1 -0
- package/dist/ActivityIndicator.d.ts +21 -0
- package/dist/ActivityIndicator.d.ts.map +1 -0
- package/dist/ActivityIndicator.js +133 -0
- package/dist/AlertDialog.cjs +1 -0
- package/dist/AlertDialog.d.ts +53 -0
- package/dist/AlertDialog.d.ts.map +1 -0
- package/dist/AlertDialog.js +76 -0
- package/dist/Badge.cjs +1 -0
- package/dist/Badge.d.ts +96 -0
- package/dist/Badge.d.ts.map +1 -0
- package/dist/Badge.js +238 -0
- package/dist/Badge.test.d.ts +2 -0
- package/dist/Badge.test.d.ts.map +1 -0
- package/dist/BottomSheet.cjs +1 -0
- package/dist/BottomSheet.d.ts +72 -0
- package/dist/BottomSheet.d.ts.map +1 -0
- package/dist/BottomSheet.js +132 -0
- package/dist/Button.cjs +1 -0
- package/dist/Button.d.ts +61 -0
- package/dist/Button.d.ts.map +1 -0
- package/dist/Button.js +251 -0
- package/dist/Checkbox.cjs +1 -0
- package/dist/Checkbox.d.ts +40 -0
- package/dist/Checkbox.d.ts.map +1 -0
- package/dist/Checkbox.js +84 -0
- package/dist/Checkbox.test.d.ts +2 -0
- package/dist/Checkbox.test.d.ts.map +1 -0
- package/dist/ColorPicker.cjs +1 -0
- package/dist/ColorPicker.d.ts +48 -0
- package/dist/ColorPicker.d.ts.map +1 -0
- package/dist/ColorPicker.js +256 -0
- package/dist/DebugPanel.cjs +1 -0
- package/dist/DebugPanel.d.ts +63 -0
- package/dist/DebugPanel.d.ts.map +1 -0
- package/dist/DebugPanel.js +116 -0
- package/dist/Dialog.cjs +1 -0
- package/dist/Dialog.d.ts +59 -0
- package/dist/Dialog.d.ts.map +1 -0
- package/dist/Dialog.js +142 -0
- package/dist/Divider.cjs +1 -0
- package/dist/Divider.d.ts +19 -0
- package/dist/Divider.d.ts.map +1 -0
- package/dist/Divider.js +15 -0
- package/dist/Divider.test.d.ts +2 -0
- package/dist/Divider.test.d.ts.map +1 -0
- package/dist/Dropdown.cjs +1 -0
- package/dist/Dropdown.d.ts +35 -0
- package/dist/Dropdown.d.ts.map +1 -0
- package/dist/Dropdown.js +222 -0
- package/dist/Icon.cjs +1 -0
- package/dist/Icon.d.ts +71 -0
- package/dist/Icon.d.ts.map +1 -0
- package/dist/Icon.js +57 -0
- package/dist/Icon.test.d.ts +2 -0
- package/dist/Icon.test.d.ts.map +1 -0
- package/dist/Image.cjs +1 -0
- package/dist/Image.d.ts +10 -0
- package/dist/Image.d.ts.map +1 -0
- package/dist/Image.js +18 -0
- package/dist/Joystick.cjs +1 -0
- package/dist/Joystick.d.ts +32 -0
- package/dist/Joystick.d.ts.map +1 -0
- package/dist/Joystick.js +185 -0
- package/dist/ListBox.cjs +1 -0
- package/dist/ListBox.d.ts +67 -0
- package/dist/ListBox.d.ts.map +1 -0
- package/dist/ListBox.js +104 -0
- package/dist/ListBox.test.d.ts +2 -0
- package/dist/ListBox.test.d.ts.map +1 -0
- package/dist/MenuButton.cjs +1 -0
- package/dist/MenuButton.d.ts +33 -0
- package/dist/MenuButton.d.ts.map +1 -0
- package/dist/MenuButton.js +63 -0
- package/dist/Modal.cjs +1 -0
- package/dist/Modal.d.ts +27 -0
- package/dist/Modal.d.ts.map +1 -0
- package/dist/Modal.js +174 -0
- package/dist/Modal.test.d.ts +2 -0
- package/dist/Modal.test.d.ts.map +1 -0
- package/dist/NineSlice.cjs +1 -0
- package/dist/NineSlice.d.ts +40 -0
- package/dist/NineSlice.d.ts.map +1 -0
- package/dist/NineSlice.js +314 -0
- package/dist/NineSlice.props.test.d.ts +2 -0
- package/dist/NineSlice.props.test.d.ts.map +1 -0
- package/dist/NineSlice.test.d.ts +2 -0
- package/dist/NineSlice.test.d.ts.map +1 -0
- package/dist/NineSliceButton.cjs +1 -0
- package/dist/NineSliceButton.d.ts +94 -0
- package/dist/NineSliceButton.d.ts.map +1 -0
- package/dist/NineSliceButton.js +61 -0
- package/dist/NineSliceButton.test.d.ts +2 -0
- package/dist/NineSliceButton.test.d.ts.map +1 -0
- package/dist/NumberInput.cjs +1 -0
- package/dist/NumberInput.d.ts +90 -0
- package/dist/NumberInput.d.ts.map +1 -0
- package/dist/NumberInput.js +222 -0
- package/dist/NumberInput.test.d.ts +2 -0
- package/dist/NumberInput.test.d.ts.map +1 -0
- package/dist/PalettePicker.cjs +1 -0
- package/dist/PalettePicker.d.ts +49 -0
- package/dist/PalettePicker.d.ts.map +1 -0
- package/dist/PalettePicker.js +152 -0
- package/dist/PalettePicker.test.d.ts +2 -0
- package/dist/PalettePicker.test.d.ts.map +1 -0
- package/dist/Popover.cjs +1 -0
- package/dist/Popover.d.ts +95 -0
- package/dist/Popover.d.ts.map +1 -0
- package/dist/Popover.js +267 -0
- package/dist/Portal.cjs +1 -0
- package/dist/Portal.d.ts +30 -0
- package/dist/Portal.d.ts.map +1 -0
- package/dist/Portal.js +64 -0
- package/dist/Portal.test.d.ts +2 -0
- package/dist/Portal.test.d.ts.map +1 -0
- package/dist/ProgressBar.cjs +1 -0
- package/dist/ProgressBar.d.ts +61 -0
- package/dist/ProgressBar.d.ts.map +1 -0
- package/dist/ProgressBar.js +80 -0
- package/dist/ProgressBar.test.d.ts +2 -0
- package/dist/ProgressBar.test.d.ts.map +1 -0
- package/dist/ProgressView.cjs +1 -0
- package/dist/ProgressView.d.ts +37 -0
- package/dist/ProgressView.d.ts.map +1 -0
- package/dist/ProgressView.js +71 -0
- package/dist/RadioButton.cjs +1 -0
- package/dist/RadioButton.d.ts +21 -0
- package/dist/RadioButton.d.ts.map +1 -0
- package/dist/RadioButton.js +53 -0
- package/dist/RadioGroup.cjs +1 -0
- package/dist/RadioGroup.d.ts +26 -0
- package/dist/RadioGroup.d.ts.map +1 -0
- package/dist/RadioGroup.js +32 -0
- package/dist/RatingBar.cjs +1 -0
- package/dist/RatingBar.d.ts +24 -0
- package/dist/RatingBar.d.ts.map +1 -0
- package/dist/RatingBar.js +84 -0
- package/dist/ScrollSlider.cjs +1 -0
- package/dist/ScrollSlider.d.ts +48 -0
- package/dist/ScrollSlider.d.ts.map +1 -0
- package/dist/ScrollSlider.js +93 -0
- package/dist/ScrollView.cjs +1 -0
- package/dist/ScrollView.d.ts +121 -0
- package/dist/ScrollView.d.ts.map +1 -0
- package/dist/ScrollView.js +541 -0
- package/dist/ScrollView.test.d.ts +2 -0
- package/dist/ScrollView.test.d.ts.map +1 -0
- package/dist/SegmentedControl.cjs +1 -0
- package/dist/SegmentedControl.d.ts +50 -0
- package/dist/SegmentedControl.d.ts.map +1 -0
- package/dist/SegmentedControl.js +201 -0
- package/dist/SegmentedControl.test.d.ts +2 -0
- package/dist/SegmentedControl.test.d.ts.map +1 -0
- package/dist/Sidebar.cjs +1 -0
- package/dist/Sidebar.d.ts +36 -0
- package/dist/Sidebar.d.ts.map +1 -0
- package/dist/Sidebar.js +122 -0
- package/dist/Slider.cjs +1 -0
- package/dist/Slider.d.ts +80 -0
- package/dist/Slider.d.ts.map +1 -0
- package/dist/Slider.js +233 -0
- package/dist/Tabs.cjs +1 -0
- package/dist/Tabs.d.ts +23 -0
- package/dist/Tabs.d.ts.map +1 -0
- package/dist/Tabs.js +101 -0
- package/dist/TextInput.cjs +17 -0
- package/dist/TextInput.d.ts +82 -0
- package/dist/TextInput.d.ts.map +1 -0
- package/dist/TextInput.js +441 -0
- package/dist/Toast.cjs +1 -0
- package/dist/Toast.d.ts +66 -0
- package/dist/Toast.d.ts.map +1 -0
- package/dist/Toast.js +188 -0
- package/dist/Toast.test.d.ts +2 -0
- package/dist/Toast.test.d.ts.map +1 -0
- package/dist/Toggle.cjs +1 -0
- package/dist/Toggle.d.ts +14 -0
- package/dist/Toggle.d.ts.map +1 -0
- package/dist/Toggle.js +135 -0
- package/dist/Toolbar.cjs +1 -0
- package/dist/Toolbar.d.ts +129 -0
- package/dist/Toolbar.d.ts.map +1 -0
- package/dist/Toolbar.js +159 -0
- package/dist/Toolbar.test.d.ts +2 -0
- package/dist/Toolbar.test.d.ts.map +1 -0
- package/dist/TransformOriginView.cjs +1 -0
- package/dist/TransformOriginView.d.ts +8 -0
- package/dist/TransformOriginView.d.ts.map +1 -0
- package/dist/TransformOriginView.js +38 -0
- package/dist/WheelPicker.cjs +1 -0
- package/dist/WheelPicker.d.ts +58 -0
- package/dist/WheelPicker.d.ts.map +1 -0
- package/dist/WheelPicker.js +167 -0
- package/dist/WrapText.cjs +1 -0
- package/dist/WrapText.d.ts +83 -0
- package/dist/WrapText.d.ts.map +1 -0
- package/dist/WrapText.js +93 -0
- package/dist/WrapText.test.d.ts +2 -0
- package/dist/WrapText.test.d.ts.map +1 -0
- package/dist/contrast-slot-map.d.ts +33 -0
- package/dist/contrast-slot-map.d.ts.map +1 -0
- package/dist/index.cjs +1 -0
- package/dist/index.d.ts +64 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +54 -0
- package/dist/primitives/Image.cjs +1 -0
- package/dist/primitives/Image.d.ts +11 -0
- package/dist/primitives/Image.d.ts.map +1 -0
- package/dist/primitives/Image.js +7 -0
- package/dist/primitives/Sprite.cjs +1 -0
- package/dist/primitives/Sprite.d.ts +11 -0
- package/dist/primitives/Sprite.d.ts.map +1 -0
- package/dist/primitives/Sprite.js +7 -0
- package/dist/primitives/Text.cjs +1 -0
- package/dist/primitives/Text.d.ts +14 -0
- package/dist/primitives/Text.d.ts.map +1 -0
- package/dist/primitives/Text.js +15 -0
- package/dist/primitives/VectorDrawContent.cjs +1 -0
- package/dist/primitives/VectorDrawContent.d.ts +3 -0
- package/dist/primitives/VectorDrawContent.d.ts.map +1 -0
- package/dist/primitives/VectorDrawContent.js +7 -0
- package/dist/primitives/View.cjs +1 -0
- package/dist/primitives/View.d.ts +13 -0
- package/dist/primitives/View.d.ts.map +1 -0
- package/dist/primitives/View.js +7 -0
- package/dist/primitives/index.d.ts +13 -0
- package/dist/primitives/index.d.ts.map +1 -0
- package/dist/primitives/primitives.test.d.ts +2 -0
- package/dist/primitives/primitives.test.d.ts.map +1 -0
- package/dist/primitives.cjs +1 -0
- package/dist/primitives.d.ts +2 -0
- package/dist/primitives.js +6 -0
- package/dist/theme-defaults.cjs +1 -0
- package/dist/theme-defaults.d.ts +12 -0
- package/dist/theme-defaults.d.ts.map +1 -0
- package/dist/theme-defaults.js +1288 -0
- package/dist/theme-defaults.test.d.ts +2 -0
- package/dist/theme-defaults.test.d.ts.map +1 -0
- package/dist/theme-types.cjs +0 -0
- package/dist/theme-types.d.ts +708 -0
- package/dist/theme-types.d.ts.map +1 -0
- package/dist/theme-types.js +0 -0
- package/dist/useOverlayPresence.cjs +1 -0
- package/dist/useOverlayPresence.d.ts +24 -0
- package/dist/useOverlayPresence.d.ts.map +1 -0
- package/dist/useOverlayPresence.js +19 -0
- package/package.json +83 -0
package/dist/Joystick.js
ADDED
|
@@ -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 };
|
package/dist/ListBox.cjs
ADDED
|
@@ -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"}
|
package/dist/ListBox.js
ADDED
|
@@ -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 @@
|
|
|
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;
|
package/dist/Modal.d.ts
ADDED
|
@@ -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"}
|