@fangxinyan/lumina 0.1.6 → 0.2.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 (201) hide show
  1. package/dist/{Accordion-GSBY5T5U.css → Accordion-3TQPKNN3.css} +8 -1
  2. package/dist/Accordion.cjs +2 -2
  3. package/dist/Accordion.d.cts +12 -0
  4. package/dist/Accordion.d.ts +12 -0
  5. package/dist/Accordion.js +1 -1
  6. package/dist/{Alert-LSKBYDRI.css → Alert-JJ7GB3UU.css} +11 -0
  7. package/dist/Alert.cjs +2 -2
  8. package/dist/Alert.d.cts +4 -0
  9. package/dist/Alert.d.ts +4 -0
  10. package/dist/Alert.js +1 -1
  11. package/dist/{Avatar-OXDSG5Q6.css → Avatar-R5A4AFKZ.css} +4 -0
  12. package/dist/Avatar.cjs +2 -2
  13. package/dist/Avatar.d.cts +2 -0
  14. package/dist/Avatar.d.ts +2 -0
  15. package/dist/Avatar.js +1 -1
  16. package/dist/{Button-5UI7QXGU.css → Button-SDQD25AG.css} +2 -0
  17. package/dist/Button.cjs +3 -3
  18. package/dist/Button.d.cts +2 -0
  19. package/dist/Button.d.ts +2 -0
  20. package/dist/Button.js +1 -1
  21. package/dist/Calendar.cjs +2 -2
  22. package/dist/Calendar.d.cts +8 -0
  23. package/dist/Calendar.d.ts +8 -0
  24. package/dist/Calendar.js +1 -1
  25. package/dist/{Card-2CHHFD4Y.css → Card-RG7ECXL2.css} +11 -0
  26. package/dist/Card.cjs +3 -3
  27. package/dist/Card.d.cts +2 -0
  28. package/dist/Card.d.ts +2 -0
  29. package/dist/Card.js +1 -1
  30. package/dist/{Divider-Z37INS5E.css → Divider-OEE4Q2KS.css} +31 -0
  31. package/dist/Divider.cjs +2 -2
  32. package/dist/Divider.d.cts +7 -0
  33. package/dist/Divider.d.ts +7 -0
  34. package/dist/Divider.js +1 -1
  35. package/dist/{Empty-VM23UNLQ.css → Empty-NQ72W3D7.css} +22 -0
  36. package/dist/Empty.cjs +4 -4
  37. package/dist/Empty.d.cts +42 -2
  38. package/dist/Empty.d.ts +42 -2
  39. package/dist/Empty.js +1 -1
  40. package/dist/Input-33CAH4O6.css +134 -0
  41. package/dist/Input.cjs +3 -3
  42. package/dist/Input.d.cts +17 -1
  43. package/dist/Input.d.ts +17 -1
  44. package/dist/Input.js +1 -1
  45. package/dist/Modal.cjs +3 -3
  46. package/dist/Modal.js +2 -2
  47. package/dist/{Pagination-6FFOI4NM.css → Pagination-YIRYJUXP.css} +33 -0
  48. package/dist/Pagination.cjs +5 -2
  49. package/dist/Pagination.d.cts +14 -0
  50. package/dist/Pagination.d.ts +14 -0
  51. package/dist/Pagination.js +4 -1
  52. package/dist/Select.cjs +3 -3
  53. package/dist/Select.js +2 -2
  54. package/dist/{Slider-RE4HZQKF.css → Slider-X4PVA65R.css} +51 -2
  55. package/dist/Slider.cjs +2 -2
  56. package/dist/Slider.d.cts +20 -5
  57. package/dist/Slider.d.ts +20 -5
  58. package/dist/Slider.js +1 -1
  59. package/dist/Switch-36KJNDXM.css +92 -0
  60. package/dist/Switch.cjs +2 -2
  61. package/dist/Switch.d.cts +4 -0
  62. package/dist/Switch.d.ts +4 -0
  63. package/dist/Switch.js +1 -1
  64. package/dist/Table-ADVN6LXP.css +295 -0
  65. package/dist/Table.cjs +7 -3
  66. package/dist/Table.d.cts +103 -7
  67. package/dist/Table.d.ts +103 -7
  68. package/dist/Table.js +5 -1
  69. package/dist/{Tabs-A27TSZOP.css → Tabs-RHK6XAFF.css} +7 -0
  70. package/dist/Tabs.cjs +3 -3
  71. package/dist/Tabs.d.cts +2 -0
  72. package/dist/Tabs.d.ts +2 -0
  73. package/dist/Tabs.js +1 -1
  74. package/dist/{Tag-EYOY3UWG.css → Tag-FGDY3W7E.css} +2 -0
  75. package/dist/Tag.cjs +3 -3
  76. package/dist/Tag.d.cts +5 -0
  77. package/dist/Tag.d.ts +5 -0
  78. package/dist/Tag.js +1 -1
  79. package/dist/chunk-437LB2V4.js +111 -0
  80. package/dist/chunk-437LB2V4.js.map +1 -0
  81. package/dist/chunk-4MR4GVTD.js +73 -0
  82. package/dist/chunk-4MR4GVTD.js.map +1 -0
  83. package/dist/{chunk-OXYFB2ZI.js → chunk-4U4OY5RA.js} +11 -5
  84. package/dist/chunk-4U4OY5RA.js.map +1 -0
  85. package/dist/chunk-55NTFU7Y.js +476 -0
  86. package/dist/chunk-55NTFU7Y.js.map +1 -0
  87. package/dist/{chunk-5EYI27B6.js → chunk-77BVQNAQ.js} +5 -3
  88. package/dist/chunk-77BVQNAQ.js.map +1 -0
  89. package/dist/{chunk-3QWHDCHJ.js → chunk-AJZKESHB.js} +13 -4
  90. package/dist/chunk-AJZKESHB.js.map +1 -0
  91. package/dist/{chunk-NZPJ7BUB.cjs → chunk-AXMEZGEG.cjs} +13 -4
  92. package/dist/chunk-AXMEZGEG.cjs.map +1 -0
  93. package/dist/{chunk-HTP6UEVR.js → chunk-BBPNQ44M.js} +22 -6
  94. package/dist/chunk-BBPNQ44M.js.map +1 -0
  95. package/dist/{chunk-QQXIWOI3.cjs → chunk-CCBHZYE6.cjs} +5 -5
  96. package/dist/{chunk-QQXIWOI3.cjs.map → chunk-CCBHZYE6.cjs.map} +1 -1
  97. package/dist/{chunk-KGYLUZOU.cjs → chunk-EPFYIR63.cjs} +5 -5
  98. package/dist/{chunk-KGYLUZOU.cjs.map → chunk-EPFYIR63.cjs.map} +1 -1
  99. package/dist/chunk-F7HW2PYR.cjs +119 -0
  100. package/dist/chunk-F7HW2PYR.cjs.map +1 -0
  101. package/dist/chunk-GIVMKGZN.js +39 -0
  102. package/dist/chunk-GIVMKGZN.js.map +1 -0
  103. package/dist/{chunk-FMG3ZPGK.js → chunk-H6FCIJOP.js} +5 -3
  104. package/dist/chunk-H6FCIJOP.js.map +1 -0
  105. package/dist/{chunk-ALFDP5WX.cjs → chunk-IDM6JJLP.cjs} +22 -6
  106. package/dist/chunk-IDM6JJLP.cjs.map +1 -0
  107. package/dist/chunk-IFERLHCL.cjs +499 -0
  108. package/dist/chunk-IFERLHCL.cjs.map +1 -0
  109. package/dist/{chunk-I2ERCHFV.cjs → chunk-JKLQOB2F.cjs} +11 -5
  110. package/dist/chunk-JKLQOB2F.cjs.map +1 -0
  111. package/dist/{chunk-IGHLSNXT.cjs → chunk-K7PVJLW4.cjs} +51 -4
  112. package/dist/chunk-K7PVJLW4.cjs.map +1 -0
  113. package/dist/chunk-LDENBYRC.cjs +210 -0
  114. package/dist/chunk-LDENBYRC.cjs.map +1 -0
  115. package/dist/{chunk-OOBSH7EL.js → chunk-LSLYY5FN.js} +3 -3
  116. package/dist/{chunk-OOBSH7EL.js.map → chunk-LSLYY5FN.js.map} +1 -1
  117. package/dist/chunk-NSUD5B22.js +187 -0
  118. package/dist/chunk-NSUD5B22.js.map +1 -0
  119. package/dist/{chunk-AAMYURWQ.cjs → chunk-OPTTHURA.cjs} +5 -3
  120. package/dist/chunk-OPTTHURA.cjs.map +1 -0
  121. package/dist/{chunk-F3NHM4GX.js → chunk-OYGFMXAA.js} +13 -4
  122. package/dist/chunk-OYGFMXAA.js.map +1 -0
  123. package/dist/chunk-PBBHUUXU.cjs +133 -0
  124. package/dist/chunk-PBBHUUXU.cjs.map +1 -0
  125. package/dist/chunk-RDLPX7RK.cjs +95 -0
  126. package/dist/chunk-RDLPX7RK.cjs.map +1 -0
  127. package/dist/{chunk-XFRP2MBR.js → chunk-TYQ5CN2C.js} +51 -4
  128. package/dist/chunk-TYQ5CN2C.js.map +1 -0
  129. package/dist/{chunk-7CKHWCEA.cjs → chunk-TZSWDH5T.cjs} +5 -3
  130. package/dist/chunk-TZSWDH5T.cjs.map +1 -0
  131. package/dist/{chunk-VMHNKD3N.cjs → chunk-URF6RBW6.cjs} +13 -4
  132. package/dist/chunk-URF6RBW6.cjs.map +1 -0
  133. package/dist/{chunk-G3UWXSNQ.js → chunk-V34OPWKZ.js} +5 -4
  134. package/dist/chunk-V34OPWKZ.js.map +1 -0
  135. package/dist/{chunk-ITGCHU3Y.cjs → chunk-VICGQC6G.cjs} +5 -4
  136. package/dist/chunk-VICGQC6G.cjs.map +1 -0
  137. package/dist/chunk-YEOARJKR.cjs +40 -0
  138. package/dist/chunk-YEOARJKR.cjs.map +1 -0
  139. package/dist/chunk-Z5X5AMLA.cjs +41 -0
  140. package/dist/chunk-Z5X5AMLA.cjs.map +1 -0
  141. package/dist/chunk-Z7P6QGMT.js +115 -0
  142. package/dist/chunk-Z7P6QGMT.js.map +1 -0
  143. package/dist/{chunk-OYH6A7IQ.js → chunk-ZVCMXDTP.js} +3 -3
  144. package/dist/{chunk-OYH6A7IQ.js.map → chunk-ZVCMXDTP.js.map} +1 -1
  145. package/dist/chunk-ZWP4LSS3.js +38 -0
  146. package/dist/chunk-ZWP4LSS3.js.map +1 -0
  147. package/dist/index.cjs +43 -43
  148. package/dist/index.cjs.map +1 -1
  149. package/dist/index.d.cts +4 -4
  150. package/dist/index.d.ts +4 -4
  151. package/dist/index.js +18 -18
  152. package/dist/index.js.map +1 -1
  153. package/dist/styles.css +455 -30
  154. package/package.json +1 -1
  155. package/dist/Input-Z526ARZP.css +0 -66
  156. package/dist/Switch-NP7KKJOX.css +0 -44
  157. package/dist/Table-ZDPGWLH3.css +0 -139
  158. package/dist/chunk-2VA2HSL4.cjs +0 -121
  159. package/dist/chunk-2VA2HSL4.cjs.map +0 -1
  160. package/dist/chunk-2W2AJUZW.js +0 -118
  161. package/dist/chunk-2W2AJUZW.js.map +0 -1
  162. package/dist/chunk-3QWHDCHJ.js.map +0 -1
  163. package/dist/chunk-4AA22BOG.js +0 -63
  164. package/dist/chunk-4AA22BOG.js.map +0 -1
  165. package/dist/chunk-5EYI27B6.js.map +0 -1
  166. package/dist/chunk-77NP67ML.cjs +0 -70
  167. package/dist/chunk-77NP67ML.cjs.map +0 -1
  168. package/dist/chunk-7CKHWCEA.cjs.map +0 -1
  169. package/dist/chunk-7NM5BRUX.js +0 -91
  170. package/dist/chunk-7NM5BRUX.js.map +0 -1
  171. package/dist/chunk-7UJI437T.js +0 -49
  172. package/dist/chunk-7UJI437T.js.map +0 -1
  173. package/dist/chunk-AAMYURWQ.cjs.map +0 -1
  174. package/dist/chunk-ALFDP5WX.cjs.map +0 -1
  175. package/dist/chunk-F3NHM4GX.js.map +0 -1
  176. package/dist/chunk-FMG3ZPGK.js.map +0 -1
  177. package/dist/chunk-G3UWXSNQ.js.map +0 -1
  178. package/dist/chunk-HTP6UEVR.js.map +0 -1
  179. package/dist/chunk-I2ERCHFV.cjs.map +0 -1
  180. package/dist/chunk-IBZAGURN.cjs +0 -71
  181. package/dist/chunk-IBZAGURN.cjs.map +0 -1
  182. package/dist/chunk-IGHLSNXT.cjs.map +0 -1
  183. package/dist/chunk-ITGCHU3Y.cjs.map +0 -1
  184. package/dist/chunk-JNFCTYJT.cjs +0 -31
  185. package/dist/chunk-JNFCTYJT.cjs.map +0 -1
  186. package/dist/chunk-JWFVSBVX.cjs +0 -30
  187. package/dist/chunk-JWFVSBVX.cjs.map +0 -1
  188. package/dist/chunk-K67KIKX4.cjs +0 -67
  189. package/dist/chunk-K67KIKX4.cjs.map +0 -1
  190. package/dist/chunk-M6OTFXZA.js +0 -48
  191. package/dist/chunk-M6OTFXZA.js.map +0 -1
  192. package/dist/chunk-NWJW5KLN.js +0 -29
  193. package/dist/chunk-NWJW5KLN.js.map +0 -1
  194. package/dist/chunk-NZPJ7BUB.cjs.map +0 -1
  195. package/dist/chunk-OXYFB2ZI.js.map +0 -1
  196. package/dist/chunk-QT7SJITQ.cjs +0 -114
  197. package/dist/chunk-QT7SJITQ.cjs.map +0 -1
  198. package/dist/chunk-VMHNKD3N.cjs.map +0 -1
  199. package/dist/chunk-VXITDXLW.js +0 -28
  200. package/dist/chunk-VXITDXLW.js.map +0 -1
  201. package/dist/chunk-XFRP2MBR.js.map +0 -1
@@ -0,0 +1,187 @@
1
+ import { Icon } from './chunk-GEYMWUW6.js';
2
+ import './tokens-HWQ7KWPG.css';
3
+ import './shared-NJHRNLRH.css';
4
+ import './Input-33CAH4O6.css';
5
+ import * as React from 'react';
6
+ import { jsxs, jsx } from 'react/jsx-runtime';
7
+
8
+ var Input = React.forwardRef(
9
+ ({
10
+ value,
11
+ defaultValue,
12
+ onChange,
13
+ placeholder,
14
+ leadingIcon,
15
+ trailingIcon,
16
+ onLeadingIconClick,
17
+ onTrailingIconClick,
18
+ size = "md",
19
+ invalid,
20
+ disabled,
21
+ allowClear,
22
+ maxLength,
23
+ showCount,
24
+ prefix,
25
+ suffix,
26
+ className = "",
27
+ ...rest
28
+ }, ref) => {
29
+ const [inner, setInner] = React.useState(defaultValue ?? "");
30
+ const isControlled = value !== void 0;
31
+ const currentValue = isControlled ? value : inner;
32
+ const wrapCls = [
33
+ "input-wrap",
34
+ size !== "md" && size,
35
+ invalid && "invalid",
36
+ disabled && "disabled",
37
+ className
38
+ ].filter(Boolean).join(" ");
39
+ const handleIconClick = (handler) => handler ? (e) => {
40
+ e.stopPropagation();
41
+ if (!disabled) handler(e);
42
+ } : void 0;
43
+ const handleChange = (e) => {
44
+ if (!isControlled) setInner(e.target.value);
45
+ onChange?.(e.target.value, e);
46
+ };
47
+ const handleClear = (e) => {
48
+ e.stopPropagation();
49
+ if (disabled) return;
50
+ if (!isControlled) setInner("");
51
+ const synthetic = {
52
+ ...e,
53
+ target: { ...e.target, value: "" },
54
+ currentTarget: { ...e.currentTarget, value: "" }
55
+ };
56
+ onChange?.("", synthetic);
57
+ };
58
+ const showClear = !!allowClear && !!currentValue && !disabled;
59
+ const count = currentValue ? currentValue.length : 0;
60
+ const inputElement = /* @__PURE__ */ jsxs("div", { className: wrapCls, children: [
61
+ leadingIcon && /* @__PURE__ */ jsx(
62
+ Icon,
63
+ {
64
+ name: leadingIcon,
65
+ size: 14,
66
+ className: `lead${onLeadingIconClick ? " interactive" : ""}`,
67
+ onClick: handleIconClick(onLeadingIconClick)
68
+ }
69
+ ),
70
+ prefix && /* @__PURE__ */ jsx("span", { className: "input-affix prefix", children: prefix }),
71
+ /* @__PURE__ */ jsx(
72
+ "input",
73
+ {
74
+ ref,
75
+ className: "input",
76
+ value: isControlled ? value : void 0,
77
+ defaultValue: isControlled ? void 0 : defaultValue,
78
+ onChange: handleChange,
79
+ placeholder,
80
+ disabled,
81
+ maxLength,
82
+ ...rest
83
+ }
84
+ ),
85
+ suffix && /* @__PURE__ */ jsx("span", { className: "input-affix suffix", children: suffix }),
86
+ showClear && /* @__PURE__ */ jsx(
87
+ "span",
88
+ {
89
+ className: "input-clear",
90
+ role: "button",
91
+ "aria-label": "Clear",
92
+ tabIndex: -1,
93
+ onMouseDown: (e) => e.preventDefault(),
94
+ onClick: handleClear,
95
+ children: /* @__PURE__ */ jsx(Icon, { name: "x", size: 12 })
96
+ }
97
+ ),
98
+ trailingIcon && /* @__PURE__ */ jsx(
99
+ Icon,
100
+ {
101
+ name: trailingIcon,
102
+ size: 14,
103
+ className: `trail${onTrailingIconClick ? " interactive" : ""}`,
104
+ onClick: handleIconClick(onTrailingIconClick)
105
+ }
106
+ )
107
+ ] });
108
+ if (!showCount) return inputElement;
109
+ return /* @__PURE__ */ jsxs("div", { className: "input-shell", children: [
110
+ inputElement,
111
+ /* @__PURE__ */ jsx("div", { className: "input-count", children: maxLength != null ? `${count} / ${maxLength}` : `${count}` })
112
+ ] });
113
+ }
114
+ );
115
+ Input.displayName = "Input";
116
+ var Textarea = React.forwardRef(
117
+ ({
118
+ value,
119
+ defaultValue,
120
+ onChange,
121
+ invalid,
122
+ allowClear,
123
+ maxLength,
124
+ showCount,
125
+ className = "",
126
+ ...rest
127
+ }, ref) => {
128
+ const [inner, setInner] = React.useState(defaultValue ?? "");
129
+ const isControlled = value !== void 0;
130
+ const currentValue = isControlled ? value : inner;
131
+ const disabled = rest.disabled;
132
+ const handleChange = (e) => {
133
+ if (!isControlled) setInner(e.target.value);
134
+ onChange?.(e.target.value, e);
135
+ };
136
+ const handleClear = (e) => {
137
+ e.stopPropagation();
138
+ if (disabled) return;
139
+ if (!isControlled) setInner("");
140
+ const synthetic = {
141
+ ...e,
142
+ target: { ...e.target, value: "" },
143
+ currentTarget: { ...e.currentTarget, value: "" }
144
+ };
145
+ onChange?.("", synthetic);
146
+ };
147
+ const cls = ["textarea", invalid && "invalid", className].filter(Boolean).join(" ");
148
+ const showClear = !!allowClear && !!currentValue && !disabled;
149
+ const count = currentValue ? currentValue.length : 0;
150
+ const field = /* @__PURE__ */ jsxs("div", { className: "textarea-wrap", children: [
151
+ /* @__PURE__ */ jsx(
152
+ "textarea",
153
+ {
154
+ ref,
155
+ className: cls,
156
+ value: isControlled ? value : void 0,
157
+ defaultValue: isControlled ? void 0 : defaultValue,
158
+ onChange: handleChange,
159
+ maxLength,
160
+ ...rest
161
+ }
162
+ ),
163
+ showClear && /* @__PURE__ */ jsx(
164
+ "span",
165
+ {
166
+ className: "textarea-clear",
167
+ role: "button",
168
+ "aria-label": "Clear",
169
+ tabIndex: -1,
170
+ onMouseDown: (e) => e.preventDefault(),
171
+ onClick: handleClear,
172
+ children: /* @__PURE__ */ jsx(Icon, { name: "x", size: 12 })
173
+ }
174
+ )
175
+ ] });
176
+ if (!showCount) return field;
177
+ return /* @__PURE__ */ jsxs("div", { className: "input-shell", children: [
178
+ field,
179
+ /* @__PURE__ */ jsx("div", { className: "input-count", children: maxLength != null ? `${count} / ${maxLength}` : `${count}` })
180
+ ] });
181
+ }
182
+ );
183
+ Textarea.displayName = "Textarea";
184
+
185
+ export { Input, Textarea };
186
+ //# sourceMappingURL=chunk-NSUD5B22.js.map
187
+ //# sourceMappingURL=chunk-NSUD5B22.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Input/Input.tsx"],"names":[],"mappings":"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","file":"chunk-NSUD5B22.js","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Input.css\";\nimport * as React from \"react\";\nimport { Icon, type IconName } from \"../Icon\";\n\nexport interface InputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"size\" | \"onChange\" | \"prefix\"> {\n value?: string;\n defaultValue?: string;\n onChange?: (value: string, event: React.ChangeEvent<HTMLInputElement>) => void;\n placeholder?: string;\n leadingIcon?: IconName;\n trailingIcon?: IconName;\n /** Click handler for the leading icon (stops propagation so the input isn't focused). */\n onLeadingIconClick?: (e: React.MouseEvent<SVGSVGElement>) => void;\n /** Click handler for the trailing icon — e.g. password visibility toggle. */\n onTrailingIconClick?: (e: React.MouseEvent<SVGSVGElement>) => void;\n size?: \"sm\" | \"md\" | \"lg\";\n invalid?: boolean;\n disabled?: boolean;\n /** Show a × button inside the input to clear the value when non-empty. */\n allowClear?: boolean;\n /** Max length — forwarded to the native input. */\n maxLength?: number;\n /** Render a \"N / max\" counter beneath the input (or just \"N\" if no maxLength). */\n showCount?: boolean;\n /** Inline content rendered inside the input on the left (after leadingIcon if both present). */\n prefix?: React.ReactNode;\n /** Inline content rendered inside the input on the right (before trailingIcon if both present). */\n suffix?: React.ReactNode;\n className?: string;\n}\n\n/**\n * `Input` — single-line text field with optional leading/trailing icons.\n */\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\n (\n {\n value,\n defaultValue,\n onChange,\n placeholder,\n leadingIcon,\n trailingIcon,\n onLeadingIconClick,\n onTrailingIconClick,\n size = \"md\",\n invalid,\n disabled,\n allowClear,\n maxLength,\n showCount,\n prefix,\n suffix,\n className = \"\",\n ...rest\n },\n ref\n ) => {\n const [inner, setInner] = React.useState(defaultValue ?? \"\");\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : inner;\n\n const wrapCls = [\n \"input-wrap\",\n size !== \"md\" && size,\n invalid && \"invalid\",\n disabled && \"disabled\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const handleIconClick = (\n handler: ((e: React.MouseEvent<SVGSVGElement>) => void) | undefined\n ) =>\n handler\n ? (e: React.MouseEvent<SVGSVGElement>) => {\n e.stopPropagation();\n if (!disabled) handler(e);\n }\n : undefined;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) setInner(e.target.value);\n onChange?.(e.target.value, e);\n };\n\n const handleClear = (e: React.MouseEvent<HTMLSpanElement>) => {\n e.stopPropagation();\n if (disabled) return;\n if (!isControlled) setInner(\"\");\n const synthetic = {\n ...e,\n target: { ...(e.target as unknown as HTMLInputElement), value: \"\" },\n currentTarget: { ...(e.currentTarget as unknown as HTMLInputElement), value: \"\" },\n } as unknown as React.ChangeEvent<HTMLInputElement>;\n onChange?.(\"\", synthetic);\n };\n\n const showClear = !!allowClear && !!currentValue && !disabled;\n const count = currentValue ? currentValue.length : 0;\n\n const inputElement = (\n <div className={wrapCls}>\n {leadingIcon && (\n <Icon\n name={leadingIcon}\n size={14}\n className={`lead${onLeadingIconClick ? \" interactive\" : \"\"}`}\n onClick={handleIconClick(onLeadingIconClick)}\n />\n )}\n {prefix && <span className=\"input-affix prefix\">{prefix}</span>}\n <input\n ref={ref}\n className=\"input\"\n value={isControlled ? value : undefined}\n defaultValue={isControlled ? undefined : defaultValue}\n onChange={handleChange}\n placeholder={placeholder}\n disabled={disabled}\n maxLength={maxLength}\n {...rest}\n />\n {suffix && <span className=\"input-affix suffix\">{suffix}</span>}\n {showClear && (\n <span\n className=\"input-clear\"\n role=\"button\"\n aria-label=\"Clear\"\n tabIndex={-1}\n onMouseDown={(e) => e.preventDefault()}\n onClick={handleClear}\n >\n <Icon name=\"x\" size={12} />\n </span>\n )}\n {trailingIcon && (\n <Icon\n name={trailingIcon}\n size={14}\n className={`trail${onTrailingIconClick ? \" interactive\" : \"\"}`}\n onClick={handleIconClick(onTrailingIconClick)}\n />\n )}\n </div>\n );\n\n if (!showCount) return inputElement;\n\n return (\n <div className=\"input-shell\">\n {inputElement}\n <div className=\"input-count\">\n {maxLength != null ? `${count} / ${maxLength}` : `${count}`}\n </div>\n </div>\n );\n }\n);\nInput.displayName = \"Input\";\n\nexport interface TextareaProps\n extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, \"onChange\"> {\n value?: string;\n defaultValue?: string;\n onChange?: (value: string, event: React.ChangeEvent<HTMLTextAreaElement>) => void;\n invalid?: boolean;\n /** Show a × button in the top-right corner to clear the value. */\n allowClear?: boolean;\n /** Max length — forwarded to the native textarea. */\n maxLength?: number;\n /** Render a \"N / max\" counter beneath the textarea. */\n showCount?: boolean;\n className?: string;\n}\n\n/**\n * `Textarea` — multi-line text input with the same neumorphic groove as `Input`.\n */\nexport const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n value,\n defaultValue,\n onChange,\n invalid,\n allowClear,\n maxLength,\n showCount,\n className = \"\",\n ...rest\n },\n ref\n ) => {\n const [inner, setInner] = React.useState(defaultValue ?? \"\");\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : inner;\n const disabled = rest.disabled;\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (!isControlled) setInner(e.target.value);\n onChange?.(e.target.value, e);\n };\n\n const handleClear = (e: React.MouseEvent<HTMLSpanElement>) => {\n e.stopPropagation();\n if (disabled) return;\n if (!isControlled) setInner(\"\");\n const synthetic = {\n ...e,\n target: { ...(e.target as unknown as HTMLTextAreaElement), value: \"\" },\n currentTarget: { ...(e.currentTarget as unknown as HTMLTextAreaElement), value: \"\" },\n } as unknown as React.ChangeEvent<HTMLTextAreaElement>;\n onChange?.(\"\", synthetic);\n };\n\n const cls = [\"textarea\", invalid && \"invalid\", className].filter(Boolean).join(\" \");\n const showClear = !!allowClear && !!currentValue && !disabled;\n const count = currentValue ? currentValue.length : 0;\n\n const field = (\n <div className=\"textarea-wrap\">\n <textarea\n ref={ref}\n className={cls}\n value={isControlled ? value : undefined}\n defaultValue={isControlled ? undefined : defaultValue}\n onChange={handleChange}\n maxLength={maxLength}\n {...rest}\n />\n {showClear && (\n <span\n className=\"textarea-clear\"\n role=\"button\"\n aria-label=\"Clear\"\n tabIndex={-1}\n onMouseDown={(e) => e.preventDefault()}\n onClick={handleClear}\n >\n <Icon name=\"x\" size={12} />\n </span>\n )}\n </div>\n );\n\n if (!showCount) return field;\n\n return (\n <div className=\"input-shell\">\n {field}\n <div className=\"input-count\">\n {maxLength != null ? `${count} / ${maxLength}` : `${count}`}\n </div>\n </div>\n );\n }\n);\nTextarea.displayName = \"Textarea\";\n"]}
@@ -3,7 +3,7 @@
3
3
  var chunkYVO7XO4W_cjs = require('./chunk-YVO7XO4W.cjs');
4
4
  require('./tokens-HWQ7KWPG.css');
5
5
  require('./shared-NJHRNLRH.css');
6
- require('./Button-5UI7QXGU.css');
6
+ require('./Button-SDQD25AG.css');
7
7
  var React = require('react');
8
8
  var jsxRuntime = require('react/jsx-runtime');
9
9
 
@@ -35,6 +35,7 @@ var Button = React__namespace.forwardRef(
35
35
  icon,
36
36
  trailingIcon,
37
37
  loading,
38
+ block,
38
39
  disabled,
39
40
  className = "",
40
41
  type = "button",
@@ -45,6 +46,7 @@ var Button = React__namespace.forwardRef(
45
46
  variant,
46
47
  size !== "md" && size,
47
48
  loading && "loading",
49
+ block && "block",
48
50
  disabled && "disabled",
49
51
  className
50
52
  ].filter(Boolean).join(" ");
@@ -83,5 +85,5 @@ IconButton.displayName = "IconButton";
83
85
 
84
86
  exports.Button = Button;
85
87
  exports.IconButton = IconButton;
86
- //# sourceMappingURL=chunk-AAMYURWQ.cjs.map
87
- //# sourceMappingURL=chunk-AAMYURWQ.cjs.map
88
+ //# sourceMappingURL=chunk-OPTTHURA.cjs.map
89
+ //# sourceMappingURL=chunk-OPTTHURA.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Button/Button.tsx"],"names":["React","jsxs","jsx","Icon"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCO,IAAM,MAAA,GAAeA,gBAAA,CAAA,UAAA;AAAA,EAC1B,CACE;AAAA,IACE,QAAA;AAAA,IACA,OAAA,GAAU,SAAA;AAAA,IACV,IAAA,GAAO,IAAA;AAAA,IACP,IAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA,GAAY,EAAA;AAAA,IACZ,IAAA,GAAO,QAAA;AAAA,IACP,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,GAAA,GAAM;AAAA,MACV,KAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAS,IAAA,IAAQ,IAAA;AAAA,MACjB,OAAA,IAAW,SAAA;AAAA,MACX,KAAA,IAAS,OAAA;AAAA,MACT,QAAA,IAAY,UAAA;AAAA,MACZ;AAAA,KACF,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AAEX,IAAA,uBACEC,eAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA;AAAA,QACA,SAAA,EAAW,GAAA;AAAA,QACX,UAAU,QAAA,IAAY,OAAA;AAAA,QACrB,GAAG,IAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,OAAA,mBACCC,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,eAAW,IAAA,EAAC,CAAA,GACpC,IAAA,mBACFA,cAAA,CAACC,sBAAA,EAAA,EAAK,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA,GAC1B,IAAA;AAAA,UACH,QAAA;AAAA,UACA,gCAAgBD,cAAA,CAACC,sBAAA,EAAA,EAAK,IAAA,EAAM,YAAA,EAAc,MAAM,EAAA,EAAI;AAAA;AAAA;AAAA,KACvD;AAAA,EAEJ;AACF;AACA,MAAA,CAAO,WAAA,GAAc,QAAA;AAYd,IAAM,UAAA,GAAmBH,gBAAA,CAAA,UAAA;AAAA,EAC9B,CAAC,EAAE,IAAA,EAAM,GAAA,EAAK,YAAY,EAAA,EAAI,GAAG,IAAA,EAAK,EAAG,GAAA,qBACvCE,cAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,QAAQ,SAAS,CAAA,CAAA;AAAA,MAC5B,YAAA,EAAY,GAAA,IAAO,IAAA,CAAK,YAAY,CAAA,IAAK,IAAA;AAAA,MACzC,KAAA,EAAO,GAAA;AAAA,MACN,GAAG,IAAA;AAAA,MAEJ,QAAA,kBAAAA,cAAA,CAACC,sBAAA,EAAA,EAAK,IAAA,EAAM,IAAA,EAAM,MAAM,EAAA,EAAI;AAAA;AAAA;AAGlC;AACA,UAAA,CAAW,WAAA,GAAc,YAAA","file":"chunk-OPTTHURA.cjs","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Button.css\";\nimport * as React from \"react\";\nimport type { IconName } from \"../Icon\";\nimport { Icon } from \"../Icon\";\n\nexport type ButtonVariant = \"default\" | \"primary\" | \"ghost\" | \"danger\";\nexport type ButtonSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface ButtonProps\n extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"type\"> {\n /** Visual variant. `primary` uses the accent color; `ghost` is borderless; `danger` is red. */\n variant?: ButtonVariant;\n /** Control height preset. */\n size?: ButtonSize;\n /** Leading icon. */\n icon?: IconName;\n /** Trailing icon. */\n trailingIcon?: IconName;\n /** Show spinner + disable interaction. */\n loading?: boolean;\n /** Make the button fill the container's width. */\n block?: boolean;\n /** Button type attribute. Defaults to \"button\" to avoid accidental form submits. */\n type?: \"button\" | \"submit\" | \"reset\";\n /** Extra class names. */\n className?: string;\n children?: React.ReactNode;\n}\n\n/**\n * `Button` — the primary action surface.\n *\n * @example\n * <Button variant=\"primary\" icon=\"plus\">新建</Button>\n * <Button variant=\"ghost\" loading>保存</Button>\n */\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n children,\n variant = \"default\",\n size = \"md\",\n icon,\n trailingIcon,\n loading,\n block,\n disabled,\n className = \"\",\n type = \"button\",\n ...rest\n },\n ref\n ) => {\n const cls = [\n \"btn\",\n variant,\n size !== \"md\" && size,\n loading && \"loading\",\n block && \"block\",\n disabled && \"disabled\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <button\n ref={ref}\n type={type}\n className={cls}\n disabled={disabled || loading}\n {...rest}\n >\n {loading ? (\n <span className=\"spinner\" aria-hidden />\n ) : icon ? (\n <Icon name={icon} size={15} />\n ) : null}\n {children}\n {trailingIcon && <Icon name={trailingIcon} size={15} />}\n </button>\n );\n }\n);\nButton.displayName = \"Button\";\n\nexport interface IconButtonProps\n extends Omit<ButtonProps, \"icon\" | \"children\"> {\n icon: IconName;\n tip?: string;\n \"aria-label\"?: string;\n}\n\n/**\n * `IconButton` — square button containing just an icon. Pair with a tooltip.\n */\nexport const IconButton = React.forwardRef<HTMLButtonElement, IconButtonProps>(\n ({ icon, tip, className = \"\", ...rest }, ref) => (\n <Button\n ref={ref}\n className={`icon ${className}`}\n aria-label={tip || rest[\"aria-label\"] || icon}\n title={tip}\n {...rest}\n >\n <Icon name={icon} size={16} />\n </Button>\n )\n);\nIconButton.displayName = \"IconButton\";\n"]}
@@ -1,6 +1,6 @@
1
1
  import './tokens-HWQ7KWPG.css';
2
2
  import './shared-NJHRNLRH.css';
3
- import './Divider-Z37INS5E.css';
3
+ import './Divider-OEE4Q2KS.css';
4
4
  import { jsx } from 'react/jsx-runtime';
5
5
 
6
6
  // src/components/Divider/Divider.tsx
@@ -8,13 +8,22 @@ var Divider = ({
8
8
  direction = "horizontal",
9
9
  label,
10
10
  sunken,
11
+ dashed,
12
+ orientation = "center",
11
13
  className = "",
12
14
  ...rest
13
15
  }) => {
14
- const cls = ["divider", direction, sunken && "sunken", className].filter(Boolean).join(" ");
16
+ const cls = [
17
+ "divider",
18
+ direction,
19
+ sunken && "sunken",
20
+ dashed && "dashed",
21
+ label && direction === "horizontal" && `orient-${orientation}`,
22
+ className
23
+ ].filter(Boolean).join(" ");
15
24
  return /* @__PURE__ */ jsx("div", { className: cls, role: "separator", ...rest, children: label && /* @__PURE__ */ jsx("span", { className: "divider-label", children: label }) });
16
25
  };
17
26
 
18
27
  export { Divider };
19
- //# sourceMappingURL=chunk-F3NHM4GX.js.map
20
- //# sourceMappingURL=chunk-F3NHM4GX.js.map
28
+ //# sourceMappingURL=chunk-OYGFMXAA.js.map
29
+ //# sourceMappingURL=chunk-OYGFMXAA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Divider/Divider.tsx"],"names":[],"mappings":";;;;;;AAoBO,IAAM,UAAkC,CAAC;AAAA,EAC9C,SAAA,GAAY,YAAA;AAAA,EACZ,KAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA,GAAc,QAAA;AAAA,EACd,SAAA,GAAY,EAAA;AAAA,EACZ,GAAG;AACL,CAAA,KAAM;AACJ,EAAA,MAAM,GAAA,GAAM;AAAA,IACV,SAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA,IAAU,QAAA;AAAA,IACV,MAAA,IAAU,QAAA;AAAA,IACV,KAAA,IAAS,SAAA,KAAc,YAAA,IAAgB,CAAA,OAAA,EAAU,WAAW,CAAA,CAAA;AAAA,IAC5D;AAAA,GACF,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AACX,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAA,EAAK,MAAK,WAAA,EAAa,GAAG,IAAA,EACvC,QAAA,EAAA,KAAA,oBAAS,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAiB,iBAAM,CAAA,EACnD,CAAA;AAEJ","file":"chunk-OYGFMXAA.js","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Divider.css\";\nimport * as React from \"react\";\n\nexport interface DividerProps extends React.HTMLAttributes<HTMLDivElement> {\n direction?: \"horizontal\" | \"vertical\";\n label?: React.ReactNode;\n /** Use recessed groove styling. */\n sunken?: boolean;\n /** Render as dashed lines instead of solid. */\n dashed?: boolean;\n /**\n * Label position for horizontal dividers. Defaults to `\"center\"`.\n * Ignored when there is no `label`.\n */\n orientation?: \"left\" | \"center\" | \"right\";\n}\n\n/** `Divider` — visual separator, horizontal or vertical. */\nexport const Divider: React.FC<DividerProps> = ({\n direction = \"horizontal\",\n label,\n sunken,\n dashed,\n orientation = \"center\",\n className = \"\",\n ...rest\n}) => {\n const cls = [\n \"divider\",\n direction,\n sunken && \"sunken\",\n dashed && \"dashed\",\n label && direction === \"horizontal\" && `orient-${orientation}`,\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n return (\n <div className={cls} role=\"separator\" {...rest}>\n {label && <span className=\"divider-label\">{label}</span>}\n </div>\n );\n};\n"]}
@@ -0,0 +1,133 @@
1
+ 'use strict';
2
+
3
+ require('./tokens-HWQ7KWPG.css');
4
+ require('./shared-NJHRNLRH.css');
5
+ require('./Slider-X4PVA65R.css');
6
+ var React = require('react');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+
9
+ function _interopNamespace(e) {
10
+ if (e && e.__esModule) return e;
11
+ var n = Object.create(null);
12
+ if (e) {
13
+ Object.keys(e).forEach(function (k) {
14
+ if (k !== 'default') {
15
+ var d = Object.getOwnPropertyDescriptor(e, k);
16
+ Object.defineProperty(n, k, d.get ? d : {
17
+ enumerable: true,
18
+ get: function () { return e[k]; }
19
+ });
20
+ }
21
+ });
22
+ }
23
+ n.default = e;
24
+ return Object.freeze(n);
25
+ }
26
+
27
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
28
+
29
+ // src/components/Slider/Slider.tsx
30
+ var asArray = (v, fallback) => {
31
+ if (v === void 0) return [fallback];
32
+ return Array.isArray(v) ? [...v] : [v];
33
+ };
34
+ var Slider = (props) => {
35
+ const {
36
+ min = 0,
37
+ max = 100,
38
+ step = 1,
39
+ disabled,
40
+ showValue,
41
+ tone = "accent",
42
+ marks,
43
+ className = ""
44
+ } = props;
45
+ const range = props.range === true;
46
+ const value = props.value;
47
+ const defaultValue = props.defaultValue;
48
+ const onChange = props.onChange;
49
+ const initial = React__namespace.useMemo(() => {
50
+ if (defaultValue !== void 0) return asArray(defaultValue, 0);
51
+ return range ? [min, max] : [0];
52
+ }, []);
53
+ const [inner, setInner] = React__namespace.useState(initial);
54
+ const isControlled = value !== void 0;
55
+ const nums = isControlled ? asArray(value, range ? min : 0) : inner;
56
+ const pctOf = (n) => (n - min) / (max - min) * 100;
57
+ const emit = (arr) => {
58
+ if (range) {
59
+ onChange?.([arr[0], arr[1]]);
60
+ } else {
61
+ onChange?.(arr[0]);
62
+ }
63
+ };
64
+ const updateAt = (index, next) => {
65
+ const clamped = Math.max(min, Math.min(max, next));
66
+ const out = [...nums];
67
+ out[index] = clamped;
68
+ if (range && out.length === 2 && out[0] > out[1]) {
69
+ out.sort((a, b) => a - b);
70
+ }
71
+ if (!isControlled) setInner(out);
72
+ emit(out);
73
+ };
74
+ const handleMarkClick = (mark) => {
75
+ if (disabled) return;
76
+ if (!range) {
77
+ updateAt(0, mark);
78
+ return;
79
+ }
80
+ const [a, b] = nums;
81
+ const closerIndex = Math.abs(a - mark) <= Math.abs(b - mark) ? 0 : 1;
82
+ updateAt(closerIndex, mark);
83
+ };
84
+ const fillLeft = range ? pctOf(Math.min(nums[0], nums[1])) : 0;
85
+ const fillRight = range ? 100 - pctOf(Math.max(nums[0], nums[1])) : 100 - pctOf(nums[0]);
86
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `slider ${tone} ${disabled ? "disabled" : ""} ${marks ? "has-marks" : ""} ${className}`, children: [
87
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "slider-track", children: /* @__PURE__ */ jsxRuntime.jsx(
88
+ "div",
89
+ {
90
+ className: "slider-fill",
91
+ style: { left: `${fillLeft}%`, right: `${fillRight}%` }
92
+ }
93
+ ) }),
94
+ nums.map((n, i) => /* @__PURE__ */ jsxRuntime.jsxs(React__namespace.Fragment, { children: [
95
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "slider-thumb", style: { left: `${pctOf(n)}%` } }),
96
+ /* @__PURE__ */ jsxRuntime.jsx(
97
+ "input",
98
+ {
99
+ type: "range",
100
+ min,
101
+ max,
102
+ step,
103
+ value: n,
104
+ disabled,
105
+ onChange: (e) => updateAt(i, Number(e.target.value))
106
+ }
107
+ )
108
+ ] }, i)),
109
+ showValue && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "slider-value", children: range ? `${nums[0]} \u2013 ${nums[1]}` : nums[0] }),
110
+ marks && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "slider-marks", children: Object.entries(marks).map(([k, label]) => {
111
+ const n = Number(k);
112
+ const left = pctOf(n);
113
+ const active = range ? n >= Math.min(nums[0], nums[1]) && n <= Math.max(nums[0], nums[1]) : n <= nums[0];
114
+ return /* @__PURE__ */ jsxRuntime.jsxs(
115
+ "span",
116
+ {
117
+ className: `slider-mark ${active ? "active" : ""}`,
118
+ style: { left: `${left}%` },
119
+ onClick: () => handleMarkClick(n),
120
+ children: [
121
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "slider-mark-dot" }),
122
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "slider-mark-label", children: label })
123
+ ]
124
+ },
125
+ k
126
+ );
127
+ }) })
128
+ ] });
129
+ };
130
+
131
+ exports.Slider = Slider;
132
+ //# sourceMappingURL=chunk-PBBHUUXU.cjs.map
133
+ //# sourceMappingURL=chunk-PBBHUUXU.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Slider/Slider.tsx"],"names":["React","jsxs","jsx"],"mappings":"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","file":"chunk-PBBHUUXU.cjs","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Slider.css\";\nimport * as React from \"react\";\n\nexport type SliderSingleValue = number;\nexport type SliderRangeValue = [number, number];\nexport type SliderValue = SliderSingleValue | SliderRangeValue;\n\ninterface SliderBaseProps {\n min?: number;\n max?: number;\n step?: number;\n disabled?: boolean;\n showValue?: boolean;\n tone?: \"accent\" | \"success\" | \"warning\" | \"danger\";\n /** Tick marks with labels. Clicking a mark snaps to it. */\n marks?: Record<number, React.ReactNode>;\n className?: string;\n}\n\nexport interface SliderSingleProps extends SliderBaseProps {\n range?: false;\n value?: number;\n defaultValue?: number;\n onChange?: (value: number) => void;\n}\n\nexport interface SliderRangeProps extends SliderBaseProps {\n range: true;\n value?: SliderRangeValue;\n defaultValue?: SliderRangeValue;\n onChange?: (value: SliderRangeValue) => void;\n}\n\nexport type SliderProps = SliderSingleProps | SliderRangeProps;\n\nconst asArray = (v: SliderValue | undefined, fallback: number): number[] => {\n if (v === undefined) return [fallback];\n return Array.isArray(v) ? [...v] : [v];\n};\n\n/** `Slider` — neumorphic range input with grooved track. */\nexport const Slider: React.FC<SliderProps> = (props) => {\n const {\n min = 0,\n max = 100,\n step = 1,\n disabled,\n showValue,\n tone = \"accent\",\n marks,\n className = \"\",\n } = props;\n\n const range = (props as SliderRangeProps).range === true;\n const value = (props as { value?: SliderValue }).value;\n const defaultValue = (props as { defaultValue?: SliderValue }).defaultValue;\n const onChange = (props as { onChange?: (v: SliderValue) => void }).onChange;\n\n const initial = React.useMemo<number[]>(() => {\n if (defaultValue !== undefined) return asArray(defaultValue, 0);\n return range ? [min, max] : [0];\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const [inner, setInner] = React.useState<number[]>(initial);\n const isControlled = value !== undefined;\n const nums = isControlled ? asArray(value, range ? min : 0) : inner;\n\n const pctOf = (n: number) => ((n - min) / (max - min)) * 100;\n\n const emit = (arr: number[]) => {\n if (range) {\n onChange?.([arr[0], arr[1]] as SliderRangeValue);\n } else {\n onChange?.(arr[0]);\n }\n };\n\n const updateAt = (index: number, next: number) => {\n const clamped = Math.max(min, Math.min(max, next));\n const out = [...nums];\n out[index] = clamped;\n if (range && out.length === 2 && out[0] > out[1]) {\n out.sort((a, b) => a - b);\n }\n if (!isControlled) setInner(out);\n emit(out);\n };\n\n const handleMarkClick = (mark: number) => {\n if (disabled) return;\n if (!range) {\n updateAt(0, mark);\n return;\n }\n const [a, b] = nums;\n const closerIndex = Math.abs(a - mark) <= Math.abs(b - mark) ? 0 : 1;\n updateAt(closerIndex, mark);\n };\n\n const fillLeft = range ? pctOf(Math.min(nums[0], nums[1])) : 0;\n const fillRight = range\n ? 100 - pctOf(Math.max(nums[0], nums[1]))\n : 100 - pctOf(nums[0]);\n\n return (\n <div className={`slider ${tone} ${disabled ? \"disabled\" : \"\"} ${marks ? \"has-marks\" : \"\"} ${className}`}>\n <div className=\"slider-track\">\n <div\n className=\"slider-fill\"\n style={{ left: `${fillLeft}%`, right: `${fillRight}%` }}\n />\n </div>\n {nums.map((n, i) => (\n <React.Fragment key={i}>\n <div className=\"slider-thumb\" style={{ left: `${pctOf(n)}%` }} />\n <input\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={n}\n disabled={disabled}\n onChange={(e) => updateAt(i, Number(e.target.value))}\n />\n </React.Fragment>\n ))}\n {showValue && (\n <span className=\"slider-value\">\n {range ? `${nums[0]} – ${nums[1]}` : nums[0]}\n </span>\n )}\n {marks && (\n <div className=\"slider-marks\">\n {Object.entries(marks).map(([k, label]) => {\n const n = Number(k);\n const left = pctOf(n);\n const active = range\n ? n >= Math.min(nums[0], nums[1]) && n <= Math.max(nums[0], nums[1])\n : n <= nums[0];\n return (\n <span\n key={k}\n className={`slider-mark ${active ? \"active\" : \"\"}`}\n style={{ left: `${left}%` }}\n onClick={() => handleMarkClick(n)}\n >\n <span className=\"slider-mark-dot\" />\n <span className=\"slider-mark-label\">{label}</span>\n </span>\n );\n })}\n </div>\n )}\n </div>\n );\n};\n"]}
@@ -0,0 +1,95 @@
1
+ 'use strict';
2
+
3
+ var chunkYVO7XO4W_cjs = require('./chunk-YVO7XO4W.cjs');
4
+ require('./tokens-HWQ7KWPG.css');
5
+ require('./shared-NJHRNLRH.css');
6
+ require('./Accordion-3TQPKNN3.css');
7
+ var React = require('react');
8
+ var jsxRuntime = require('react/jsx-runtime');
9
+
10
+ function _interopNamespace(e) {
11
+ if (e && e.__esModule) return e;
12
+ var n = Object.create(null);
13
+ if (e) {
14
+ Object.keys(e).forEach(function (k) {
15
+ if (k !== 'default') {
16
+ var d = Object.getOwnPropertyDescriptor(e, k);
17
+ Object.defineProperty(n, k, d.get ? d : {
18
+ enumerable: true,
19
+ get: function () { return e[k]; }
20
+ });
21
+ }
22
+ });
23
+ }
24
+ n.default = e;
25
+ return Object.freeze(n);
26
+ }
27
+
28
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
29
+
30
+ var Accordion = ({
31
+ items,
32
+ multiple = false,
33
+ accordion = false,
34
+ collapsible = "header",
35
+ activeKeys,
36
+ defaultActiveKeys = [],
37
+ onChange,
38
+ className = ""
39
+ }) => {
40
+ const [inner, setInner] = React__namespace.useState(defaultActiveKeys);
41
+ const isControlled = activeKeys !== void 0;
42
+ const keys = isControlled ? activeKeys : inner;
43
+ const singleOpen = accordion || !multiple;
44
+ const toggle = (k, itemDisabled) => {
45
+ if (collapsible === "disabled" || itemDisabled) return;
46
+ const next = keys.includes(k) ? keys.filter((x) => x !== k) : singleOpen ? [k] : [...keys, k];
47
+ if (!isControlled) setInner(next);
48
+ onChange?.(next);
49
+ };
50
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: `accordion ${className}`, children: items.map((it) => {
51
+ const open = keys.includes(it.key);
52
+ const isDisabled = it.disabled || collapsible === "disabled";
53
+ const headerClickable = collapsible === "header" && !isDisabled;
54
+ return /* @__PURE__ */ jsxRuntime.jsxs(
55
+ "div",
56
+ {
57
+ className: `accordion-item ${open ? "open" : ""} ${isDisabled ? "disabled" : ""} ${collapsible === "icon" ? "icon-only" : ""}`,
58
+ children: [
59
+ /* @__PURE__ */ jsxRuntime.jsxs(
60
+ "button",
61
+ {
62
+ type: "button",
63
+ className: "accordion-head",
64
+ disabled: isDisabled,
65
+ onClick: () => headerClickable && toggle(it.key, it.disabled),
66
+ "aria-expanded": open,
67
+ children: [
68
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: it.title }),
69
+ /* @__PURE__ */ jsxRuntime.jsx(
70
+ "span",
71
+ {
72
+ className: `accordion-chev${collapsible === "icon" ? " clickable" : ""}`,
73
+ onClick: (e) => {
74
+ if (collapsible === "icon" && !isDisabled) {
75
+ e.stopPropagation();
76
+ toggle(it.key, it.disabled);
77
+ }
78
+ },
79
+ children: /* @__PURE__ */ jsxRuntime.jsx(chunkYVO7XO4W_cjs.Icon, { name: "chevDown", size: 16 })
80
+ }
81
+ )
82
+ ]
83
+ }
84
+ ),
85
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "accordion-body", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "accordion-body-inner", children: it.content }) })
86
+ ]
87
+ },
88
+ it.key
89
+ );
90
+ }) });
91
+ };
92
+
93
+ exports.Accordion = Accordion;
94
+ //# sourceMappingURL=chunk-RDLPX7RK.cjs.map
95
+ //# sourceMappingURL=chunk-RDLPX7RK.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Accordion/Accordion.tsx"],"names":["React","jsx","jsxs","Icon"],"mappings":"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","file":"chunk-RDLPX7RK.cjs","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Accordion.css\";\nimport * as React from \"react\";\nimport { Icon } from \"../Icon\";\n\nexport interface AccordionItem {\n key: string;\n title: React.ReactNode;\n content: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface AccordionProps {\n items: AccordionItem[];\n /** If true, multiple sections can be open at once. */\n multiple?: boolean;\n /**\n * Accordion mode — at most one item open at a time. Takes precedence over `multiple`\n * when both are set.\n */\n accordion?: boolean;\n /**\n * What triggers expansion.\n * - `\"header\"` (default): clicking anywhere on the header toggles.\n * - `\"icon\"`: only the chevron icon is clickable.\n * - `\"disabled\"`: the panel cannot be toggled.\n */\n collapsible?: \"header\" | \"icon\" | \"disabled\";\n activeKeys?: string[];\n defaultActiveKeys?: string[];\n onChange?: (keys: string[]) => void;\n className?: string;\n}\n\n/** `Accordion` — collapsible sections. */\nexport const Accordion: React.FC<AccordionProps> = ({\n items,\n multiple = false,\n accordion = false,\n collapsible = \"header\",\n activeKeys,\n defaultActiveKeys = [],\n onChange,\n className = \"\",\n}) => {\n const [inner, setInner] = React.useState<string[]>(defaultActiveKeys);\n const isControlled = activeKeys !== undefined;\n const keys = isControlled ? activeKeys! : inner;\n\n // accordion takes precedence over multiple\n const singleOpen = accordion || !multiple;\n\n const toggle = (k: string, itemDisabled?: boolean) => {\n if (collapsible === \"disabled\" || itemDisabled) return;\n const next = keys.includes(k)\n ? keys.filter((x) => x !== k)\n : singleOpen\n ? [k]\n : [...keys, k];\n if (!isControlled) setInner(next);\n onChange?.(next);\n };\n\n return (\n <div className={`accordion ${className}`}>\n {items.map((it) => {\n const open = keys.includes(it.key);\n const isDisabled = it.disabled || collapsible === \"disabled\";\n const headerClickable = collapsible === \"header\" && !isDisabled;\n return (\n <div\n key={it.key}\n className={`accordion-item ${open ? \"open\" : \"\"} ${isDisabled ? \"disabled\" : \"\"} ${collapsible === \"icon\" ? \"icon-only\" : \"\"}`}\n >\n <button\n type=\"button\"\n className=\"accordion-head\"\n disabled={isDisabled}\n onClick={() => headerClickable && toggle(it.key, it.disabled)}\n aria-expanded={open}\n >\n <span>{it.title}</span>\n <span\n className={`accordion-chev${collapsible === \"icon\" ? \" clickable\" : \"\"}`}\n onClick={(e) => {\n if (collapsible === \"icon\" && !isDisabled) {\n e.stopPropagation();\n toggle(it.key, it.disabled);\n }\n }}\n >\n <Icon name=\"chevDown\" size={16} />\n </span>\n </button>\n <div className=\"accordion-body\">\n <div className=\"accordion-body-inner\">{it.content}</div>\n </div>\n </div>\n );\n })}\n </div>\n );\n};\n"]}