@plastic-js/tsumiki 0.1.22 → 0.1.24

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 (199) hide show
  1. package/README.md +838 -65
  2. package/dist/components/Accordion.js +93 -4
  3. package/dist/components/Avatar.js +96 -4
  4. package/dist/components/BottomSheet.js +131 -0
  5. package/dist/components/Button.js +194 -0
  6. package/dist/components/CardNumberInput.js +28 -44
  7. package/dist/components/Carousel.js +71 -5
  8. package/dist/components/Checkbox.js +178 -4
  9. package/dist/components/Clipboard.js +135 -5
  10. package/dist/components/CloseButton.js +97 -0
  11. package/dist/components/Collapsible.js +22 -4
  12. package/dist/components/ColorPicker.js +327 -4
  13. package/dist/components/Combobox.js +86 -13
  14. package/dist/components/ConfirmDialog.js +174 -19
  15. package/dist/components/DateInput.js +437 -5
  16. package/dist/components/{DatePickerMobile/wheel.js → DateWheel.js} +1 -3
  17. package/dist/components/Dialog.js +214 -110
  18. package/dist/components/Drawer.js +169 -4
  19. package/dist/components/Field.js +121 -5
  20. package/dist/components/Fieldset.js +64 -5
  21. package/dist/components/FileUpload.js +181 -4
  22. package/dist/components/FocusTrap.js +0 -2
  23. package/dist/components/Icon.js +32 -17
  24. package/dist/components/Input.js +211 -0
  25. package/dist/components/Listbox.js +47 -4
  26. package/dist/components/Menu.js +99 -4
  27. package/dist/components/MoneyInput.js +33 -85
  28. package/dist/components/NumberInput.js +117 -4
  29. package/dist/components/Pagination.js +91 -5
  30. package/dist/components/Popover.js +123 -4
  31. package/dist/components/Portal.js +0 -2
  32. package/dist/components/Presence.js +0 -2
  33. package/dist/components/Progress.js +107 -4
  34. package/dist/components/RadioGroup.js +104 -4
  35. package/dist/components/RatingGroup.js +75 -4
  36. package/dist/components/SearchInput.js +60 -55
  37. package/dist/components/Select.js +428 -5
  38. package/dist/components/SelectPc.js +239 -0
  39. package/dist/components/SignaturePad.js +77 -4
  40. package/dist/components/Skeleton.js +2 -4
  41. package/dist/components/Slider.js +112 -4
  42. package/dist/components/Spinner.js +41 -0
  43. package/dist/components/Splitter.js +51 -4
  44. package/dist/components/Steps.js +259 -4
  45. package/dist/components/SwipeReveal.js +2 -4
  46. package/dist/components/Switch.js +147 -4
  47. package/dist/components/Tabs.js +80 -4
  48. package/dist/components/TagsInput.js +128 -4
  49. package/dist/components/Toast.js +174 -4
  50. package/dist/components/Toggle.js +39 -4
  51. package/dist/components/ToggleGroup.js +103 -4
  52. package/dist/components/Tour.js +63 -4
  53. package/dist/components/TreeView.js +113 -4
  54. package/dist/index.js +44 -45
  55. package/dist/tsumiki.css +1 -0
  56. package/docs/api.md +670 -0
  57. package/docs/component-api-pattern.md +362 -0
  58. package/package.json +16 -6
  59. package/src/styles/color.css +112 -0
  60. package/src/styles/index.css +1 -0
  61. package/src/styles/radius.css +27 -0
  62. package/src/styles/reset.css +111 -0
  63. package/src/styles/shadow.css +5 -0
  64. package/src/styles/sizing.css +59 -0
  65. package/src/styles/spacing.css +9 -0
  66. package/src/styles/theme.css +38 -0
  67. package/src/styles/tokens.css +22 -0
  68. package/src/styles/transition.css +5 -0
  69. package/src/styles/typography.css +8 -0
  70. package/dist/components/Accordion.js.map +0 -1
  71. package/dist/components/Avatar.js.map +0 -1
  72. package/dist/components/CardNumberInput.js.map +0 -1
  73. package/dist/components/Carousel.js.map +0 -1
  74. package/dist/components/Checkbox.js.map +0 -1
  75. package/dist/components/Clipboard.js.map +0 -1
  76. package/dist/components/Collapsible.js.map +0 -1
  77. package/dist/components/ColorPicker.js.map +0 -1
  78. package/dist/components/Combobox.js.map +0 -1
  79. package/dist/components/ConfirmDialog.js.map +0 -1
  80. package/dist/components/DateInput.js.map +0 -1
  81. package/dist/components/DatePicker.js +0 -7
  82. package/dist/components/DatePicker.js.map +0 -1
  83. package/dist/components/DatePickerMobile/index.js +0 -479
  84. package/dist/components/DatePickerMobile/index.js.map +0 -1
  85. package/dist/components/DatePickerMobile/wheel.js.map +0 -1
  86. package/dist/components/Dialog.js.map +0 -1
  87. package/dist/components/Drawer.js.map +0 -1
  88. package/dist/components/Field.js.map +0 -1
  89. package/dist/components/Fieldset.js.map +0 -1
  90. package/dist/components/FileUpload.js.map +0 -1
  91. package/dist/components/FilterableSelect.js +0 -210
  92. package/dist/components/FilterableSelect.js.map +0 -1
  93. package/dist/components/FilterableSelectMobile.js +0 -167
  94. package/dist/components/FilterableSelectMobile.js.map +0 -1
  95. package/dist/components/FocusTrap.js.map +0 -1
  96. package/dist/components/HoverCard.js +0 -7
  97. package/dist/components/HoverCard.js.map +0 -1
  98. package/dist/components/Icon.js.map +0 -1
  99. package/dist/components/Listbox.js.map +0 -1
  100. package/dist/components/Menu.js.map +0 -1
  101. package/dist/components/MoneyInput.js.map +0 -1
  102. package/dist/components/NumberInput.js.map +0 -1
  103. package/dist/components/Pagination.js.map +0 -1
  104. package/dist/components/Popover.js.map +0 -1
  105. package/dist/components/Portal.js.map +0 -1
  106. package/dist/components/Presence.js.map +0 -1
  107. package/dist/components/Progress.js.map +0 -1
  108. package/dist/components/RadioGroup.js.map +0 -1
  109. package/dist/components/RatingGroup.js.map +0 -1
  110. package/dist/components/SearchInput.js.map +0 -1
  111. package/dist/components/Select.js.map +0 -1
  112. package/dist/components/SelectMobile/anatomy.js +0 -10
  113. package/dist/components/SelectMobile/anatomy.js.map +0 -1
  114. package/dist/components/SelectMobile/index.js +0 -310
  115. package/dist/components/SelectMobile/index.js.map +0 -1
  116. package/dist/components/SignaturePad.js.map +0 -1
  117. package/dist/components/Skeleton.js.map +0 -1
  118. package/dist/components/Slider.js.map +0 -1
  119. package/dist/components/Splitter.js.map +0 -1
  120. package/dist/components/Steps.js.map +0 -1
  121. package/dist/components/SwipeReveal.js.map +0 -1
  122. package/dist/components/Switch.js.map +0 -1
  123. package/dist/components/Tabs.js.map +0 -1
  124. package/dist/components/TagsInput.js.map +0 -1
  125. package/dist/components/Toast.js.map +0 -1
  126. package/dist/components/Toggle.js.map +0 -1
  127. package/dist/components/ToggleGroup.js.map +0 -1
  128. package/dist/components/Tooltip.js +0 -7
  129. package/dist/components/Tooltip.js.map +0 -1
  130. package/dist/components/Tour.js.map +0 -1
  131. package/dist/components/TreeView.js.map +0 -1
  132. package/dist/node_modules/framesync/dist/es/create-render-step.js +0 -54
  133. package/dist/node_modules/framesync/dist/es/create-render-step.js.map +0 -1
  134. package/dist/node_modules/framesync/dist/es/index.js +0 -61
  135. package/dist/node_modules/framesync/dist/es/index.js.map +0 -1
  136. package/dist/node_modules/framesync/dist/es/on-next-frame.js +0 -8
  137. package/dist/node_modules/framesync/dist/es/on-next-frame.js.map +0 -1
  138. package/dist/node_modules/hey-listen/dist/hey-listen.es.js +0 -15
  139. package/dist/node_modules/hey-listen/dist/hey-listen.es.js.map +0 -1
  140. package/dist/node_modules/popmotion/dist/es/animations/generators/decay.js +0 -24
  141. package/dist/node_modules/popmotion/dist/es/animations/generators/decay.js.map +0 -1
  142. package/dist/node_modules/popmotion/dist/es/animations/generators/keyframes.js +0 -40
  143. package/dist/node_modules/popmotion/dist/es/animations/generators/keyframes.js.map +0 -1
  144. package/dist/node_modules/popmotion/dist/es/animations/generators/spring.js +0 -96
  145. package/dist/node_modules/popmotion/dist/es/animations/generators/spring.js.map +0 -1
  146. package/dist/node_modules/popmotion/dist/es/animations/index.js +0 -94
  147. package/dist/node_modules/popmotion/dist/es/animations/index.js.map +0 -1
  148. package/dist/node_modules/popmotion/dist/es/animations/inertia.js +0 -74
  149. package/dist/node_modules/popmotion/dist/es/animations/inertia.js.map +0 -1
  150. package/dist/node_modules/popmotion/dist/es/animations/utils/detect-animation-from-options.js +0 -21
  151. package/dist/node_modules/popmotion/dist/es/animations/utils/detect-animation-from-options.js.map +0 -1
  152. package/dist/node_modules/popmotion/dist/es/animations/utils/elapsed.js +0 -14
  153. package/dist/node_modules/popmotion/dist/es/animations/utils/elapsed.js.map +0 -1
  154. package/dist/node_modules/popmotion/dist/es/animations/utils/find-spring.js +0 -68
  155. package/dist/node_modules/popmotion/dist/es/animations/utils/find-spring.js.map +0 -1
  156. package/dist/node_modules/popmotion/dist/es/easing/index.js +0 -28
  157. package/dist/node_modules/popmotion/dist/es/easing/index.js.map +0 -1
  158. package/dist/node_modules/popmotion/dist/es/easing/utils.js +0 -13
  159. package/dist/node_modules/popmotion/dist/es/easing/utils.js.map +0 -1
  160. package/dist/node_modules/popmotion/dist/es/utils/clamp.js +0 -6
  161. package/dist/node_modules/popmotion/dist/es/utils/clamp.js.map +0 -1
  162. package/dist/node_modules/popmotion/dist/es/utils/hsla-to-rgba.js +0 -35
  163. package/dist/node_modules/popmotion/dist/es/utils/hsla-to-rgba.js.map +0 -1
  164. package/dist/node_modules/popmotion/dist/es/utils/inc.js +0 -6
  165. package/dist/node_modules/popmotion/dist/es/utils/inc.js.map +0 -1
  166. package/dist/node_modules/popmotion/dist/es/utils/interpolate.js +0 -69
  167. package/dist/node_modules/popmotion/dist/es/utils/interpolate.js.map +0 -1
  168. package/dist/node_modules/popmotion/dist/es/utils/mix-color.js +0 -45
  169. package/dist/node_modules/popmotion/dist/es/utils/mix-color.js.map +0 -1
  170. package/dist/node_modules/popmotion/dist/es/utils/mix-complex.js +0 -61
  171. package/dist/node_modules/popmotion/dist/es/utils/mix-complex.js.map +0 -1
  172. package/dist/node_modules/popmotion/dist/es/utils/mix.js +0 -6
  173. package/dist/node_modules/popmotion/dist/es/utils/mix.js.map +0 -1
  174. package/dist/node_modules/popmotion/dist/es/utils/pipe.js +0 -7
  175. package/dist/node_modules/popmotion/dist/es/utils/pipe.js.map +0 -1
  176. package/dist/node_modules/popmotion/dist/es/utils/progress.js +0 -9
  177. package/dist/node_modules/popmotion/dist/es/utils/progress.js.map +0 -1
  178. package/dist/node_modules/popmotion/dist/es/utils/velocity-per-second.js +0 -8
  179. package/dist/node_modules/popmotion/dist/es/utils/velocity-per-second.js.map +0 -1
  180. package/dist/node_modules/popmotion/node_modules/tslib/tslib.es6.js +0 -13
  181. package/dist/node_modules/popmotion/node_modules/tslib/tslib.es6.js.map +0 -1
  182. package/dist/node_modules/style-value-types/dist/es/color/hex.js +0 -39
  183. package/dist/node_modules/style-value-types/dist/es/color/hex.js.map +0 -1
  184. package/dist/node_modules/style-value-types/dist/es/color/hsla.js +0 -16
  185. package/dist/node_modules/style-value-types/dist/es/color/hsla.js.map +0 -1
  186. package/dist/node_modules/style-value-types/dist/es/color/index.js +0 -20
  187. package/dist/node_modules/style-value-types/dist/es/color/index.js.map +0 -1
  188. package/dist/node_modules/style-value-types/dist/es/color/rgba.js +0 -15
  189. package/dist/node_modules/style-value-types/dist/es/color/rgba.js.map +0 -1
  190. package/dist/node_modules/style-value-types/dist/es/color/utils.js +0 -19
  191. package/dist/node_modules/style-value-types/dist/es/color/utils.js.map +0 -1
  192. package/dist/node_modules/style-value-types/dist/es/complex/index.js +0 -58
  193. package/dist/node_modules/style-value-types/dist/es/complex/index.js.map +0 -1
  194. package/dist/node_modules/style-value-types/dist/es/numbers/index.js +0 -13
  195. package/dist/node_modules/style-value-types/dist/es/numbers/index.js.map +0 -1
  196. package/dist/node_modules/style-value-types/dist/es/numbers/units.js +0 -16
  197. package/dist/node_modules/style-value-types/dist/es/numbers/units.js.map +0 -1
  198. package/dist/node_modules/style-value-types/dist/es/utils.js +0 -13
  199. package/dist/node_modules/style-value-types/dist/es/utils.js.map +0 -1
@@ -1,7 +1,430 @@
1
- import { Select } from "@plastic-js/ark";
1
+ import Icon from "./Icon.js";
2
+ import { Fragment, insert, jsx, mergeProps, setProp, template } from "@plastic-js/plastic/jsx-runtime";
3
+ import { css } from "@emotion/css";
4
+ import { Loop, createContext, createEffect, createSignal, splitProps, useContext } from "@plastic-js/plastic";
2
5
  //#region src/components/Select.jsx
3
- var Select_default = Select;
6
+ var _tmpl4 = template("<div>No results</div>");
7
+ var _tmpl3 = template("<button type=\"button\" aria-label=\"Clear search\"></button>");
8
+ var _tmpl2 = template("<div><span aria-hidden=\"true\"></span><input type=\"text\" placeholder=\"Search…\"><!></div>");
9
+ var _tmpl = template("<span></span>");
10
+ var SCOPE = "select";
11
+ var part = (name) => ({
12
+ "data-scope": SCOPE,
13
+ "data-part": name
14
+ });
15
+ var chevronDownSvg = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m6 9 6 6 6-6\"/></svg>";
16
+ var checkSvg = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6 9 17l-5-5\"/></svg>";
17
+ var searchSvg = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7\"/><path d=\"M21 21l-4.35-4.35\"/></svg>";
18
+ var xSvg = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>";
19
+ var triggerClass = css({
20
+ flexShrink: 0,
21
+ width: "100%",
22
+ height: "44px",
23
+ display: "flex",
24
+ alignItems: "center",
25
+ justifyContent: "space-between",
26
+ gap: "4px",
27
+ background: "var(--tsu-neutral-2)",
28
+ border: "1px solid var(--tsu-accent-8)",
29
+ borderRadius: "10px",
30
+ padding: "0 10px",
31
+ color: "var(--tsu-fg)",
32
+ fontSize: "15px",
33
+ fontFamily: "inherit",
34
+ textAlign: "left",
35
+ outline: "none",
36
+ cursor: "pointer",
37
+ WebkitTapHighlightColor: "transparent",
38
+ "&:focus-visible": { borderColor: "var(--tsu-accent-9)" },
39
+ "&[data-disabled]": {
40
+ backgroundColor: "var(--tsu-disabled-bg)",
41
+ borderColor: "var(--tsu-disabled-border)",
42
+ color: "var(--tsu-disabled-fg)",
43
+ cursor: "not-allowed"
44
+ }
45
+ });
46
+ var triggerValueClass = css({
47
+ overflow: "hidden",
48
+ textOverflow: "ellipsis",
49
+ whiteSpace: "nowrap"
50
+ });
51
+ var triggerPlaceholderClass = css({ color: "var(--tsu-neutral-11)" });
52
+ var triggerIndicatorClass = css({
53
+ flexShrink: 0,
54
+ color: "var(--tsu-neutral-11)",
55
+ display: "flex",
56
+ "& svg": {
57
+ width: "16px",
58
+ height: "16px"
59
+ }
60
+ });
61
+ var overlayClass = css({
62
+ position: "fixed",
63
+ inset: 0,
64
+ zIndex: 1e3,
65
+ display: "flex",
66
+ flexDirection: "column",
67
+ justifyContent: "flex-end",
68
+ pointerEvents: "none"
69
+ });
70
+ var backdropClass = css({
71
+ position: "absolute",
72
+ inset: 0,
73
+ background: "rgba(0,0,0,0.5)",
74
+ opacity: 0,
75
+ transition: "opacity 240ms ease"
76
+ });
77
+ var sheetClass = css({
78
+ position: "relative",
79
+ width: "100%",
80
+ maxHeight: "70vh",
81
+ display: "flex",
82
+ flexDirection: "column",
83
+ background: "var(--tsu-bg)",
84
+ borderTop: "1px solid var(--tsu-neutral-7)",
85
+ borderRadius: "18px 18px 0 0",
86
+ boxShadow: "0 -8px 32px rgba(0,0,0,0.4)",
87
+ paddingBottom: "env(safe-area-inset-bottom, 0px)",
88
+ transform: "translateY(100%)",
89
+ transition: "transform 280ms cubic-bezier(0.32, 0.72, 0, 1)"
90
+ });
91
+ var openClass = css({
92
+ pointerEvents: "auto",
93
+ [`& .${backdropClass}`]: { opacity: 1 },
94
+ [`& .${sheetClass}`]: { transform: "translateY(0)" }
95
+ });
96
+ var grabberClass = css({
97
+ flexShrink: 0,
98
+ display: "flex",
99
+ justifyContent: "center",
100
+ padding: "10px 0 4px"
101
+ });
102
+ var grabberBarClass = css({
103
+ width: "36px",
104
+ height: "4px",
105
+ borderRadius: "999px",
106
+ background: "var(--tsu-neutral-7)"
107
+ });
108
+ var listClass = css({
109
+ overflowY: "auto",
110
+ WebkitOverflowScrolling: "touch",
111
+ padding: "0 8px 8px"
112
+ });
113
+ var itemClass = css({
114
+ width: "100%",
115
+ display: "flex",
116
+ alignItems: "center",
117
+ justifyContent: "space-between",
118
+ gap: "10px",
119
+ height: "52px",
120
+ padding: "0 14px",
121
+ background: "transparent",
122
+ border: "none",
123
+ borderRadius: "12px",
124
+ color: "var(--tsu-fg)",
125
+ fontSize: "16px",
126
+ fontFamily: "inherit",
127
+ textAlign: "left",
128
+ cursor: "pointer",
129
+ "&:active": { background: "rgba(255,255,255,0.06)" },
130
+ "&[data-selected]": { background: "var(--tsu-accent-2)" }
131
+ });
132
+ var itemIndicatorClass = css({
133
+ flexShrink: 0,
134
+ color: "var(--tsu-accent-9)",
135
+ display: "flex",
136
+ "& svg": {
137
+ width: "18px",
138
+ height: "18px"
139
+ }
140
+ });
141
+ var filterWrapperClass = css({
142
+ position: "relative",
143
+ marginBottom: "6px"
144
+ });
145
+ var filterInputClass = css({
146
+ width: "100%",
147
+ height: "42px",
148
+ padding: "0 36px 0 40px",
149
+ background: "var(--tsu-neutral-2)",
150
+ border: "1px solid var(--tsu-accent-8)",
151
+ borderRadius: "10px",
152
+ color: "var(--tsu-fg)",
153
+ fontSize: "16px",
154
+ fontFamily: "inherit",
155
+ outline: "none",
156
+ boxSizing: "border-box",
157
+ "&:focus": { borderColor: "var(--tsu-accent-9)" },
158
+ "&::placeholder": { color: "var(--tsu-neutral-11)" },
159
+ "&::-webkit-search-cancel-button": { appearance: "none" }
160
+ });
161
+ var filterIconClass = css({
162
+ position: "absolute",
163
+ left: "12px",
164
+ top: "50%",
165
+ transform: "translateY(-50%)",
166
+ color: "var(--tsu-neutral-11)",
167
+ pointerEvents: "none",
168
+ display: "flex",
169
+ "& svg": {
170
+ width: "18px",
171
+ height: "18px"
172
+ }
173
+ });
174
+ var filterClearClass = css({
175
+ position: "absolute",
176
+ right: "4px",
177
+ top: "50%",
178
+ transform: "translateY(-50%)",
179
+ width: "28px",
180
+ height: "28px",
181
+ padding: "4px",
182
+ display: "flex",
183
+ alignItems: "center",
184
+ justifyContent: "center",
185
+ background: "none",
186
+ border: "none",
187
+ borderRadius: "6px",
188
+ color: "var(--tsu-neutral-11)",
189
+ cursor: "pointer",
190
+ "& svg": {
191
+ width: "16px",
192
+ height: "16px"
193
+ }
194
+ });
195
+ var noResultsClass = css({
196
+ padding: "20px 14px",
197
+ textAlign: "center",
198
+ color: "var(--tsu-neutral-11)",
199
+ fontSize: "14px"
200
+ });
201
+ var SelectContext = createContext(null);
202
+ var useSelect = () => {
203
+ const ctx = useContext(SelectContext);
204
+ if (!ctx) throw new Error("SelectTrigger must be used inside <Select>");
205
+ return ctx;
206
+ };
207
+ var read = (source) => {
208
+ return typeof source === "function" ? source() : source;
209
+ };
210
+ var Select = (props) => {
211
+ const [local, rest] = splitProps(props, [
212
+ "value",
213
+ "onValueChange",
214
+ "items",
215
+ "itemToValue",
216
+ "itemToLabel",
217
+ "open",
218
+ "onOpenChange",
219
+ "disabled",
220
+ "children",
221
+ "clearable",
222
+ "clearLabel",
223
+ "backdropClassName",
224
+ "backdropStyle",
225
+ "filter"
226
+ ]);
227
+ const open = (v) => {
228
+ if (v === void 0) return read(local.open);
229
+ document.body.style.overflow = v ? "hidden" : "";
230
+ if (!v) query("");
231
+ local.onOpenChange?.(v);
232
+ };
233
+ const itemToValue = (item) => {
234
+ if (item == null) return;
235
+ return local.itemToValue ? local.itemToValue(item) : item.value;
236
+ };
237
+ const itemToLabel = (item) => {
238
+ if (item == null) return;
239
+ return local.itemToLabel ? local.itemToLabel(item) : item.label;
240
+ };
241
+ const items = () => read(local.items) || [];
242
+ const value = () => read(local.value) ?? "";
243
+ const isSelected = (v) => String(value()) === String(v);
244
+ const selectedItem = () => items().find((item) => isSelected(itemToValue(item)));
245
+ const setValue = (v) => {
246
+ local.onValueChange?.(v);
247
+ open(false);
248
+ };
249
+ const query = createSignal("");
250
+ const filterFn = typeof local.filter === "function" ? local.filter : (item, q, toLabel) => String(toLabel(item)).toLowerCase().includes(q);
251
+ const filteredItems = () => {
252
+ const q = query().trim().toLowerCase();
253
+ const list = items();
254
+ if (!q) return list;
255
+ return list.filter((item) => filterFn(item, q, itemToLabel));
256
+ };
257
+ createEffect(() => {
258
+ if (!open()) return;
259
+ const onKey = (e) => {
260
+ if (e.key === "Escape") open(false);
261
+ };
262
+ document.addEventListener("keydown", onKey);
263
+ return () => {
264
+ document.removeEventListener("keydown", onKey);
265
+ };
266
+ });
267
+ const ctx = {
268
+ open,
269
+ value,
270
+ items,
271
+ itemToValue,
272
+ itemToLabel,
273
+ isSelected,
274
+ selectedItem,
275
+ setValue,
276
+ disabled: () => local.disabled ?? false,
277
+ clearable: local.clearable,
278
+ clearLabel: local.clearLabel,
279
+ backdropClassName: local.backdropClassName,
280
+ backdropStyle: local.backdropStyle,
281
+ filter: local.filter,
282
+ query,
283
+ filteredItems
284
+ };
285
+ return jsx(SelectContext.Provider, mergeProps({
286
+ value: ctx,
287
+ children: () => jsx("div", mergeProps(() => part("root"), rest, { children: [() => local.children, jsx(Content, {})] }))
288
+ }));
289
+ };
290
+ var SelectTrigger = (props) => {
291
+ const ctx = useSelect();
292
+ const [local, rest] = splitProps(props, [
293
+ "placeholder",
294
+ "className",
295
+ "children"
296
+ ]);
297
+ return jsx("div", mergeProps(() => part("trigger"), {
298
+ get className() {
299
+ return `${triggerClass} ${local.className || ""}`;
300
+ },
301
+ "data-disabled": () => ctx.disabled() ? "" : void 0,
302
+ onClick: () => {
303
+ if (!ctx.disabled()) ctx.open(true);
304
+ },
305
+ role: "button",
306
+ get tabIndex() {
307
+ return ctx.disabled() ? -1 : 0;
308
+ }
309
+ }, rest, { children: () => local.children ?? jsx(Fragment, { children: [jsx("span", mergeProps(() => part("triggerValue"), {
310
+ get className() {
311
+ return `${triggerValueClass} ${ctx.selectedItem() ? "" : triggerPlaceholderClass}`;
312
+ },
313
+ children: () => {
314
+ const item = ctx.selectedItem();
315
+ return item !== void 0 ? ctx.itemToLabel(item) : local.placeholder ?? "Select";
316
+ }
317
+ })), jsx("span", mergeProps(() => part("triggerIndicator"), {
318
+ className: triggerIndicatorClass,
319
+ children: jsx(Icon, mergeProps({ svg: chevronDownSvg }))
320
+ }))] }) }));
321
+ };
322
+ var Item = (props) => {
323
+ const ctx = useSelect();
324
+ const [local, rest] = splitProps(props, [
325
+ "item",
326
+ "value",
327
+ "className",
328
+ "children"
329
+ ]);
330
+ const value = () => local.item !== void 0 ? ctx.itemToValue(local.item) : local.value;
331
+ return jsx("button", mergeProps(() => part("item"), {
332
+ get className() {
333
+ return `${itemClass} ${local.className || ""}`;
334
+ },
335
+ "data-selected": () => ctx.isSelected(value()) ? "" : void 0,
336
+ onClick: () => ctx.setValue(value()),
337
+ type: "button"
338
+ }, rest, { children: [jsx("span", mergeProps(() => part("itemText"), { children: () => local.children ?? (local.item !== void 0 && ctx.itemToLabel(local.item)) })), () => ctx.isSelected(value()) && jsx("span", mergeProps(() => part("itemIndicator"), {
339
+ className: itemIndicatorClass,
340
+ children: jsx(Icon, mergeProps({ svg: checkSvg }))
341
+ }))] }));
342
+ };
343
+ var Content = () => {
344
+ const ctx = useSelect();
345
+ let filterInputEl = null;
346
+ createEffect(() => {
347
+ if (ctx.open() && ctx.filter) queueMicrotask(() => filterInputEl?.focus());
348
+ });
349
+ const handleFilterClear = () => {
350
+ ctx.query("");
351
+ filterInputEl?.focus();
352
+ };
353
+ return jsx("div", mergeProps(() => part("positioner"), {
354
+ "aria-hidden": () => !ctx.open(),
355
+ get className() {
356
+ return `${overlayClass} ${ctx.open() ? openClass : ""}`;
357
+ },
358
+ children: [jsx("div", mergeProps(() => part("backdrop"), {
359
+ get className() {
360
+ return `${backdropClass} ${ctx.backdropClassName ?? ""}`;
361
+ },
362
+ get style() {
363
+ return ctx.backdropStyle;
364
+ },
365
+ onClick: () => ctx.open(false)
366
+ })), jsx("div", mergeProps(() => part("content"), {
367
+ className: sheetClass,
368
+ role: "dialog",
369
+ children: [jsx("div", mergeProps(() => part("grabber"), {
370
+ className: grabberClass,
371
+ onClick: () => ctx.open(false),
372
+ children: (() => {
373
+ const _el0 = _tmpl.cloneNode(true);
374
+ setProp(_el0, "className", () => grabberBarClass);
375
+ return _el0;
376
+ })()
377
+ })), jsx("div", mergeProps(() => part("list"), {
378
+ className: listClass,
379
+ children: [() => ctx.filter && (() => {
380
+ const _el0 = _tmpl2.cloneNode(true);
381
+ const _el1 = _el0.firstChild;
382
+ const _el2 = _el0.firstChild.nextSibling;
383
+ const _el3 = _el0.firstChild.nextSibling.nextSibling;
384
+ insert(_el1, () => jsx(Icon, mergeProps({ svg: searchSvg })));
385
+ setProp(_el1, "className", () => filterIconClass);
386
+ setProp(_el2, "ref", (el) => {
387
+ filterInputEl = el;
388
+ });
389
+ setProp(_el2, "className", () => filterInputClass);
390
+ setProp(_el2, "value", () => ctx.query);
391
+ setProp(_el2, "onInput", (e) => ctx.query(e.target.value));
392
+ setProp(_el2, "onClick", (e) => e.stopPropagation());
393
+ insert(_el0, () => ctx.query() && (() => {
394
+ const _el0 = _tmpl3.cloneNode(true);
395
+ insert(_el0, () => jsx(Icon, mergeProps({ svg: xSvg })));
396
+ setProp(_el0, "className", () => filterClearClass);
397
+ setProp(_el0, "onClick", (e) => {
398
+ e.stopPropagation();
399
+ handleFilterClear();
400
+ });
401
+ return _el0;
402
+ }), _el3);
403
+ setProp(_el0, "className", () => filterWrapperClass);
404
+ return _el0;
405
+ }), () => {
406
+ const list = ctx.filter ? ctx.filteredItems() : ctx.items();
407
+ if (list.length === 0 && ctx.filter && ctx.open()) return (() => {
408
+ const _el0 = _tmpl4.cloneNode(true);
409
+ setProp(_el0, "className", () => noResultsClass);
410
+ return _el0;
411
+ })();
412
+ return jsx(Fragment, { children: [() => ctx.clearable && jsx(Item, mergeProps({
413
+ value: "",
414
+ children: () => ctx.clearLabel ?? "None"
415
+ })), jsx(Loop, mergeProps({
416
+ each: () => list,
417
+ children: (item) => jsx(Item, mergeProps({
418
+ item,
419
+ get key() {
420
+ return ctx.itemToValue(item);
421
+ }
422
+ }))
423
+ }))] });
424
+ }]
425
+ }))]
426
+ }))]
427
+ }));
428
+ };
4
429
  //#endregion
5
- export { Select_default as default };
6
-
7
- //# sourceMappingURL=Select.js.map
430
+ export { SelectTrigger, Select as default };
@@ -0,0 +1,239 @@
1
+ import Portal_default from "./Portal.js";
2
+ import { jsx, mergeProps, template } from "@plastic-js/plastic/jsx-runtime";
3
+ import { css } from "@emotion/css";
4
+ import { Select } from "@plastic-js/ark";
5
+ import { mergeProps as mergeProps$2, splitProps } from "@plastic-js/plastic";
6
+ import * as select from "@zag-js/select";
7
+ //#region src/components/SelectPc.jsx
8
+ var _tmpl = template("<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" width=\"1em\" height=\"1em\"><path d=\"M6 9l6 6 6-6\"></path></svg>");
9
+ var read = (v) => typeof v === "function" ? v() : v;
10
+ var triggerBaseClass = css({
11
+ display: "flex",
12
+ alignItems: "center",
13
+ gap: "var(--tsu-spacing-sm)",
14
+ width: "100%",
15
+ borderRadius: "var(--_trigger-radius, var(--tsu-radius-l1-md))",
16
+ fontFamily: "inherit",
17
+ outline: "none",
18
+ appearance: "none",
19
+ touchAction: "manipulation",
20
+ WebkitTapHighlightColor: "transparent",
21
+ transition: "background-color var(--tsu-transition-fast), border-color var(--tsu-transition-fast)",
22
+ cursor: "pointer",
23
+ textAlign: "start",
24
+ color: "var(--tsu-fg)",
25
+ "&[data-placeholder-shown]": { color: "var(--tsu-neutral-11)" }
26
+ });
27
+ var sizeClasses = {
28
+ xs: css({
29
+ height: "var(--tsu-comp-height-xs)",
30
+ padding: "var(--tsu-comp-padding-y-xs) var(--tsu-comp-padding-x-xs)",
31
+ fontSize: "var(--tsu-comp-font-size-xs)",
32
+ "--_trigger-radius": "var(--tsu-radius-l1-xs)"
33
+ }),
34
+ sm: css({
35
+ height: "var(--tsu-comp-height-sm)",
36
+ padding: "var(--tsu-comp-padding-y-sm) var(--tsu-comp-padding-x-sm)",
37
+ fontSize: "var(--tsu-comp-font-size-sm)",
38
+ "--_trigger-radius": "var(--tsu-radius-l1-sm)"
39
+ }),
40
+ md: css({
41
+ height: "var(--tsu-comp-height-md)",
42
+ padding: "var(--tsu-comp-padding-y-md) var(--tsu-comp-padding-x-md)",
43
+ fontSize: "var(--tsu-comp-font-size-md)",
44
+ "--_trigger-radius": "var(--tsu-radius-l1-md)"
45
+ }),
46
+ lg: css({
47
+ height: "var(--tsu-comp-height-lg)",
48
+ padding: "var(--tsu-comp-padding-y-lg) var(--tsu-comp-padding-x-lg)",
49
+ fontSize: "var(--tsu-comp-font-size-lg)",
50
+ "--_trigger-radius": "var(--tsu-radius-l1-lg)"
51
+ }),
52
+ xl: css({
53
+ height: "var(--tsu-comp-height-xl)",
54
+ padding: "var(--tsu-comp-padding-y-xl) var(--tsu-comp-padding-x-xl)",
55
+ fontSize: "var(--tsu-comp-font-size-xl)",
56
+ "--_trigger-radius": "var(--tsu-radius-l1-xl)"
57
+ })
58
+ };
59
+ var variantClasses = {
60
+ solid: css({
61
+ backgroundColor: "var(--tsu-neutral-3)",
62
+ border: "1px solid transparent",
63
+ "&:hover:not(:disabled)": { backgroundColor: "var(--tsu-neutral-4)" },
64
+ "&:active:not(:disabled)": {
65
+ backgroundColor: "var(--tsu-neutral-5)",
66
+ borderColor: "var(--tsu-accent-9)"
67
+ },
68
+ "&:focus-visible": {
69
+ backgroundColor: "var(--tsu-focus-bg)",
70
+ borderColor: "var(--tsu-focus-border)"
71
+ }
72
+ }),
73
+ outline: css({
74
+ backgroundColor: "var(--tsu-bg)",
75
+ border: "1px solid var(--tsu-accent-8)",
76
+ "&:active:not(:disabled)": {
77
+ backgroundColor: "var(--tsu-accent-3)",
78
+ borderColor: "var(--tsu-accent-9)"
79
+ },
80
+ "&:focus-visible": {
81
+ backgroundColor: "var(--tsu-focus-bg)",
82
+ borderColor: "var(--tsu-focus-border)"
83
+ }
84
+ })
85
+ };
86
+ var errorClass = css({
87
+ borderColor: "var(--tsu-danger-9) !important",
88
+ "&:focus-visible": { borderColor: "var(--tsu-danger-9) !important" }
89
+ });
90
+ var disabledClass = css({
91
+ backgroundColor: "var(--tsu-disabled-bg) !important",
92
+ borderColor: "var(--tsu-disabled-border) !important",
93
+ color: "var(--tsu-disabled-fg) !important",
94
+ cursor: "not-allowed"
95
+ });
96
+ var indicatorClass = css({
97
+ marginInlineStart: "auto",
98
+ display: "flex",
99
+ alignItems: "center",
100
+ transition: "transform var(--tsu-transition-fast)",
101
+ color: "var(--tsu-neutral-11)",
102
+ "&[data-state=\"open\"]": { transform: "rotate(180deg)" }
103
+ });
104
+ var positionerClass = css({ zIndex: "var(--tsu-z-dropdown)" });
105
+ var contentBaseClass = css({
106
+ backgroundColor: "var(--tsu-bg)",
107
+ border: "1px solid var(--tsu-neutral-6)",
108
+ borderRadius: "var(--tsu-radius-l2-md)",
109
+ boxShadow: "var(--tsu-shadow-lg)",
110
+ overflow: "hidden"
111
+ });
112
+ var itemClass = css({
113
+ display: "flex",
114
+ alignItems: "center",
115
+ padding: "var(--_item-padding-y) var(--_item-padding-x)",
116
+ fontSize: "var(--_item-font-size)",
117
+ fontFamily: "inherit",
118
+ lineHeight: 1.5,
119
+ cursor: "pointer",
120
+ color: "var(--tsu-fg)",
121
+ minHeight: "var(--_item-min-height)",
122
+ "&:active": { backgroundColor: "var(--tsu-neutral-3)" },
123
+ "&[data-highlighted]": {
124
+ backgroundColor: "var(--tsu-accent-3)",
125
+ color: "var(--tsu-accent-9)"
126
+ },
127
+ "&[data-disabled]": {
128
+ color: "var(--tsu-disabled-fg)",
129
+ pointerEvents: "none"
130
+ }
131
+ });
132
+ var sizeItemVars = {
133
+ xs: {
134
+ "--_item-font-size": "var(--tsu-comp-font-size-xs)",
135
+ "--_item-padding-y": "var(--tsu-comp-padding-y-xs)",
136
+ "--_item-padding-x": "var(--tsu-comp-padding-x-xs)",
137
+ "--_item-min-height": "var(--tsu-comp-height-xs)"
138
+ },
139
+ sm: {
140
+ "--_item-font-size": "var(--tsu-comp-font-size-sm)",
141
+ "--_item-padding-y": "var(--tsu-comp-padding-y-sm)",
142
+ "--_item-padding-x": "var(--tsu-comp-padding-x-sm)",
143
+ "--_item-min-height": "var(--tsu-comp-height-sm)"
144
+ },
145
+ md: {
146
+ "--_item-font-size": "var(--tsu-comp-font-size-md)",
147
+ "--_item-padding-y": "var(--tsu-comp-padding-y-md)",
148
+ "--_item-padding-x": "var(--tsu-comp-padding-x-md)",
149
+ "--_item-min-height": "var(--tsu-comp-height-md)"
150
+ },
151
+ lg: {
152
+ "--_item-font-size": "var(--tsu-comp-font-size-lg)",
153
+ "--_item-padding-y": "var(--tsu-comp-padding-y-lg)",
154
+ "--_item-padding-x": "var(--tsu-comp-padding-x-lg)",
155
+ "--_item-min-height": "var(--tsu-comp-height-lg)"
156
+ },
157
+ xl: {
158
+ "--_item-font-size": "var(--tsu-comp-font-size-xl)",
159
+ "--_item-padding-y": "var(--tsu-comp-padding-y-xl)",
160
+ "--_item-padding-x": "var(--tsu-comp-padding-x-xl)",
161
+ "--_item-min-height": "var(--tsu-comp-height-xl)"
162
+ }
163
+ };
164
+ var SelectItem = (props = {}) => {
165
+ const [local, rest] = splitProps(props, ["className"]);
166
+ return jsx(Select.Item, mergeProps(rest, { get className() {
167
+ return [itemClass, local.className].filter(Boolean).join(" ");
168
+ } }));
169
+ };
170
+ var SelectPc = (props = {}) => {
171
+ const [local, rest] = splitProps(mergeProps$2({
172
+ solid: false,
173
+ size: "md",
174
+ disabled: false,
175
+ invalid: false,
176
+ positioning: { sameWidth: true }
177
+ }, props), [
178
+ "solid",
179
+ "size",
180
+ "disabled",
181
+ "invalid",
182
+ "className",
183
+ "placeholder",
184
+ "children",
185
+ "items",
186
+ "itemToValue",
187
+ "itemToString"
188
+ ]);
189
+ const collection = select.collection({
190
+ items: local.items ?? [],
191
+ itemToValue: local.itemToValue ?? ((item) => String(item?.value ?? item?.id ?? item)),
192
+ itemToString: local.itemToString ?? ((item) => String(item?.label ?? item?.name ?? item))
193
+ });
194
+ const triggerClassName = () => [
195
+ triggerBaseClass,
196
+ sizeClasses[read(local.size)],
197
+ read(local.solid) ? variantClasses.solid : variantClasses.outline,
198
+ read(local.invalid) && errorClass,
199
+ read(local.disabled) && disabledClass,
200
+ read(local.className)
201
+ ].filter(Boolean).join(" ");
202
+ return jsx(Select.Root, mergeProps({
203
+ disabled: () => read(local.disabled),
204
+ collection
205
+ }, rest, { children: [
206
+ jsx(Select.Trigger, mergeProps({
207
+ className: triggerClassName,
208
+ children: [jsx(Select.ValueText, mergeProps({ get placeholder() {
209
+ return local.placeholder;
210
+ } })), jsx(Select.Indicator, mergeProps({
211
+ className: indicatorClass,
212
+ children: _tmpl.cloneNode(true)
213
+ }))]
214
+ })),
215
+ jsx(Portal_default, mergeProps({ children: jsx(Select.Positioner, mergeProps({
216
+ className: positionerClass,
217
+ children: jsx(Select.Content, mergeProps({
218
+ className: contentBaseClass,
219
+ style: () => sizeItemVars[read(local.size)],
220
+ children: jsx(Select.List, mergeProps({ children: () => local.children }))
221
+ }))
222
+ })) })),
223
+ jsx(Select.HiddenSelect, {})
224
+ ] }));
225
+ };
226
+ SelectPc.origin = {
227
+ Root: Select.Root,
228
+ Trigger: Select.Trigger,
229
+ Indicator: Select.Indicator,
230
+ Positioner: Select.Positioner,
231
+ Content: Select.Content,
232
+ List: Select.List,
233
+ Item: SelectItem,
234
+ ItemText: Select.ItemText,
235
+ ValueText: Select.ValueText,
236
+ HiddenSelect: Select.HiddenSelect
237
+ };
238
+ //#endregion
239
+ export { SelectPc as default };