@mdigital_ui/ui 0.4.4 → 0.4.6

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 (128) hide show
  1. package/README.md +258 -662
  2. package/dist/anchor/index.js +4 -0
  3. package/dist/anchor/index.js.map +1 -0
  4. package/dist/autocomplete/index.js +6 -0
  5. package/dist/autocomplete/index.js.map +1 -0
  6. package/dist/breadcrumbs/index.js +3 -3
  7. package/dist/calendar/index.js +4 -0
  8. package/dist/calendar/index.js.map +1 -0
  9. package/dist/chunk-3Z7RLVWD.js +258 -0
  10. package/dist/chunk-3Z7RLVWD.js.map +1 -0
  11. package/dist/chunk-5YEC6FDN.js +263 -0
  12. package/dist/chunk-5YEC6FDN.js.map +1 -0
  13. package/dist/{chunk-GOBUFGGJ.js → chunk-6NXZWLSM.js} +3 -3
  14. package/dist/{chunk-GOBUFGGJ.js.map → chunk-6NXZWLSM.js.map} +1 -1
  15. package/dist/{chunk-FU5Q4WVX.js → chunk-6ROGWFQ2.js} +3 -3
  16. package/dist/{chunk-FU5Q4WVX.js.map → chunk-6ROGWFQ2.js.map} +1 -1
  17. package/dist/{chunk-LJOQ2C5W.js → chunk-6RZEJRTC.js} +3 -3
  18. package/dist/{chunk-LJOQ2C5W.js.map → chunk-6RZEJRTC.js.map} +1 -1
  19. package/dist/chunk-74AF6PO2.js +374 -0
  20. package/dist/chunk-74AF6PO2.js.map +1 -0
  21. package/dist/chunk-75N6T3IS.js +77 -0
  22. package/dist/chunk-75N6T3IS.js.map +1 -0
  23. package/dist/{chunk-BKLJDEUX.js → chunk-DBPLQZJ2.js} +38 -14
  24. package/dist/chunk-DBPLQZJ2.js.map +1 -0
  25. package/dist/chunk-ED4CQZ72.js +343 -0
  26. package/dist/chunk-ED4CQZ72.js.map +1 -0
  27. package/dist/{chunk-4ZXHLPRS.js → chunk-FY2TZ2NT.js} +4 -4
  28. package/dist/{chunk-4ZXHLPRS.js.map → chunk-FY2TZ2NT.js.map} +1 -1
  29. package/dist/{chunk-I5AD247M.js → chunk-HKQOAEFY.js} +13 -3
  30. package/dist/chunk-HKQOAEFY.js.map +1 -0
  31. package/dist/chunk-JWYBDNC6.js +307 -0
  32. package/dist/chunk-JWYBDNC6.js.map +1 -0
  33. package/dist/{chunk-W5VLFE4U.js → chunk-LHZJ2GJU.js} +32 -6
  34. package/dist/chunk-LHZJ2GJU.js.map +1 -0
  35. package/dist/{chunk-253JZOYG.js → chunk-NB66D6A5.js} +3 -2
  36. package/dist/chunk-NB66D6A5.js.map +1 -0
  37. package/dist/{chunk-BGMYX7L5.js → chunk-NF6JUJBE.js} +9 -7
  38. package/dist/chunk-NF6JUJBE.js.map +1 -0
  39. package/dist/chunk-NPK4ESMA.js +281 -0
  40. package/dist/chunk-NPK4ESMA.js.map +1 -0
  41. package/dist/{chunk-X7MF3TIF.js → chunk-PD3O6ZH4.js} +12 -5
  42. package/dist/chunk-PD3O6ZH4.js.map +1 -0
  43. package/dist/{chunk-XOEEAMMY.js → chunk-Q46WXJVW.js} +21 -21
  44. package/dist/chunk-Q46WXJVW.js.map +1 -0
  45. package/dist/chunk-QEYNOLRC.js +157 -0
  46. package/dist/chunk-QEYNOLRC.js.map +1 -0
  47. package/dist/chunk-RNG7HR6U.js +174 -0
  48. package/dist/chunk-RNG7HR6U.js.map +1 -0
  49. package/dist/{chunk-HJITFPBT.js → chunk-SZMIHNCZ.js} +13 -7
  50. package/dist/chunk-SZMIHNCZ.js.map +1 -0
  51. package/dist/chunk-TDPJYCNI.js +96 -0
  52. package/dist/chunk-TDPJYCNI.js.map +1 -0
  53. package/dist/chunk-UFYG3HKL.js +374 -0
  54. package/dist/chunk-UFYG3HKL.js.map +1 -0
  55. package/dist/chunk-VNH6R5EU.js +211 -0
  56. package/dist/chunk-VNH6R5EU.js.map +1 -0
  57. package/dist/{chunk-SFP77VS3.js → chunk-X7JN7WPF.js} +5 -2
  58. package/dist/chunk-X7JN7WPF.js.map +1 -0
  59. package/dist/chunk-YRSHBAUQ.js +201 -0
  60. package/dist/chunk-YRSHBAUQ.js.map +1 -0
  61. package/dist/chunk-YUACN5GJ.js +303 -0
  62. package/dist/chunk-YUACN5GJ.js.map +1 -0
  63. package/dist/{chunk-HVHQA34X.js → chunk-ZNGKUG2N.js} +11 -6
  64. package/dist/chunk-ZNGKUG2N.js.map +1 -0
  65. package/dist/color-picker/index.js +6 -0
  66. package/dist/color-picker/index.js.map +1 -0
  67. package/dist/date-picker/RangePicker.d.ts.map +1 -1
  68. package/dist/date-picker/index.d.ts.map +1 -1
  69. package/dist/date-picker/index.js +1 -1
  70. package/dist/date-picker/shared.d.ts +5 -0
  71. package/dist/date-picker/shared.d.ts.map +1 -1
  72. package/dist/dropdown/index.js +2 -2
  73. package/dist/float-button/index.js +5 -0
  74. package/dist/float-button/index.js.map +1 -0
  75. package/dist/index.js +51 -2996
  76. package/dist/index.js.map +1 -1
  77. package/dist/input/index.d.ts.map +1 -1
  78. package/dist/input/index.js +1 -1
  79. package/dist/input-password/index.js +2 -2
  80. package/dist/mentions/index.js +4 -0
  81. package/dist/mentions/index.js.map +1 -0
  82. package/dist/menubar/index.d.ts +3 -3
  83. package/dist/menubar/index.d.ts.map +1 -1
  84. package/dist/menubar/index.js +1 -1
  85. package/dist/multi-select/index.d.ts.map +1 -1
  86. package/dist/multi-select/index.js +3 -3
  87. package/dist/number-input/index.d.ts.map +1 -1
  88. package/dist/number-input/index.js +1 -1
  89. package/dist/qr-code/index.js +5 -0
  90. package/dist/qr-code/index.js.map +1 -0
  91. package/dist/resizable/index.js +4 -0
  92. package/dist/resizable/index.js.map +1 -0
  93. package/dist/result/index.js +4 -0
  94. package/dist/result/index.js.map +1 -0
  95. package/dist/select/index.d.ts.map +1 -1
  96. package/dist/select/index.js +3 -3
  97. package/dist/shared/useSelectBase.d.ts.map +1 -1
  98. package/dist/skeleton/index.d.ts.map +1 -1
  99. package/dist/skeleton/index.js +1 -1
  100. package/dist/table/index.js +4 -4
  101. package/dist/tabs/index.d.ts.map +1 -1
  102. package/dist/tabs/index.js +1 -1
  103. package/dist/tags-input/index.js +5 -0
  104. package/dist/tags-input/index.js.map +1 -0
  105. package/dist/toast/index.d.ts.map +1 -1
  106. package/dist/toast/index.js +1 -1
  107. package/dist/tooltip/index.d.ts.map +1 -1
  108. package/dist/tooltip/index.js +1 -1
  109. package/dist/tour/index.js +5 -0
  110. package/dist/tour/index.js.map +1 -0
  111. package/dist/typography/index.js +4 -0
  112. package/dist/typography/index.js.map +1 -0
  113. package/dist/watermark/index.js +4 -0
  114. package/dist/watermark/index.js.map +1 -0
  115. package/package.json +59 -11
  116. package/styles/global.css +498 -6016
  117. package/dist/chunk-253JZOYG.js.map +0 -1
  118. package/dist/chunk-BGMYX7L5.js.map +0 -1
  119. package/dist/chunk-BKLJDEUX.js.map +0 -1
  120. package/dist/chunk-BS4PZPY6.js +0 -322
  121. package/dist/chunk-BS4PZPY6.js.map +0 -1
  122. package/dist/chunk-HJITFPBT.js.map +0 -1
  123. package/dist/chunk-HVHQA34X.js.map +0 -1
  124. package/dist/chunk-I5AD247M.js.map +0 -1
  125. package/dist/chunk-SFP77VS3.js.map +0 -1
  126. package/dist/chunk-W5VLFE4U.js.map +0 -1
  127. package/dist/chunk-X7MF3TIF.js.map +0 -1
  128. package/dist/chunk-XOEEAMMY.js.map +0 -1
@@ -0,0 +1,374 @@
1
+ import { Popover, PopoverTrigger, PopoverContent } from './chunk-ROQGBDET.js';
2
+ import { cn } from './chunk-RAS6HUEI.js';
3
+ import { cva } from 'class-variance-authority';
4
+ import React from 'react';
5
+ import { jsxs, jsx } from 'react/jsx-runtime';
6
+
7
+ function hexToHsv(hex) {
8
+ const r = parseInt(hex.slice(1, 3), 16) / 255;
9
+ const g = parseInt(hex.slice(3, 5), 16) / 255;
10
+ const b = parseInt(hex.slice(5, 7), 16) / 255;
11
+ const max = Math.max(r, g, b), min = Math.min(r, g, b);
12
+ const d = max - min;
13
+ let h = 0;
14
+ if (d !== 0) {
15
+ if (max === r) h = ((g - b) / d + 6) % 6;
16
+ else if (max === g) h = (b - r) / d + 2;
17
+ else h = (r - g) / d + 4;
18
+ h *= 60;
19
+ }
20
+ const s = max === 0 ? 0 : d / max;
21
+ return [h, s, max];
22
+ }
23
+ function hsvToHex(h, s, v) {
24
+ const c = v * s;
25
+ const x = c * (1 - Math.abs(h / 60 % 2 - 1));
26
+ const m = v - c;
27
+ let r = 0, g = 0, b = 0;
28
+ if (h < 60) {
29
+ r = c;
30
+ g = x;
31
+ } else if (h < 120) {
32
+ r = x;
33
+ g = c;
34
+ } else if (h < 180) {
35
+ g = c;
36
+ b = x;
37
+ } else if (h < 240) {
38
+ g = x;
39
+ b = c;
40
+ } else if (h < 300) {
41
+ r = x;
42
+ b = c;
43
+ } else {
44
+ r = c;
45
+ b = x;
46
+ }
47
+ const toHex = (n) => Math.round((n + m) * 255).toString(16).padStart(2, "0");
48
+ return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
49
+ }
50
+ function isValidHex(v) {
51
+ return /^#[0-9a-fA-F]{6}$/.test(v);
52
+ }
53
+ function normalizeHex(v) {
54
+ if (!v) return "#000000";
55
+ const clean = v.startsWith("#") ? v : `#${v}`;
56
+ return isValidHex(clean) ? clean.toLowerCase() : "#000000";
57
+ }
58
+ var sizeMap = {
59
+ xs: { area: "w-40 h-28", hue: "h-2", swatch: "w-4 h-4" },
60
+ sm: { area: "w-48 h-32", hue: "h-2.5", swatch: "w-5 h-5" },
61
+ md: { area: "w-56 h-36", hue: "h-3", swatch: "w-6 h-6" },
62
+ lg: { area: "w-64 h-44", hue: "h-3.5", swatch: "w-7 h-7" }
63
+ };
64
+ var inputVariants = cva(
65
+ "flex items-center rounded-md border border-border bg-background text-text-primary transition-colors focus-within:border-primary",
66
+ {
67
+ variants: {
68
+ size: {
69
+ xs: "h-7 px-2 text-xs gap-1.5",
70
+ sm: "h-8 px-2.5 text-sm gap-2",
71
+ md: "h-9 px-3 text-sm gap-2",
72
+ lg: "h-10 px-3.5 text-base gap-2.5"
73
+ }
74
+ },
75
+ defaultVariants: { size: "md" }
76
+ }
77
+ );
78
+ function SaturationArea({
79
+ hue,
80
+ sat,
81
+ val,
82
+ onChangeSV,
83
+ areaClass,
84
+ disabled
85
+ }) {
86
+ const ref = React.useRef(null);
87
+ const update = React.useCallback(
88
+ (clientX, clientY) => {
89
+ if (!ref.current || disabled) return;
90
+ const rect = ref.current.getBoundingClientRect();
91
+ const s = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));
92
+ const v = Math.max(0, Math.min(1, 1 - (clientY - rect.top) / rect.height));
93
+ onChangeSV(s, v);
94
+ },
95
+ [onChangeSV, disabled]
96
+ );
97
+ const handlePointerDown = (e) => {
98
+ if (disabled) return;
99
+ e.currentTarget.setPointerCapture(e.pointerId);
100
+ update(e.clientX, e.clientY);
101
+ };
102
+ const handlePointerMove = (e) => {
103
+ if (e.currentTarget.hasPointerCapture(e.pointerId)) {
104
+ update(e.clientX, e.clientY);
105
+ }
106
+ };
107
+ return /* @__PURE__ */ jsxs(
108
+ "div",
109
+ {
110
+ ref,
111
+ className: cn("colorPicker_saturation", "relative rounded-md cursor-crosshair", areaClass),
112
+ style: { background: `hsl(${hue}, 100%, 50%)` },
113
+ onPointerDown: handlePointerDown,
114
+ onPointerMove: handlePointerMove,
115
+ children: [
116
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-0 rounded-md", style: { background: "linear-gradient(to right, white, transparent)" } }),
117
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-0 rounded-md", style: { background: "linear-gradient(to top, black, transparent)" } }),
118
+ /* @__PURE__ */ jsx(
119
+ "div",
120
+ {
121
+ className: "absolute w-3.5 h-3.5 rounded-full border-2 border-white shadow-md -translate-x-1/2 -translate-y-1/2 pointer-events-none",
122
+ style: { left: `${sat * 100}%`, top: `${(1 - val) * 100}%` }
123
+ }
124
+ )
125
+ ]
126
+ }
127
+ );
128
+ }
129
+ function HueSlider({
130
+ hue,
131
+ onChange,
132
+ hueClass,
133
+ disabled
134
+ }) {
135
+ const ref = React.useRef(null);
136
+ const update = React.useCallback(
137
+ (clientX) => {
138
+ if (!ref.current || disabled) return;
139
+ const rect = ref.current.getBoundingClientRect();
140
+ const h = Math.max(0, Math.min(360, (clientX - rect.left) / rect.width * 360));
141
+ onChange(h);
142
+ },
143
+ [onChange, disabled]
144
+ );
145
+ const handlePointerDown = (e) => {
146
+ if (disabled) return;
147
+ e.currentTarget.setPointerCapture(e.pointerId);
148
+ update(e.clientX);
149
+ };
150
+ const handlePointerMove = (e) => {
151
+ if (e.currentTarget.hasPointerCapture(e.pointerId)) update(e.clientX);
152
+ };
153
+ return /* @__PURE__ */ jsx(
154
+ "div",
155
+ {
156
+ ref,
157
+ className: cn("colorPicker_hue", "relative rounded-full cursor-pointer", hueClass),
158
+ style: { background: "linear-gradient(to right, #f00 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%)" },
159
+ onPointerDown: handlePointerDown,
160
+ onPointerMove: handlePointerMove,
161
+ children: /* @__PURE__ */ jsx(
162
+ "div",
163
+ {
164
+ className: "absolute w-3.5 h-3.5 rounded-full border-2 border-white shadow-md -translate-x-1/2 top-1/2 -translate-y-1/2 pointer-events-none",
165
+ style: { left: `${hue / 360 * 100}%` }
166
+ }
167
+ )
168
+ }
169
+ );
170
+ }
171
+ var ColorPicker = React.memo(
172
+ ({
173
+ value,
174
+ defaultValue = "#3b82f6",
175
+ onChange,
176
+ swatches,
177
+ size = "md",
178
+ disabled = false,
179
+ label,
180
+ className,
181
+ classNames
182
+ }) => {
183
+ const [internalValue, setInternalValue] = React.useState(normalizeHex(defaultValue));
184
+ const currentValue = value !== void 0 ? normalizeHex(value) : internalValue;
185
+ const [h, s, v] = React.useMemo(() => hexToHsv(currentValue), [currentValue]);
186
+ const [hue, setHue] = React.useState(h);
187
+ React.useEffect(() => {
188
+ if (s > 0.01 || v > 0.01) setHue(h);
189
+ }, [h, s, v]);
190
+ const [inputText, setInputText] = React.useState(currentValue);
191
+ React.useEffect(() => setInputText(currentValue), [currentValue]);
192
+ const update = (hex) => {
193
+ const valid = normalizeHex(hex);
194
+ if (value === void 0) setInternalValue(valid);
195
+ onChange?.(valid);
196
+ };
197
+ const handleSVChange = (ns, nv) => {
198
+ update(hsvToHex(hue, ns, nv));
199
+ };
200
+ const handleHueChange = (nh) => {
201
+ setHue(nh);
202
+ update(hsvToHex(nh, s, v));
203
+ };
204
+ const handleInputBlur = () => {
205
+ if (isValidHex(inputText) || isValidHex(`#${inputText}`)) {
206
+ update(inputText.startsWith("#") ? inputText : `#${inputText}`);
207
+ } else {
208
+ setInputText(currentValue);
209
+ }
210
+ };
211
+ const sizes = sizeMap[size];
212
+ return /* @__PURE__ */ jsxs(
213
+ "div",
214
+ {
215
+ "data-slot": "root",
216
+ className: cn(
217
+ "colorPicker_root",
218
+ "inline-flex flex-col gap-2",
219
+ disabled && "opacity-50 pointer-events-none",
220
+ classNames?.root,
221
+ className
222
+ ),
223
+ children: [
224
+ label && /* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-text-primary", children: label }),
225
+ /* @__PURE__ */ jsx(
226
+ SaturationArea,
227
+ {
228
+ hue,
229
+ sat: s,
230
+ val: v,
231
+ onChangeSV: handleSVChange,
232
+ areaClass: cn(sizes.area, classNames?.saturation),
233
+ disabled
234
+ }
235
+ ),
236
+ /* @__PURE__ */ jsx(
237
+ HueSlider,
238
+ {
239
+ hue,
240
+ onChange: handleHueChange,
241
+ hueClass: cn(sizes.hue, classNames?.hueSlider),
242
+ disabled
243
+ }
244
+ ),
245
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
246
+ /* @__PURE__ */ jsx(
247
+ "div",
248
+ {
249
+ "data-slot": "preview",
250
+ className: cn(
251
+ "colorPicker_preview",
252
+ "w-8 h-8 rounded-md border border-border shrink-0",
253
+ classNames?.preview
254
+ ),
255
+ style: { backgroundColor: currentValue }
256
+ }
257
+ ),
258
+ /* @__PURE__ */ jsx(
259
+ "input",
260
+ {
261
+ type: "text",
262
+ value: inputText,
263
+ onChange: (e) => setInputText(e.target.value),
264
+ onBlur: handleInputBlur,
265
+ onKeyDown: (e) => e.key === "Enter" && handleInputBlur(),
266
+ className: cn(
267
+ "colorPicker_input",
268
+ "flex-1 min-w-0 bg-transparent border border-border rounded-md px-2 py-1 text-sm text-text-primary outline-none focus:border-primary font-mono",
269
+ classNames?.input
270
+ ),
271
+ disabled
272
+ }
273
+ )
274
+ ] }),
275
+ swatches && swatches.length > 0 && /* @__PURE__ */ jsx(
276
+ "div",
277
+ {
278
+ "data-slot": "swatches",
279
+ className: cn(
280
+ "colorPicker_swatches",
281
+ "flex flex-wrap gap-1",
282
+ classNames?.swatches
283
+ ),
284
+ children: swatches.map((swatch) => /* @__PURE__ */ jsx(
285
+ "button",
286
+ {
287
+ type: "button",
288
+ onClick: () => update(swatch),
289
+ className: cn(
290
+ "colorPicker_swatch",
291
+ sizes.swatch,
292
+ "rounded-md border border-border cursor-pointer transition-transform hover:scale-110",
293
+ currentValue === normalizeHex(swatch) && "ring-2 ring-primary ring-offset-1 ring-offset-background",
294
+ classNames?.swatch
295
+ ),
296
+ style: { backgroundColor: swatch },
297
+ "aria-label": `Select color ${swatch}`
298
+ },
299
+ swatch
300
+ ))
301
+ }
302
+ )
303
+ ]
304
+ }
305
+ );
306
+ }
307
+ );
308
+ ColorPicker.displayName = "ColorPicker";
309
+ var ColorInput = React.memo(
310
+ ({
311
+ value,
312
+ defaultValue = "#3b82f6",
313
+ onChange,
314
+ swatches,
315
+ size = "md",
316
+ disabled = false,
317
+ label,
318
+ fullWidth = true,
319
+ className,
320
+ classNames
321
+ }) => {
322
+ const [internalValue, setInternalValue] = React.useState(normalizeHex(defaultValue));
323
+ const currentValue = value !== void 0 ? normalizeHex(value) : internalValue;
324
+ const update = (hex) => {
325
+ const valid = normalizeHex(hex);
326
+ if (value === void 0) setInternalValue(valid);
327
+ onChange?.(valid);
328
+ };
329
+ return /* @__PURE__ */ jsxs(
330
+ "div",
331
+ {
332
+ "data-slot": "root",
333
+ className: cn(
334
+ "colorInput_root",
335
+ "flex flex-col gap-1.5",
336
+ fullWidth ? "w-full" : "inline-flex",
337
+ className
338
+ ),
339
+ children: [
340
+ label && /* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-text-primary", children: label }),
341
+ /* @__PURE__ */ jsxs(Popover, { children: [
342
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs("div", { className: cn(inputVariants({ size }), disabled && "opacity-50 cursor-not-allowed", fullWidth && "w-full"), children: [
343
+ /* @__PURE__ */ jsx(
344
+ "div",
345
+ {
346
+ className: "w-5 h-5 rounded border border-border shrink-0",
347
+ style: { backgroundColor: currentValue }
348
+ }
349
+ ),
350
+ /* @__PURE__ */ jsx("span", { className: "flex-1 truncate text-text-primary font-mono", children: currentValue })
351
+ ] }) }),
352
+ /* @__PURE__ */ jsx(PopoverContent, { className: "w-auto p-3", align: "start", children: /* @__PURE__ */ jsx(
353
+ ColorPicker,
354
+ {
355
+ value: currentValue,
356
+ onChange: update,
357
+ swatches,
358
+ size,
359
+ disabled,
360
+ classNames
361
+ }
362
+ ) })
363
+ ] })
364
+ ]
365
+ }
366
+ );
367
+ }
368
+ );
369
+ ColorInput.displayName = "ColorInput";
370
+ var color_picker_default = ColorPicker;
371
+
372
+ export { ColorInput, ColorPicker, color_picker_default };
373
+ //# sourceMappingURL=chunk-UFYG3HKL.js.map
374
+ //# sourceMappingURL=chunk-UFYG3HKL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/color-picker/index.tsx"],"names":[],"mappings":"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","file":"chunk-UFYG3HKL.js","sourcesContent":["'use client'\n\nimport { cva } from 'class-variance-authority'\nimport React from 'react'\n\nimport { Popover, PopoverContent, PopoverTrigger } from '../popover'\nimport { cn } from '../utils'\nimport type { ColorPickerProps, ColorInputProps } from './types'\n\n// ── Color utilities ──────────────────────────────────────────\nfunction hexToHsv(hex: string): [number, number, number] {\n const r = parseInt(hex.slice(1, 3), 16) / 255\n const g = parseInt(hex.slice(3, 5), 16) / 255\n const b = parseInt(hex.slice(5, 7), 16) / 255\n const max = Math.max(r, g, b), min = Math.min(r, g, b)\n const d = max - min\n let h = 0\n if (d !== 0) {\n if (max === r) h = ((g - b) / d + 6) % 6\n else if (max === g) h = (b - r) / d + 2\n else h = (r - g) / d + 4\n h *= 60\n }\n const s = max === 0 ? 0 : d / max\n return [h, s, max]\n}\n\nfunction hsvToHex(h: number, s: number, v: number): string {\n const c = v * s\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1))\n const m = v - c\n let r = 0, g = 0, b = 0\n if (h < 60) { r = c; g = x }\n else if (h < 120) { r = x; g = c }\n else if (h < 180) { g = c; b = x }\n else if (h < 240) { g = x; b = c }\n else if (h < 300) { r = x; b = c }\n else { r = c; b = x }\n const toHex = (n: number) => Math.round((n + m) * 255).toString(16).padStart(2, '0')\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`\n}\n\nfunction isValidHex(v: string): boolean {\n return /^#[0-9a-fA-F]{6}$/.test(v)\n}\n\nfunction normalizeHex(v: string): string {\n if (!v) return '#000000'\n const clean = v.startsWith('#') ? v : `#${v}`\n return isValidHex(clean) ? clean.toLowerCase() : '#000000'\n}\n\n// ── Size variants ────────────────────────────────────────────\nconst sizeMap = {\n xs: { area: 'w-40 h-28', hue: 'h-2', swatch: 'w-4 h-4' },\n sm: { area: 'w-48 h-32', hue: 'h-2.5', swatch: 'w-5 h-5' },\n md: { area: 'w-56 h-36', hue: 'h-3', swatch: 'w-6 h-6' },\n lg: { area: 'w-64 h-44', hue: 'h-3.5', swatch: 'w-7 h-7' },\n}\n\nconst inputVariants = cva(\n 'flex items-center rounded-md border border-border bg-background text-text-primary transition-colors focus-within:border-primary',\n {\n variants: {\n size: {\n xs: 'h-7 px-2 text-xs gap-1.5',\n sm: 'h-8 px-2.5 text-sm gap-2',\n md: 'h-9 px-3 text-sm gap-2',\n lg: 'h-10 px-3.5 text-base gap-2.5',\n },\n },\n defaultVariants: { size: 'md' },\n },\n)\n\n// ── Saturation Area ──────────────────────────────────────────\nfunction SaturationArea({\n hue, sat, val, onChangeSV, areaClass, disabled,\n}: {\n hue: number; sat: number; val: number\n onChangeSV: (s: number, v: number) => void\n areaClass: string; disabled?: boolean\n}) {\n const ref = React.useRef<HTMLDivElement>(null)\n\n const update = React.useCallback(\n (clientX: number, clientY: number) => {\n if (!ref.current || disabled) return\n const rect = ref.current.getBoundingClientRect()\n const s = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width))\n const v = Math.max(0, Math.min(1, 1 - (clientY - rect.top) / rect.height))\n onChangeSV(s, v)\n },\n [onChangeSV, disabled],\n )\n\n const handlePointerDown = (e: React.PointerEvent) => {\n if (disabled) return\n e.currentTarget.setPointerCapture(e.pointerId)\n update(e.clientX, e.clientY)\n }\n\n const handlePointerMove = (e: React.PointerEvent) => {\n if (e.currentTarget.hasPointerCapture(e.pointerId)) {\n update(e.clientX, e.clientY)\n }\n }\n\n return (\n <div\n ref={ref}\n className={cn('colorPicker_saturation', 'relative rounded-md cursor-crosshair', areaClass)}\n style={{ background: `hsl(${hue}, 100%, 50%)` }}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n >\n <div className=\"absolute inset-0 rounded-md\" style={{ background: 'linear-gradient(to right, white, transparent)' }} />\n <div className=\"absolute inset-0 rounded-md\" style={{ background: 'linear-gradient(to top, black, transparent)' }} />\n <div\n className=\"absolute w-3.5 h-3.5 rounded-full border-2 border-white shadow-md -translate-x-1/2 -translate-y-1/2 pointer-events-none\"\n style={{ left: `${sat * 100}%`, top: `${(1 - val) * 100}%` }}\n />\n </div>\n )\n}\n\n// ── Hue Slider ───────────────────────────────────────────────\nfunction HueSlider({\n hue, onChange, hueClass, disabled,\n}: {\n hue: number; onChange: (h: number) => void; hueClass: string; disabled?: boolean\n}) {\n const ref = React.useRef<HTMLDivElement>(null)\n\n const update = React.useCallback(\n (clientX: number) => {\n if (!ref.current || disabled) return\n const rect = ref.current.getBoundingClientRect()\n const h = Math.max(0, Math.min(360, ((clientX - rect.left) / rect.width) * 360))\n onChange(h)\n },\n [onChange, disabled],\n )\n\n const handlePointerDown = (e: React.PointerEvent) => {\n if (disabled) return\n e.currentTarget.setPointerCapture(e.pointerId)\n update(e.clientX)\n }\n\n const handlePointerMove = (e: React.PointerEvent) => {\n if (e.currentTarget.hasPointerCapture(e.pointerId)) update(e.clientX)\n }\n\n return (\n <div\n ref={ref}\n className={cn('colorPicker_hue', 'relative rounded-full cursor-pointer', hueClass)}\n style={{ background: 'linear-gradient(to right, #f00 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%)' }}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n >\n <div\n className=\"absolute w-3.5 h-3.5 rounded-full border-2 border-white shadow-md -translate-x-1/2 top-1/2 -translate-y-1/2 pointer-events-none\"\n style={{ left: `${(hue / 360) * 100}%` }}\n />\n </div>\n )\n}\n\n// ── ColorPicker ──────────────────────────────────────────────\nconst ColorPicker = React.memo<ColorPickerProps>(\n ({\n value,\n defaultValue = '#3b82f6',\n onChange,\n swatches,\n size = 'md',\n disabled = false,\n label,\n className,\n classNames,\n }) => {\n const [internalValue, setInternalValue] = React.useState(normalizeHex(defaultValue))\n const currentValue = value !== undefined ? normalizeHex(value) : internalValue\n\n const [h, s, v] = React.useMemo(() => hexToHsv(currentValue), [currentValue])\n const [hue, setHue] = React.useState(h)\n\n React.useEffect(() => {\n if (s > 0.01 || v > 0.01) setHue(h)\n }, [h, s, v])\n\n const [inputText, setInputText] = React.useState(currentValue)\n React.useEffect(() => setInputText(currentValue), [currentValue])\n\n const update = (hex: string) => {\n const valid = normalizeHex(hex)\n if (value === undefined) setInternalValue(valid)\n onChange?.(valid)\n }\n\n const handleSVChange = (ns: number, nv: number) => {\n update(hsvToHex(hue, ns, nv))\n }\n\n const handleHueChange = (nh: number) => {\n setHue(nh)\n update(hsvToHex(nh, s, v))\n }\n\n const handleInputBlur = () => {\n if (isValidHex(inputText) || isValidHex(`#${inputText}`)) {\n update(inputText.startsWith('#') ? inputText : `#${inputText}`)\n } else {\n setInputText(currentValue)\n }\n }\n\n const sizes = sizeMap[size]\n\n return (\n <div\n data-slot=\"root\"\n className={cn(\n 'colorPicker_root',\n 'inline-flex flex-col gap-2',\n disabled && 'opacity-50 pointer-events-none',\n classNames?.root,\n className,\n )}\n >\n {label && (\n <span className=\"text-sm font-medium text-text-primary\">{label}</span>\n )}\n\n <SaturationArea\n hue={hue} sat={s} val={v}\n onChangeSV={handleSVChange}\n areaClass={cn(sizes.area, classNames?.saturation)}\n disabled={disabled}\n />\n\n <HueSlider\n hue={hue}\n onChange={handleHueChange}\n hueClass={cn(sizes.hue, classNames?.hueSlider)}\n disabled={disabled}\n />\n\n {/* Input + preview */}\n <div className=\"flex items-center gap-2\">\n <div\n data-slot=\"preview\"\n className={cn(\n 'colorPicker_preview',\n 'w-8 h-8 rounded-md border border-border shrink-0',\n classNames?.preview,\n )}\n style={{ backgroundColor: currentValue }}\n />\n <input\n type=\"text\"\n value={inputText}\n onChange={(e) => setInputText(e.target.value)}\n onBlur={handleInputBlur}\n onKeyDown={(e) => e.key === 'Enter' && handleInputBlur()}\n className={cn(\n 'colorPicker_input',\n 'flex-1 min-w-0 bg-transparent border border-border rounded-md px-2 py-1 text-sm text-text-primary outline-none focus:border-primary font-mono',\n classNames?.input,\n )}\n disabled={disabled}\n />\n </div>\n\n {/* Swatches */}\n {swatches && swatches.length > 0 && (\n <div\n data-slot=\"swatches\"\n className={cn(\n 'colorPicker_swatches',\n 'flex flex-wrap gap-1',\n classNames?.swatches,\n )}\n >\n {swatches.map((swatch) => (\n <button\n key={swatch}\n type=\"button\"\n onClick={() => update(swatch)}\n className={cn(\n 'colorPicker_swatch',\n sizes.swatch,\n 'rounded-md border border-border cursor-pointer transition-transform hover:scale-110',\n currentValue === normalizeHex(swatch) && 'ring-2 ring-primary ring-offset-1 ring-offset-background',\n classNames?.swatch,\n )}\n style={{ backgroundColor: swatch }}\n aria-label={`Select color ${swatch}`}\n />\n ))}\n </div>\n )}\n </div>\n )\n },\n)\n\nColorPicker.displayName = 'ColorPicker'\n\n// ── ColorInput ───────────────────────────────────────────────\nconst ColorInput = React.memo<ColorInputProps>(\n ({\n value,\n defaultValue = '#3b82f6',\n onChange,\n swatches,\n size = 'md',\n disabled = false,\n label,\n fullWidth = true,\n className,\n classNames,\n }) => {\n const [internalValue, setInternalValue] = React.useState(normalizeHex(defaultValue))\n const currentValue = value !== undefined ? normalizeHex(value) : internalValue\n\n const update = (hex: string) => {\n const valid = normalizeHex(hex)\n if (value === undefined) setInternalValue(valid)\n onChange?.(valid)\n }\n\n return (\n <div\n data-slot=\"root\"\n className={cn(\n 'colorInput_root',\n 'flex flex-col gap-1.5',\n fullWidth ? 'w-full' : 'inline-flex',\n className,\n )}\n >\n {label && (\n <span className=\"text-sm font-medium text-text-primary\">{label}</span>\n )}\n\n <Popover>\n <PopoverTrigger asChild>\n <div className={cn(inputVariants({ size }), disabled && 'opacity-50 cursor-not-allowed', fullWidth && 'w-full')}>\n <div\n className=\"w-5 h-5 rounded border border-border shrink-0\"\n style={{ backgroundColor: currentValue }}\n />\n <span className=\"flex-1 truncate text-text-primary font-mono\">\n {currentValue}\n </span>\n </div>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-3\" align=\"start\">\n <ColorPicker\n value={currentValue}\n onChange={update}\n swatches={swatches}\n size={size}\n disabled={disabled}\n classNames={classNames}\n />\n </PopoverContent>\n </Popover>\n </div>\n )\n },\n)\n\nColorInput.displayName = 'ColorInput'\n\nexport type * from './types'\nexport { ColorPicker, ColorInput }\nexport default ColorPicker\n"]}
@@ -0,0 +1,211 @@
1
+ import { cn } from './chunk-RAS6HUEI.js';
2
+ import React, { useRef, useState, useCallback, useEffect } from 'react';
3
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
4
+
5
+ var levelElements = {
6
+ h1: "h1",
7
+ h2: "h2",
8
+ h3: "h3",
9
+ h4: "h4",
10
+ h5: "h5",
11
+ h6: "h6"
12
+ };
13
+ var levelClasses = {
14
+ h1: "text-4xl font-bold tracking-tight",
15
+ h2: "text-3xl font-semibold tracking-tight",
16
+ h3: "text-2xl font-semibold",
17
+ h4: "text-xl font-semibold",
18
+ h5: "text-lg font-medium",
19
+ h6: "text-base font-medium"
20
+ };
21
+ var sizeClasses = {
22
+ xs: "text-xs",
23
+ sm: "text-sm",
24
+ md: "text-base",
25
+ lg: "text-lg",
26
+ xl: "text-xl",
27
+ "2xl": "text-2xl"
28
+ };
29
+ var weightClasses = {
30
+ light: "font-light",
31
+ normal: "font-normal",
32
+ medium: "font-medium",
33
+ semibold: "font-semibold",
34
+ bold: "font-bold"
35
+ };
36
+ var textColorClasses = {
37
+ default: "text-text-primary",
38
+ primary: "text-primary",
39
+ secondary: "text-text-secondary",
40
+ tertiary: "text-text-secondary/60",
41
+ accent: "text-accent",
42
+ success: "text-success",
43
+ error: "text-error",
44
+ warning: "text-warning",
45
+ info: "text-info",
46
+ inherit: ""
47
+ };
48
+ function CopyButton({ text }) {
49
+ const [copied, setCopied] = useState(false);
50
+ const handleCopy = useCallback(async () => {
51
+ try {
52
+ await navigator.clipboard.writeText(text);
53
+ setCopied(true);
54
+ setTimeout(() => setCopied(false), 2e3);
55
+ } catch {
56
+ }
57
+ }, [text]);
58
+ return /* @__PURE__ */ jsx(
59
+ "button",
60
+ {
61
+ type: "button",
62
+ onClick: handleCopy,
63
+ className: "inline-flex items-center ml-1 text-text-secondary hover:text-text-primary transition-colors cursor-pointer",
64
+ "aria-label": "Copy to clipboard",
65
+ children: copied ? /* @__PURE__ */ jsx("svg", { className: "w-3.5 h-3.5", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("polyline", { points: "20 6 9 17 4 12" }) }) : /* @__PURE__ */ jsxs("svg", { className: "w-3.5 h-3.5", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
66
+ /* @__PURE__ */ jsx("rect", { x: "9", y: "9", width: "13", height: "13", rx: "2", ry: "2" }),
67
+ /* @__PURE__ */ jsx("path", { d: "M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1" })
68
+ ] })
69
+ }
70
+ );
71
+ }
72
+ function useTruncation(truncate, ref) {
73
+ const [expanded, setExpanded] = useState(false);
74
+ const [isTruncated, setIsTruncated] = useState(false);
75
+ useEffect(() => {
76
+ if (!truncate || expanded || !ref.current) return;
77
+ const el = ref.current;
78
+ setIsTruncated(el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth);
79
+ }, [truncate, expanded, ref]);
80
+ return { expanded, setExpanded, isTruncated };
81
+ }
82
+ var Title = React.memo(
83
+ ({ level = "h1", color = "default", copyable = false, className, children, ...props }) => {
84
+ const Tag = levelElements[level];
85
+ const textContent = typeof children === "string" ? children : "";
86
+ return React.createElement(
87
+ Tag,
88
+ {
89
+ "data-slot": "title",
90
+ className: cn("typography_title", levelClasses[level], textColorClasses[color] || "", className),
91
+ ...props
92
+ },
93
+ /* @__PURE__ */ jsxs(Fragment, { children: [
94
+ children,
95
+ copyable && textContent && /* @__PURE__ */ jsx(CopyButton, { text: textContent })
96
+ ] })
97
+ );
98
+ }
99
+ );
100
+ Title.displayName = "Title";
101
+ var Text = React.memo(
102
+ ({
103
+ size = "md",
104
+ weight,
105
+ color = "default",
106
+ truncate,
107
+ copyable = false,
108
+ code = false,
109
+ mark = false,
110
+ del: deleted = false,
111
+ underline = false,
112
+ strong = false,
113
+ italic = false,
114
+ as: Component = "span",
115
+ className,
116
+ children,
117
+ ...props
118
+ }) => {
119
+ const ref = useRef(null);
120
+ const { expanded, setExpanded, isTruncated } = useTruncation(truncate, ref);
121
+ const textContent = typeof children === "string" ? children : "";
122
+ const truncateClass = !expanded && truncate ? typeof truncate === "number" ? `line-clamp-${truncate}` : "truncate" : "";
123
+ let content = children;
124
+ if (code) content = /* @__PURE__ */ jsx("code", { className: "px-1 py-0.5 rounded bg-surface text-sm font-mono", children: content });
125
+ if (mark) content = /* @__PURE__ */ jsx("mark", { className: "bg-warning/20 px-0.5 rounded-sm", children: content });
126
+ if (deleted) content = /* @__PURE__ */ jsx("del", { children: content });
127
+ if (underline) content = /* @__PURE__ */ jsx("u", { children: content });
128
+ if (strong) content = /* @__PURE__ */ jsx("strong", { children: content });
129
+ if (italic) content = /* @__PURE__ */ jsx("em", { children: content });
130
+ return React.createElement(
131
+ Component,
132
+ {
133
+ ref,
134
+ "data-slot": "text",
135
+ className: cn(
136
+ "typography_text",
137
+ sizeClasses[size],
138
+ weight && weightClasses[weight],
139
+ textColorClasses[color] || "",
140
+ truncateClass,
141
+ className
142
+ ),
143
+ ...props
144
+ },
145
+ /* @__PURE__ */ jsxs(Fragment, { children: [
146
+ content,
147
+ copyable && textContent && /* @__PURE__ */ jsx(CopyButton, { text: textContent }),
148
+ isTruncated && !expanded && /* @__PURE__ */ jsx(
149
+ "button",
150
+ {
151
+ type: "button",
152
+ onClick: () => setExpanded(true),
153
+ className: "text-primary hover:text-primary/80 ml-1 text-inherit cursor-pointer",
154
+ children: "more"
155
+ }
156
+ )
157
+ ] })
158
+ );
159
+ }
160
+ );
161
+ Text.displayName = "Text";
162
+ var Paragraph = React.memo(
163
+ ({
164
+ size = "md",
165
+ color = "default",
166
+ truncate,
167
+ copyable = false,
168
+ className,
169
+ children,
170
+ ...props
171
+ }) => {
172
+ const ref = useRef(null);
173
+ const { expanded, setExpanded, isTruncated } = useTruncation(truncate, ref);
174
+ const textContent = typeof children === "string" ? children : "";
175
+ const truncateClass = !expanded && truncate ? typeof truncate === "number" ? `line-clamp-${truncate}` : "truncate" : "";
176
+ return /* @__PURE__ */ jsxs(
177
+ "p",
178
+ {
179
+ ref,
180
+ "data-slot": "paragraph",
181
+ className: cn(
182
+ "typography_paragraph",
183
+ sizeClasses[size],
184
+ textColorClasses[color] || "",
185
+ truncateClass,
186
+ "leading-relaxed",
187
+ className
188
+ ),
189
+ ...props,
190
+ children: [
191
+ children,
192
+ copyable && textContent && /* @__PURE__ */ jsx(CopyButton, { text: textContent }),
193
+ isTruncated && !expanded && /* @__PURE__ */ jsx(
194
+ "button",
195
+ {
196
+ type: "button",
197
+ onClick: () => setExpanded(true),
198
+ className: "text-primary hover:text-primary/80 ml-1 text-inherit cursor-pointer",
199
+ children: "more"
200
+ }
201
+ )
202
+ ]
203
+ }
204
+ );
205
+ }
206
+ );
207
+ Paragraph.displayName = "Paragraph";
208
+
209
+ export { Paragraph, Text, Title };
210
+ //# sourceMappingURL=chunk-VNH6R5EU.js.map
211
+ //# sourceMappingURL=chunk-VNH6R5EU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/typography/index.tsx"],"names":[],"mappings":"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","file":"chunk-VNH6R5EU.js","sourcesContent":["'use client'\n\nimport React, { useState, useCallback, useRef, useEffect } from 'react'\n\nimport { cn } from '../utils'\nimport type { TitleProps, TextProps, ParagraphProps, TypographyLevel, TextSize } from './types'\n\nconst levelElements: Record<TypographyLevel, string> = {\n h1: 'h1', h2: 'h2', h3: 'h3', h4: 'h4', h5: 'h5', h6: 'h6',\n}\n\nconst levelClasses: Record<TypographyLevel, string> = {\n h1: 'text-4xl font-bold tracking-tight',\n h2: 'text-3xl font-semibold tracking-tight',\n h3: 'text-2xl font-semibold',\n h4: 'text-xl font-semibold',\n h5: 'text-lg font-medium',\n h6: 'text-base font-medium',\n}\n\nconst sizeClasses: Record<TextSize, string> = {\n xs: 'text-xs',\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n xl: 'text-xl',\n '2xl': 'text-2xl',\n}\n\nconst weightClasses = {\n light: 'font-light',\n normal: 'font-normal',\n medium: 'font-medium',\n semibold: 'font-semibold',\n bold: 'font-bold',\n}\n\nconst textColorClasses = {\n default: 'text-text-primary',\n primary: 'text-primary',\n secondary: 'text-text-secondary',\n tertiary: 'text-text-secondary/60',\n accent: 'text-accent',\n success: 'text-success',\n error: 'text-error',\n warning: 'text-warning',\n info: 'text-info',\n inherit: '',\n}\n\nfunction CopyButton({ text }: { text: string }) {\n const [copied, setCopied] = useState(false)\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(text)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n } catch { /* noop */ }\n }, [text])\n\n return (\n <button\n type=\"button\"\n onClick={handleCopy}\n className=\"inline-flex items-center ml-1 text-text-secondary hover:text-text-primary transition-colors cursor-pointer\"\n aria-label=\"Copy to clipboard\"\n >\n {copied ? (\n <svg className=\"w-3.5 h-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n ) : (\n <svg className=\"w-3.5 h-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1\" />\n </svg>\n )}\n </button>\n )\n}\n\nfunction useTruncation(truncate: boolean | number | undefined, ref: React.RefObject<HTMLElement | null>) {\n const [expanded, setExpanded] = useState(false)\n const [isTruncated, setIsTruncated] = useState(false)\n\n useEffect(() => {\n if (!truncate || expanded || !ref.current) return\n const el = ref.current\n setIsTruncated(el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth)\n }, [truncate, expanded, ref])\n\n return { expanded, setExpanded, isTruncated }\n}\n\n// ── Title ────────────────────────────────────────────────────\nconst Title = React.memo<TitleProps>(\n ({ level = 'h1', color = 'default', copyable = false, className, children, ...props }) => {\n const Tag = levelElements[level]\n const textContent = typeof children === 'string' ? children : ''\n\n return React.createElement(\n Tag as any,\n {\n 'data-slot': 'title',\n className: cn('typography_title', levelClasses[level], textColorClasses[color] || '', className),\n ...props,\n },\n <>\n {children}\n {copyable && textContent && <CopyButton text={textContent} />}\n </>,\n )\n },\n)\n\nTitle.displayName = 'Title'\n\n// ── Text ─────────────────────────────────────────────────────\nconst Text = React.memo<TextProps>(\n ({\n size = 'md',\n weight,\n color = 'default',\n truncate,\n copyable = false,\n code = false,\n mark = false,\n del: deleted = false,\n underline = false,\n strong = false,\n italic = false,\n as: Component = 'span',\n className,\n children,\n ...props\n }) => {\n const ref = useRef<HTMLElement>(null)\n const { expanded, setExpanded, isTruncated } = useTruncation(truncate, ref)\n const textContent = typeof children === 'string' ? children : ''\n\n const truncateClass = !expanded && truncate\n ? typeof truncate === 'number'\n ? `line-clamp-${truncate}`\n : 'truncate'\n : ''\n\n let content: React.ReactNode = children\n if (code) content = <code className=\"px-1 py-0.5 rounded bg-surface text-sm font-mono\">{content}</code>\n if (mark) content = <mark className=\"bg-warning/20 px-0.5 rounded-sm\">{content}</mark>\n if (deleted) content = <del>{content}</del>\n if (underline) content = <u>{content}</u>\n if (strong) content = <strong>{content}</strong>\n if (italic) content = <em>{content}</em>\n\n return React.createElement(\n Component,\n {\n ref: ref as any,\n 'data-slot': 'text',\n className: cn(\n 'typography_text',\n sizeClasses[size],\n weight && weightClasses[weight],\n textColorClasses[color] || '',\n truncateClass,\n className,\n ),\n ...props,\n },\n <>\n {content}\n {copyable && textContent && <CopyButton text={textContent} />}\n {isTruncated && !expanded && (\n <button\n type=\"button\"\n onClick={() => setExpanded(true)}\n className=\"text-primary hover:text-primary/80 ml-1 text-inherit cursor-pointer\"\n >\n more\n </button>\n )}\n </>,\n )\n },\n)\n\nText.displayName = 'Text'\n\n// ── Paragraph ────────────────────────────────────────────────\nconst Paragraph = React.memo<ParagraphProps>(\n ({\n size = 'md',\n color = 'default',\n truncate,\n copyable = false,\n className,\n children,\n ...props\n }) => {\n const ref = useRef<HTMLParagraphElement>(null)\n const { expanded, setExpanded, isTruncated } = useTruncation(truncate, ref)\n const textContent = typeof children === 'string' ? children : ''\n\n const truncateClass = !expanded && truncate\n ? typeof truncate === 'number'\n ? `line-clamp-${truncate}`\n : 'truncate'\n : ''\n\n return (\n <p\n ref={ref}\n data-slot=\"paragraph\"\n className={cn(\n 'typography_paragraph',\n sizeClasses[size],\n textColorClasses[color] || '',\n truncateClass,\n 'leading-relaxed',\n className,\n )}\n {...props}\n >\n {children}\n {copyable && textContent && <CopyButton text={textContent} />}\n {isTruncated && !expanded && (\n <button\n type=\"button\"\n onClick={() => setExpanded(true)}\n className=\"text-primary hover:text-primary/80 ml-1 text-inherit cursor-pointer\"\n >\n more\n </button>\n )}\n </p>\n )\n },\n)\n\nParagraph.displayName = 'Paragraph'\n\nexport type * from './types'\nexport { Title, Text, Paragraph }\n"]}