@bridger-kr/react 0.1.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 (273) hide show
  1. package/README.md +62 -0
  2. package/dist/components/core/Badge.cjs +36 -0
  3. package/dist/components/core/Badge.cjs.map +1 -0
  4. package/dist/components/core/Badge.d.cts +18 -0
  5. package/dist/components/core/Badge.d.ts +18 -0
  6. package/dist/components/core/Badge.mjs +34 -0
  7. package/dist/components/core/Badge.mjs.map +1 -0
  8. package/dist/components/core/Button.cjs +57 -0
  9. package/dist/components/core/Button.cjs.map +1 -0
  10. package/dist/components/core/Button.d.cts +26 -0
  11. package/dist/components/core/Button.d.ts +26 -0
  12. package/dist/components/core/Button.mjs +55 -0
  13. package/dist/components/core/Button.mjs.map +1 -0
  14. package/dist/components/core/Card.cjs +57 -0
  15. package/dist/components/core/Card.cjs.map +1 -0
  16. package/dist/components/core/Card.d.cts +27 -0
  17. package/dist/components/core/Card.d.ts +27 -0
  18. package/dist/components/core/Card.mjs +54 -0
  19. package/dist/components/core/Card.mjs.map +1 -0
  20. package/dist/components/core/FilterChip.cjs +54 -0
  21. package/dist/components/core/FilterChip.cjs.map +1 -0
  22. package/dist/components/core/FilterChip.d.cts +23 -0
  23. package/dist/components/core/FilterChip.d.ts +23 -0
  24. package/dist/components/core/FilterChip.mjs +52 -0
  25. package/dist/components/core/FilterChip.mjs.map +1 -0
  26. package/dist/components/core/Input.cjs +67 -0
  27. package/dist/components/core/Input.cjs.map +1 -0
  28. package/dist/components/core/Input.d.cts +20 -0
  29. package/dist/components/core/Input.d.ts +20 -0
  30. package/dist/components/core/Input.mjs +65 -0
  31. package/dist/components/core/Input.mjs.map +1 -0
  32. package/dist/components/core/StatusPill.cjs +57 -0
  33. package/dist/components/core/StatusPill.cjs.map +1 -0
  34. package/dist/components/core/StatusPill.d.cts +19 -0
  35. package/dist/components/core/StatusPill.d.ts +19 -0
  36. package/dist/components/core/StatusPill.mjs +55 -0
  37. package/dist/components/core/StatusPill.mjs.map +1 -0
  38. package/dist/components/core/Surface.cjs +52 -0
  39. package/dist/components/core/Surface.cjs.map +1 -0
  40. package/dist/components/core/Surface.d.cts +24 -0
  41. package/dist/components/core/Surface.d.ts +24 -0
  42. package/dist/components/core/Surface.mjs +47 -0
  43. package/dist/components/core/Surface.mjs.map +1 -0
  44. package/dist/components/core/Tabs.cjs +64 -0
  45. package/dist/components/core/Tabs.cjs.map +1 -0
  46. package/dist/components/core/Tabs.d.cts +24 -0
  47. package/dist/components/core/Tabs.d.ts +24 -0
  48. package/dist/components/core/Tabs.mjs +62 -0
  49. package/dist/components/core/Tabs.mjs.map +1 -0
  50. package/dist/components/data/Avatar.cjs +40 -0
  51. package/dist/components/data/Avatar.cjs.map +1 -0
  52. package/dist/components/data/Avatar.d.cts +24 -0
  53. package/dist/components/data/Avatar.d.ts +24 -0
  54. package/dist/components/data/Avatar.mjs +38 -0
  55. package/dist/components/data/Avatar.mjs.map +1 -0
  56. package/dist/components/data/CodeBlock.cjs +92 -0
  57. package/dist/components/data/CodeBlock.cjs.map +1 -0
  58. package/dist/components/data/CodeBlock.d.cts +20 -0
  59. package/dist/components/data/CodeBlock.d.ts +20 -0
  60. package/dist/components/data/CodeBlock.mjs +90 -0
  61. package/dist/components/data/CodeBlock.mjs.map +1 -0
  62. package/dist/components/data/KeyValue.cjs +55 -0
  63. package/dist/components/data/KeyValue.cjs.map +1 -0
  64. package/dist/components/data/KeyValue.d.cts +24 -0
  65. package/dist/components/data/KeyValue.d.ts +24 -0
  66. package/dist/components/data/KeyValue.mjs +53 -0
  67. package/dist/components/data/KeyValue.mjs.map +1 -0
  68. package/dist/components/data/LogRow.cjs +55 -0
  69. package/dist/components/data/LogRow.cjs.map +1 -0
  70. package/dist/components/data/LogRow.d.cts +23 -0
  71. package/dist/components/data/LogRow.d.ts +23 -0
  72. package/dist/components/data/LogRow.mjs +53 -0
  73. package/dist/components/data/LogRow.mjs.map +1 -0
  74. package/dist/components/data/Pagination.cjs +44 -0
  75. package/dist/components/data/Pagination.cjs.map +1 -0
  76. package/dist/components/data/Pagination.d.cts +13 -0
  77. package/dist/components/data/Pagination.d.ts +13 -0
  78. package/dist/components/data/Pagination.mjs +42 -0
  79. package/dist/components/data/Pagination.mjs.map +1 -0
  80. package/dist/components/data/StatTile.cjs +20 -0
  81. package/dist/components/data/StatTile.cjs.map +1 -0
  82. package/dist/components/data/StatTile.d.cts +19 -0
  83. package/dist/components/data/StatTile.d.ts +19 -0
  84. package/dist/components/data/StatTile.mjs +18 -0
  85. package/dist/components/data/StatTile.mjs.map +1 -0
  86. package/dist/components/data/Table.cjs +45 -0
  87. package/dist/components/data/Table.cjs.map +1 -0
  88. package/dist/components/data/Table.d.cts +27 -0
  89. package/dist/components/data/Table.d.ts +27 -0
  90. package/dist/components/data/Table.mjs +43 -0
  91. package/dist/components/data/Table.mjs.map +1 -0
  92. package/dist/components/data/UsageMeter.cjs +28 -0
  93. package/dist/components/data/UsageMeter.cjs.map +1 -0
  94. package/dist/components/data/UsageMeter.d.cts +19 -0
  95. package/dist/components/data/UsageMeter.d.ts +19 -0
  96. package/dist/components/data/UsageMeter.mjs +26 -0
  97. package/dist/components/data/UsageMeter.mjs.map +1 -0
  98. package/dist/components/feedback/Alert.cjs +78 -0
  99. package/dist/components/feedback/Alert.cjs.map +1 -0
  100. package/dist/components/feedback/Alert.d.cts +29 -0
  101. package/dist/components/feedback/Alert.d.ts +29 -0
  102. package/dist/components/feedback/Alert.mjs +74 -0
  103. package/dist/components/feedback/Alert.mjs.map +1 -0
  104. package/dist/components/feedback/Dialog.cjs +62 -0
  105. package/dist/components/feedback/Dialog.cjs.map +1 -0
  106. package/dist/components/feedback/Dialog.d.cts +17 -0
  107. package/dist/components/feedback/Dialog.d.ts +17 -0
  108. package/dist/components/feedback/Dialog.mjs +60 -0
  109. package/dist/components/feedback/Dialog.mjs.map +1 -0
  110. package/dist/components/feedback/Drawer.cjs +58 -0
  111. package/dist/components/feedback/Drawer.cjs.map +1 -0
  112. package/dist/components/feedback/Drawer.d.cts +22 -0
  113. package/dist/components/feedback/Drawer.d.ts +22 -0
  114. package/dist/components/feedback/Drawer.mjs +56 -0
  115. package/dist/components/feedback/Drawer.mjs.map +1 -0
  116. package/dist/components/feedback/EmptyState.cjs +36 -0
  117. package/dist/components/feedback/EmptyState.cjs.map +1 -0
  118. package/dist/components/feedback/EmptyState.d.cts +14 -0
  119. package/dist/components/feedback/EmptyState.d.ts +14 -0
  120. package/dist/components/feedback/EmptyState.mjs +34 -0
  121. package/dist/components/feedback/EmptyState.mjs.map +1 -0
  122. package/dist/components/feedback/Skeleton.cjs +19 -0
  123. package/dist/components/feedback/Skeleton.cjs.map +1 -0
  124. package/dist/components/feedback/Skeleton.d.cts +12 -0
  125. package/dist/components/feedback/Skeleton.d.ts +12 -0
  126. package/dist/components/feedback/Skeleton.mjs +17 -0
  127. package/dist/components/feedback/Skeleton.mjs.map +1 -0
  128. package/dist/components/feedback/Spinner.cjs +17 -0
  129. package/dist/components/feedback/Spinner.cjs.map +1 -0
  130. package/dist/components/feedback/Spinner.d.cts +12 -0
  131. package/dist/components/feedback/Spinner.d.ts +12 -0
  132. package/dist/components/feedback/Spinner.mjs +15 -0
  133. package/dist/components/feedback/Spinner.mjs.map +1 -0
  134. package/dist/components/feedback/Toast.cjs +32 -0
  135. package/dist/components/feedback/Toast.cjs.map +1 -0
  136. package/dist/components/feedback/Toast.d.cts +20 -0
  137. package/dist/components/feedback/Toast.d.ts +20 -0
  138. package/dist/components/feedback/Toast.mjs +30 -0
  139. package/dist/components/feedback/Toast.mjs.map +1 -0
  140. package/dist/components/feedback/Tooltip.cjs +51 -0
  141. package/dist/components/feedback/Tooltip.cjs.map +1 -0
  142. package/dist/components/feedback/Tooltip.d.cts +11 -0
  143. package/dist/components/feedback/Tooltip.d.ts +11 -0
  144. package/dist/components/feedback/Tooltip.mjs +49 -0
  145. package/dist/components/feedback/Tooltip.mjs.map +1 -0
  146. package/dist/components/forms/Checkbox.cjs +74 -0
  147. package/dist/components/forms/Checkbox.cjs.map +1 -0
  148. package/dist/components/forms/Checkbox.d.cts +16 -0
  149. package/dist/components/forms/Checkbox.d.ts +16 -0
  150. package/dist/components/forms/Checkbox.mjs +72 -0
  151. package/dist/components/forms/Checkbox.mjs.map +1 -0
  152. package/dist/components/forms/Combobox.cjs +217 -0
  153. package/dist/components/forms/Combobox.cjs.map +1 -0
  154. package/dist/components/forms/Combobox.d.cts +27 -0
  155. package/dist/components/forms/Combobox.d.ts +27 -0
  156. package/dist/components/forms/Combobox.mjs +215 -0
  157. package/dist/components/forms/Combobox.mjs.map +1 -0
  158. package/dist/components/forms/FileUpload.cjs +187 -0
  159. package/dist/components/forms/FileUpload.cjs.map +1 -0
  160. package/dist/components/forms/FileUpload.d.cts +26 -0
  161. package/dist/components/forms/FileUpload.d.ts +26 -0
  162. package/dist/components/forms/FileUpload.mjs +185 -0
  163. package/dist/components/forms/FileUpload.mjs.map +1 -0
  164. package/dist/components/forms/RadioGroup.cjs +73 -0
  165. package/dist/components/forms/RadioGroup.cjs.map +1 -0
  166. package/dist/components/forms/RadioGroup.d.cts +21 -0
  167. package/dist/components/forms/RadioGroup.d.ts +21 -0
  168. package/dist/components/forms/RadioGroup.mjs +71 -0
  169. package/dist/components/forms/RadioGroup.mjs.map +1 -0
  170. package/dist/components/forms/SegmentedControl.cjs +67 -0
  171. package/dist/components/forms/SegmentedControl.cjs.map +1 -0
  172. package/dist/components/forms/SegmentedControl.d.cts +19 -0
  173. package/dist/components/forms/SegmentedControl.d.ts +19 -0
  174. package/dist/components/forms/SegmentedControl.mjs +65 -0
  175. package/dist/components/forms/SegmentedControl.mjs.map +1 -0
  176. package/dist/components/forms/Select.cjs +67 -0
  177. package/dist/components/forms/Select.cjs.map +1 -0
  178. package/dist/components/forms/Select.d.cts +23 -0
  179. package/dist/components/forms/Select.d.ts +23 -0
  180. package/dist/components/forms/Select.mjs +65 -0
  181. package/dist/components/forms/Select.mjs.map +1 -0
  182. package/dist/components/forms/Slider.cjs +129 -0
  183. package/dist/components/forms/Slider.cjs.map +1 -0
  184. package/dist/components/forms/Slider.d.cts +24 -0
  185. package/dist/components/forms/Slider.d.ts +24 -0
  186. package/dist/components/forms/Slider.mjs +127 -0
  187. package/dist/components/forms/Slider.mjs.map +1 -0
  188. package/dist/components/forms/Switch.cjs +101 -0
  189. package/dist/components/forms/Switch.cjs.map +1 -0
  190. package/dist/components/forms/Switch.d.cts +24 -0
  191. package/dist/components/forms/Switch.d.ts +24 -0
  192. package/dist/components/forms/Switch.mjs +98 -0
  193. package/dist/components/forms/Switch.mjs.map +1 -0
  194. package/dist/components/forms/Textarea.cjs +35 -0
  195. package/dist/components/forms/Textarea.cjs.map +1 -0
  196. package/dist/components/forms/Textarea.d.cts +15 -0
  197. package/dist/components/forms/Textarea.d.ts +15 -0
  198. package/dist/components/forms/Textarea.mjs +33 -0
  199. package/dist/components/forms/Textarea.mjs.map +1 -0
  200. package/dist/components/navigation/Breadcrumb.cjs +27 -0
  201. package/dist/components/navigation/Breadcrumb.cjs.map +1 -0
  202. package/dist/components/navigation/Breadcrumb.d.cts +15 -0
  203. package/dist/components/navigation/Breadcrumb.d.ts +15 -0
  204. package/dist/components/navigation/Breadcrumb.mjs +25 -0
  205. package/dist/components/navigation/Breadcrumb.mjs.map +1 -0
  206. package/dist/components/navigation/CommandPalette.cjs +136 -0
  207. package/dist/components/navigation/CommandPalette.cjs.map +1 -0
  208. package/dist/components/navigation/CommandPalette.d.cts +26 -0
  209. package/dist/components/navigation/CommandPalette.d.ts +26 -0
  210. package/dist/components/navigation/CommandPalette.mjs +134 -0
  211. package/dist/components/navigation/CommandPalette.mjs.map +1 -0
  212. package/dist/components/navigation/Menu.cjs +104 -0
  213. package/dist/components/navigation/Menu.cjs.map +1 -0
  214. package/dist/components/navigation/Menu.d.cts +20 -0
  215. package/dist/components/navigation/Menu.d.ts +20 -0
  216. package/dist/components/navigation/Menu.mjs +102 -0
  217. package/dist/components/navigation/Menu.mjs.map +1 -0
  218. package/dist/components/navigation/Sidebar.cjs +60 -0
  219. package/dist/components/navigation/Sidebar.cjs.map +1 -0
  220. package/dist/components/navigation/Sidebar.d.cts +30 -0
  221. package/dist/components/navigation/Sidebar.d.ts +30 -0
  222. package/dist/components/navigation/Sidebar.mjs +58 -0
  223. package/dist/components/navigation/Sidebar.mjs.map +1 -0
  224. package/dist/components/navigation/Stepper.cjs +55 -0
  225. package/dist/components/navigation/Stepper.cjs.map +1 -0
  226. package/dist/components/navigation/Stepper.d.cts +21 -0
  227. package/dist/components/navigation/Stepper.d.ts +21 -0
  228. package/dist/components/navigation/Stepper.mjs +53 -0
  229. package/dist/components/navigation/Stepper.mjs.map +1 -0
  230. package/dist/components/product/BrandLogo.cjs +159 -0
  231. package/dist/components/product/BrandLogo.cjs.map +1 -0
  232. package/dist/components/product/BrandLogo.d.cts +28 -0
  233. package/dist/components/product/BrandLogo.d.ts +28 -0
  234. package/dist/components/product/BrandLogo.mjs +156 -0
  235. package/dist/components/product/BrandLogo.mjs.map +1 -0
  236. package/dist/components/product/ProductActionPill.cjs +57 -0
  237. package/dist/components/product/ProductActionPill.cjs.map +1 -0
  238. package/dist/components/product/ProductActionPill.d.cts +31 -0
  239. package/dist/components/product/ProductActionPill.d.ts +31 -0
  240. package/dist/components/product/ProductActionPill.mjs +52 -0
  241. package/dist/components/product/ProductActionPill.mjs.map +1 -0
  242. package/dist/components/product/ProductCinematic.cjs +69 -0
  243. package/dist/components/product/ProductCinematic.cjs.map +1 -0
  244. package/dist/components/product/ProductCinematic.d.cts +33 -0
  245. package/dist/components/product/ProductCinematic.d.ts +33 -0
  246. package/dist/components/product/ProductCinematic.mjs +63 -0
  247. package/dist/components/product/ProductCinematic.mjs.map +1 -0
  248. package/dist/components/product/ProductPageHeader.cjs +35 -0
  249. package/dist/components/product/ProductPageHeader.cjs.map +1 -0
  250. package/dist/components/product/ProductPageHeader.d.cts +13 -0
  251. package/dist/components/product/ProductPageHeader.d.ts +13 -0
  252. package/dist/components/product/ProductPageHeader.mjs +33 -0
  253. package/dist/components/product/ProductPageHeader.mjs.map +1 -0
  254. package/dist/components/product/SectionCard.cjs +72 -0
  255. package/dist/components/product/SectionCard.cjs.map +1 -0
  256. package/dist/components/product/SectionCard.d.cts +20 -0
  257. package/dist/components/product/SectionCard.d.ts +20 -0
  258. package/dist/components/product/SectionCard.mjs +70 -0
  259. package/dist/components/product/SectionCard.mjs.map +1 -0
  260. package/dist/components/product/ToolCard.cjs +70 -0
  261. package/dist/components/product/ToolCard.cjs.map +1 -0
  262. package/dist/components/product/ToolCard.d.cts +22 -0
  263. package/dist/components/product/ToolCard.d.ts +22 -0
  264. package/dist/components/product/ToolCard.mjs +68 -0
  265. package/dist/components/product/ToolCard.mjs.map +1 -0
  266. package/dist/index.cjs +2593 -0
  267. package/dist/index.cjs.map +1 -0
  268. package/dist/index.d.cts +49 -0
  269. package/dist/index.d.ts +49 -0
  270. package/dist/index.mjs +2532 -0
  271. package/dist/index.mjs.map +1 -0
  272. package/dist/styles.css +463 -0
  273. package/package.json +50 -0
@@ -0,0 +1,24 @@
1
+ import * as react from 'react';
2
+ import { InputHTMLAttributes, CSSProperties } from 'react';
3
+
4
+ interface SliderProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'defaultValue' | 'id' | 'max' | 'min' | 'onChange' | 'step' | 'style' | 'value'> {
5
+ label?: string;
6
+ min?: number;
7
+ max?: number;
8
+ step?: number;
9
+ value?: number;
10
+ defaultValue?: number;
11
+ onChange?: (value: number) => void;
12
+ /** Suffix shown after the value readout, e.g. "회/일" or "ms". */
13
+ unit?: string;
14
+ hint?: string;
15
+ id?: string;
16
+ style?: CSSProperties;
17
+ }
18
+ /**
19
+ * Numeric range input — hairline track, persimmon fill, tabular value readout.
20
+ * @startingPoint section="Forms" subtitle="Numeric range with tabular readout" viewport="420x90"
21
+ */
22
+ declare function Slider({ label, min, max, step, value, defaultValue, onChange, unit, hint, id, style, }: SliderProps): react.JSX.Element;
23
+
24
+ export { Slider, type SliderProps };
@@ -0,0 +1,24 @@
1
+ import * as react from 'react';
2
+ import { InputHTMLAttributes, CSSProperties } from 'react';
3
+
4
+ interface SliderProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'defaultValue' | 'id' | 'max' | 'min' | 'onChange' | 'step' | 'style' | 'value'> {
5
+ label?: string;
6
+ min?: number;
7
+ max?: number;
8
+ step?: number;
9
+ value?: number;
10
+ defaultValue?: number;
11
+ onChange?: (value: number) => void;
12
+ /** Suffix shown after the value readout, e.g. "회/일" or "ms". */
13
+ unit?: string;
14
+ hint?: string;
15
+ id?: string;
16
+ style?: CSSProperties;
17
+ }
18
+ /**
19
+ * Numeric range input — hairline track, persimmon fill, tabular value readout.
20
+ * @startingPoint section="Forms" subtitle="Numeric range with tabular readout" viewport="420x90"
21
+ */
22
+ declare function Slider({ label, min, max, step, value, defaultValue, onChange, unit, hint, id, style, }: SliderProps): react.JSX.Element;
23
+
24
+ export { Slider, type SliderProps };
@@ -0,0 +1,127 @@
1
+ import { useState, useRef } from 'react';
2
+ import { jsxs, jsx } from 'react/jsx-runtime';
3
+
4
+ // src/components/forms/Slider.tsx
5
+ function Slider({
6
+ label,
7
+ min = 0,
8
+ max = 100,
9
+ step = 1,
10
+ value,
11
+ defaultValue,
12
+ onChange,
13
+ unit = "",
14
+ hint,
15
+ id,
16
+ style
17
+ }) {
18
+ const [internal, setInternal] = useState(defaultValue ?? min);
19
+ const v = value != null ? value : internal;
20
+ const trackRef = useRef(null);
21
+ const sId = id || (label ? `sl-${label.replace(/\s+/g, "-")}` : void 0);
22
+ const pct = (v - min) / (max - min) * 100;
23
+ const set = (nv) => {
24
+ const clamped = Math.min(max, Math.max(min, Math.round(nv / step) * step));
25
+ if (value == null) setInternal(clamped);
26
+ onChange?.(clamped);
27
+ };
28
+ const fromClientX = (clientX) => {
29
+ const r = trackRef.current.getBoundingClientRect();
30
+ const ratio = Math.min(1, Math.max(0, (clientX - r.left) / r.width));
31
+ return min + ratio * (max - min);
32
+ };
33
+ const onPointerDown = (e) => {
34
+ e.preventDefault();
35
+ set(fromClientX(e.clientX));
36
+ const move = (ev) => set(fromClientX(ev.clientX));
37
+ const up = () => {
38
+ window.removeEventListener("pointermove", move);
39
+ window.removeEventListener("pointerup", up);
40
+ };
41
+ window.addEventListener("pointermove", move);
42
+ window.addEventListener("pointerup", up);
43
+ };
44
+ const onKey = (e) => {
45
+ if (e.key === "ArrowRight" || e.key === "ArrowUp") {
46
+ e.preventDefault();
47
+ set(v + step);
48
+ } else if (e.key === "ArrowLeft" || e.key === "ArrowDown") {
49
+ e.preventDefault();
50
+ set(v - step);
51
+ }
52
+ };
53
+ return /* @__PURE__ */ jsxs("div", { style: { display: "grid", gap: 9, ...style }, children: [
54
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "baseline", justifyContent: "space-between" }, children: [
55
+ label ? /* @__PURE__ */ jsx("label", { htmlFor: sId, style: { fontSize: 13, fontWeight: 600, color: "var(--dt-muted-strong)" }, children: label }) : /* @__PURE__ */ jsx("span", {}),
56
+ /* @__PURE__ */ jsxs(
57
+ "span",
58
+ {
59
+ style: {
60
+ fontFamily: "var(--dt-font-mono)",
61
+ fontSize: 13,
62
+ fontWeight: 600,
63
+ color: "var(--dt-ink-strong)",
64
+ fontVariantNumeric: "tabular-nums"
65
+ },
66
+ children: [
67
+ v,
68
+ unit ? /* @__PURE__ */ jsx("span", { style: { color: "var(--dt-muted)", fontWeight: 400 }, children: unit }) : null
69
+ ]
70
+ }
71
+ )
72
+ ] }),
73
+ /* @__PURE__ */ jsxs(
74
+ "div",
75
+ {
76
+ ref: trackRef,
77
+ id: sId,
78
+ role: "slider",
79
+ tabIndex: 0,
80
+ "aria-valuemin": min,
81
+ "aria-valuemax": max,
82
+ "aria-valuenow": v,
83
+ onPointerDown,
84
+ onKeyDown: onKey,
85
+ style: { position: "relative", height: 20, display: "flex", alignItems: "center", cursor: "pointer", outline: "none" },
86
+ children: [
87
+ /* @__PURE__ */ jsx(
88
+ "div",
89
+ {
90
+ style: {
91
+ position: "absolute",
92
+ left: 0,
93
+ right: 0,
94
+ height: 4,
95
+ borderRadius: 2,
96
+ background: "var(--dt-surface-sunken)",
97
+ boxShadow: "inset 0 0 0 1px var(--dt-border-strong)"
98
+ }
99
+ }
100
+ ),
101
+ /* @__PURE__ */ jsx("div", { style: { position: "absolute", left: 0, width: `${pct}%`, height: 4, borderRadius: 2, background: "var(--dt-accent)" } }),
102
+ /* @__PURE__ */ jsx(
103
+ "div",
104
+ {
105
+ style: {
106
+ position: "absolute",
107
+ left: `${pct}%`,
108
+ transform: "translateX(-50%)",
109
+ width: 16,
110
+ height: 16,
111
+ borderRadius: "var(--dt-radius-sm)",
112
+ background: "var(--dt-surface)",
113
+ boxShadow: "0 0 0 1.5px var(--dt-accent)",
114
+ border: "3px solid var(--dt-surface)"
115
+ }
116
+ }
117
+ )
118
+ ]
119
+ }
120
+ ),
121
+ hint ? /* @__PURE__ */ jsx("span", { style: { fontSize: 12, color: "var(--dt-muted)" }, children: hint }) : null
122
+ ] });
123
+ }
124
+
125
+ export { Slider };
126
+ //# sourceMappingURL=Slider.mjs.map
127
+ //# sourceMappingURL=Slider.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/forms/Slider.tsx"],"names":[],"mappings":"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","file":"Slider.mjs","sourcesContent":["import { useRef, useState } from 'react';\nimport type { CSSProperties, InputHTMLAttributes, KeyboardEvent, PointerEvent } from 'react';\n\nexport interface SliderProps\n extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'defaultValue' | 'id' | 'max' | 'min' | 'onChange' | 'step' | 'style' | 'value'\n > {\n label?: string;\n min?: number;\n max?: number;\n step?: number;\n value?: number;\n defaultValue?: number;\n onChange?: (value: number) => void;\n /** Suffix shown after the value readout, e.g. \"회/일\" or \"ms\". */\n unit?: string;\n hint?: string;\n id?: string;\n style?: CSSProperties;\n}\n\n/**\n * Numeric range input — hairline track, persimmon fill, tabular value readout.\n * @startingPoint section=\"Forms\" subtitle=\"Numeric range with tabular readout\" viewport=\"420x90\"\n */\nexport function Slider({\n label,\n min = 0,\n max = 100,\n step = 1,\n value,\n defaultValue,\n onChange,\n unit = '',\n hint,\n id,\n style,\n}: SliderProps) {\n const [internal, setInternal] = useState(defaultValue ?? min);\n const v = value != null ? value : internal;\n const trackRef = useRef<HTMLDivElement>(null);\n const sId = id || (label ? `sl-${label.replace(/\\s+/g, '-')}` : undefined);\n const pct = ((v - min) / (max - min)) * 100;\n\n const set = (nv: number) => {\n const clamped = Math.min(max, Math.max(min, Math.round(nv / step) * step));\n if (value == null) setInternal(clamped);\n onChange?.(clamped);\n };\n\n const fromClientX = (clientX: number) => {\n const r = trackRef.current!.getBoundingClientRect();\n const ratio = Math.min(1, Math.max(0, (clientX - r.left) / r.width));\n return min + ratio * (max - min);\n };\n\n const onPointerDown = (e: PointerEvent<HTMLDivElement>) => {\n e.preventDefault();\n set(fromClientX(e.clientX));\n const move = (ev: globalThis.PointerEvent) => set(fromClientX(ev.clientX));\n const up = () => {\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', up);\n };\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n };\n\n const onKey = (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'ArrowRight' || e.key === 'ArrowUp') {\n e.preventDefault();\n set(v + step);\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') {\n e.preventDefault();\n set(v - step);\n }\n };\n\n return (\n <div style={{ display: 'grid', gap: 9, ...style }}>\n <div style={{ display: 'flex', alignItems: 'baseline', justifyContent: 'space-between' }}>\n {label ? (\n <label htmlFor={sId} style={{ fontSize: 13, fontWeight: 600, color: 'var(--dt-muted-strong)' }}>\n {label}\n </label>\n ) : (\n <span />\n )}\n <span\n style={{\n fontFamily: 'var(--dt-font-mono)',\n fontSize: 13,\n fontWeight: 600,\n color: 'var(--dt-ink-strong)',\n fontVariantNumeric: 'tabular-nums',\n }}\n >\n {v}\n {unit ? <span style={{ color: 'var(--dt-muted)', fontWeight: 400 }}>{unit}</span> : null}\n </span>\n </div>\n <div\n ref={trackRef}\n id={sId}\n role=\"slider\"\n tabIndex={0}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={v}\n onPointerDown={onPointerDown}\n onKeyDown={onKey}\n style={{ position: 'relative', height: 20, display: 'flex', alignItems: 'center', cursor: 'pointer', outline: 'none' }}\n >\n <div\n style={{\n position: 'absolute',\n left: 0,\n right: 0,\n height: 4,\n borderRadius: 2,\n background: 'var(--dt-surface-sunken)',\n boxShadow: 'inset 0 0 0 1px var(--dt-border-strong)',\n }}\n />\n <div style={{ position: 'absolute', left: 0, width: `${pct}%`, height: 4, borderRadius: 2, background: 'var(--dt-accent)' }} />\n <div\n style={{\n position: 'absolute',\n left: `${pct}%`,\n transform: 'translateX(-50%)',\n width: 16,\n height: 16,\n borderRadius: 'var(--dt-radius-sm)',\n background: 'var(--dt-surface)',\n boxShadow: '0 0 0 1.5px var(--dt-accent)',\n border: '3px solid var(--dt-surface)',\n }}\n />\n </div>\n {hint ? <span style={{ fontSize: 12, color: 'var(--dt-muted)' }}>{hint}</span> : null}\n </div>\n );\n}\n"]}
@@ -0,0 +1,101 @@
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+ var jsxRuntime = require('react/jsx-runtime');
5
+
6
+ // src/components/forms/Switch.tsx
7
+ function Switch({ checked, defaultChecked, onChange, disabled, label, style }) {
8
+ const [internal, setInternal] = react.useState(defaultChecked ?? false);
9
+ const isOn = checked !== void 0 ? checked : internal;
10
+ const toggle = () => {
11
+ if (disabled) return;
12
+ if (checked === void 0) setInternal((v) => !v);
13
+ onChange?.(!isOn);
14
+ };
15
+ const sw = /* @__PURE__ */ jsxRuntime.jsx(
16
+ "button",
17
+ {
18
+ type: "button",
19
+ role: "switch",
20
+ "aria-checked": isOn,
21
+ disabled,
22
+ onClick: toggle,
23
+ style: {
24
+ width: 38,
25
+ height: 22,
26
+ flex: "0 0 auto",
27
+ borderRadius: 9999,
28
+ border: "none",
29
+ padding: 2,
30
+ background: isOn ? "var(--dt-accent)" : "var(--dt-border-strong)",
31
+ cursor: disabled ? "not-allowed" : "pointer",
32
+ opacity: disabled ? 0.55 : 1,
33
+ transition: "background-color 160ms var(--dt-ease)",
34
+ display: "inline-flex"
35
+ },
36
+ children: /* @__PURE__ */ jsxRuntime.jsx(
37
+ "span",
38
+ {
39
+ style: {
40
+ width: 18,
41
+ height: 18,
42
+ borderRadius: 9999,
43
+ background: "#fff",
44
+ boxShadow: "0 1px 2px rgba(0,0,0,0.25)",
45
+ transform: isOn ? "translateX(16px)" : "translateX(0)",
46
+ transition: "transform 160ms var(--dt-ease)"
47
+ }
48
+ }
49
+ )
50
+ }
51
+ );
52
+ if (!label) return sw;
53
+ return /* @__PURE__ */ jsxRuntime.jsxs(
54
+ "label",
55
+ {
56
+ style: {
57
+ display: "inline-flex",
58
+ alignItems: "center",
59
+ gap: 10,
60
+ cursor: disabled ? "not-allowed" : "pointer",
61
+ ...style
62
+ },
63
+ children: [
64
+ sw,
65
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 14, color: "var(--dt-ink)" }, children: label })
66
+ ]
67
+ }
68
+ );
69
+ }
70
+ function ToggleSwitch({
71
+ checked,
72
+ label,
73
+ onChange,
74
+ disabled = false,
75
+ className = ""
76
+ }) {
77
+ return /* @__PURE__ */ jsxRuntime.jsx(
78
+ "button",
79
+ {
80
+ type: "button",
81
+ role: "switch",
82
+ "aria-checked": checked,
83
+ "aria-label": label,
84
+ disabled,
85
+ onClick: () => onChange(!checked),
86
+ className: `relative inline-flex h-6 w-11 shrink-0 items-center rounded-full border transition-colors disabled:cursor-not-allowed disabled:opacity-50 ${checked ? "border-success/40 bg-success/80" : "border-line-strong bg-raised"} ${className}`,
87
+ children: /* @__PURE__ */ jsxRuntime.jsx(
88
+ "span",
89
+ {
90
+ "aria-hidden": true,
91
+ className: `inline-block h-4 w-4 transform rounded-full bg-surface shadow-dtSubtle transition-transform ${checked ? "translate-x-6" : "translate-x-1"}`
92
+ }
93
+ )
94
+ }
95
+ );
96
+ }
97
+
98
+ exports.Switch = Switch;
99
+ exports.ToggleSwitch = ToggleSwitch;
100
+ //# sourceMappingURL=Switch.cjs.map
101
+ //# sourceMappingURL=Switch.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/forms/Switch.tsx"],"names":["useState","jsx","jsxs"],"mappings":"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","file":"Switch.cjs","sourcesContent":["import { useState } from 'react';\nimport type { CSSProperties, InputHTMLAttributes, ReactNode } from 'react';\n\nexport interface SwitchProps\n extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'checked' | 'defaultChecked' | 'disabled' | 'id' | 'onChange' | 'style'\n > {\n checked?: boolean;\n defaultChecked?: boolean;\n onChange?: (checked: boolean) => void;\n disabled?: boolean;\n label?: ReactNode;\n id?: string;\n style?: CSSProperties;\n}\n\n/** Toggle switch for instant on/off settings — persimmon track when on. */\nexport function Switch({ checked, defaultChecked, onChange, disabled, label, style }: SwitchProps) {\n const [internal, setInternal] = useState(defaultChecked ?? false);\n const isOn = checked !== undefined ? checked : internal;\n const toggle = () => {\n if (disabled) return;\n if (checked === undefined) setInternal((v) => !v);\n onChange?.(!isOn);\n };\n const sw = (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={isOn}\n disabled={disabled}\n onClick={toggle}\n style={{\n width: 38,\n height: 22,\n flex: '0 0 auto',\n borderRadius: 9999,\n border: 'none',\n padding: 2,\n background: isOn ? 'var(--dt-accent)' : 'var(--dt-border-strong)',\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.55 : 1,\n transition: 'background-color 160ms var(--dt-ease)',\n display: 'inline-flex',\n }}\n >\n <span\n style={{\n width: 18,\n height: 18,\n borderRadius: 9999,\n background: '#fff',\n boxShadow: '0 1px 2px rgba(0,0,0,0.25)',\n transform: isOn ? 'translateX(16px)' : 'translateX(0)',\n transition: 'transform 160ms var(--dt-ease)',\n }}\n />\n </button>\n );\n if (!label) return sw;\n return (\n <label\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 10,\n cursor: disabled ? 'not-allowed' : 'pointer',\n ...style,\n }}\n >\n {sw}\n <span style={{ fontSize: 14, color: 'var(--dt-ink)' }}>{label}</span>\n </label>\n );\n}\n\nexport interface ToggleSwitchProps {\n readonly checked: boolean;\n readonly label: string;\n readonly onChange: (next: boolean) => void;\n readonly disabled?: boolean;\n readonly className?: string;\n}\n\nexport function ToggleSwitch({\n checked,\n label,\n onChange,\n disabled = false,\n className = '',\n}: ToggleSwitchProps) {\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-label={label}\n disabled={disabled}\n onClick={() => onChange(!checked)}\n className={`relative inline-flex h-6 w-11 shrink-0 items-center rounded-full border transition-colors disabled:cursor-not-allowed disabled:opacity-50 ${\n checked ? 'border-success/40 bg-success/80' : 'border-line-strong bg-raised'\n } ${className}`}\n >\n <span\n aria-hidden\n className={`inline-block h-4 w-4 transform rounded-full bg-surface shadow-dtSubtle transition-transform ${\n checked ? 'translate-x-6' : 'translate-x-1'\n }`}\n />\n </button>\n );\n}\n"]}
@@ -0,0 +1,24 @@
1
+ import * as react from 'react';
2
+ import { InputHTMLAttributes, ReactNode, CSSProperties } from 'react';
3
+
4
+ interface SwitchProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'checked' | 'defaultChecked' | 'disabled' | 'id' | 'onChange' | 'style'> {
5
+ checked?: boolean;
6
+ defaultChecked?: boolean;
7
+ onChange?: (checked: boolean) => void;
8
+ disabled?: boolean;
9
+ label?: ReactNode;
10
+ id?: string;
11
+ style?: CSSProperties;
12
+ }
13
+ /** Toggle switch for instant on/off settings — persimmon track when on. */
14
+ declare function Switch({ checked, defaultChecked, onChange, disabled, label, style }: SwitchProps): react.JSX.Element;
15
+ interface ToggleSwitchProps {
16
+ readonly checked: boolean;
17
+ readonly label: string;
18
+ readonly onChange: (next: boolean) => void;
19
+ readonly disabled?: boolean;
20
+ readonly className?: string;
21
+ }
22
+ declare function ToggleSwitch({ checked, label, onChange, disabled, className, }: ToggleSwitchProps): react.JSX.Element;
23
+
24
+ export { Switch, type SwitchProps, ToggleSwitch, type ToggleSwitchProps };
@@ -0,0 +1,24 @@
1
+ import * as react from 'react';
2
+ import { InputHTMLAttributes, ReactNode, CSSProperties } from 'react';
3
+
4
+ interface SwitchProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'checked' | 'defaultChecked' | 'disabled' | 'id' | 'onChange' | 'style'> {
5
+ checked?: boolean;
6
+ defaultChecked?: boolean;
7
+ onChange?: (checked: boolean) => void;
8
+ disabled?: boolean;
9
+ label?: ReactNode;
10
+ id?: string;
11
+ style?: CSSProperties;
12
+ }
13
+ /** Toggle switch for instant on/off settings — persimmon track when on. */
14
+ declare function Switch({ checked, defaultChecked, onChange, disabled, label, style }: SwitchProps): react.JSX.Element;
15
+ interface ToggleSwitchProps {
16
+ readonly checked: boolean;
17
+ readonly label: string;
18
+ readonly onChange: (next: boolean) => void;
19
+ readonly disabled?: boolean;
20
+ readonly className?: string;
21
+ }
22
+ declare function ToggleSwitch({ checked, label, onChange, disabled, className, }: ToggleSwitchProps): react.JSX.Element;
23
+
24
+ export { Switch, type SwitchProps, ToggleSwitch, type ToggleSwitchProps };
@@ -0,0 +1,98 @@
1
+ import { useState } from 'react';
2
+ import { jsxs, jsx } from 'react/jsx-runtime';
3
+
4
+ // src/components/forms/Switch.tsx
5
+ function Switch({ checked, defaultChecked, onChange, disabled, label, style }) {
6
+ const [internal, setInternal] = useState(defaultChecked ?? false);
7
+ const isOn = checked !== void 0 ? checked : internal;
8
+ const toggle = () => {
9
+ if (disabled) return;
10
+ if (checked === void 0) setInternal((v) => !v);
11
+ onChange?.(!isOn);
12
+ };
13
+ const sw = /* @__PURE__ */ jsx(
14
+ "button",
15
+ {
16
+ type: "button",
17
+ role: "switch",
18
+ "aria-checked": isOn,
19
+ disabled,
20
+ onClick: toggle,
21
+ style: {
22
+ width: 38,
23
+ height: 22,
24
+ flex: "0 0 auto",
25
+ borderRadius: 9999,
26
+ border: "none",
27
+ padding: 2,
28
+ background: isOn ? "var(--dt-accent)" : "var(--dt-border-strong)",
29
+ cursor: disabled ? "not-allowed" : "pointer",
30
+ opacity: disabled ? 0.55 : 1,
31
+ transition: "background-color 160ms var(--dt-ease)",
32
+ display: "inline-flex"
33
+ },
34
+ children: /* @__PURE__ */ jsx(
35
+ "span",
36
+ {
37
+ style: {
38
+ width: 18,
39
+ height: 18,
40
+ borderRadius: 9999,
41
+ background: "#fff",
42
+ boxShadow: "0 1px 2px rgba(0,0,0,0.25)",
43
+ transform: isOn ? "translateX(16px)" : "translateX(0)",
44
+ transition: "transform 160ms var(--dt-ease)"
45
+ }
46
+ }
47
+ )
48
+ }
49
+ );
50
+ if (!label) return sw;
51
+ return /* @__PURE__ */ jsxs(
52
+ "label",
53
+ {
54
+ style: {
55
+ display: "inline-flex",
56
+ alignItems: "center",
57
+ gap: 10,
58
+ cursor: disabled ? "not-allowed" : "pointer",
59
+ ...style
60
+ },
61
+ children: [
62
+ sw,
63
+ /* @__PURE__ */ jsx("span", { style: { fontSize: 14, color: "var(--dt-ink)" }, children: label })
64
+ ]
65
+ }
66
+ );
67
+ }
68
+ function ToggleSwitch({
69
+ checked,
70
+ label,
71
+ onChange,
72
+ disabled = false,
73
+ className = ""
74
+ }) {
75
+ return /* @__PURE__ */ jsx(
76
+ "button",
77
+ {
78
+ type: "button",
79
+ role: "switch",
80
+ "aria-checked": checked,
81
+ "aria-label": label,
82
+ disabled,
83
+ onClick: () => onChange(!checked),
84
+ className: `relative inline-flex h-6 w-11 shrink-0 items-center rounded-full border transition-colors disabled:cursor-not-allowed disabled:opacity-50 ${checked ? "border-success/40 bg-success/80" : "border-line-strong bg-raised"} ${className}`,
85
+ children: /* @__PURE__ */ jsx(
86
+ "span",
87
+ {
88
+ "aria-hidden": true,
89
+ className: `inline-block h-4 w-4 transform rounded-full bg-surface shadow-dtSubtle transition-transform ${checked ? "translate-x-6" : "translate-x-1"}`
90
+ }
91
+ )
92
+ }
93
+ );
94
+ }
95
+
96
+ export { Switch, ToggleSwitch };
97
+ //# sourceMappingURL=Switch.mjs.map
98
+ //# sourceMappingURL=Switch.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/forms/Switch.tsx"],"names":[],"mappings":"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","file":"Switch.mjs","sourcesContent":["import { useState } from 'react';\nimport type { CSSProperties, InputHTMLAttributes, ReactNode } from 'react';\n\nexport interface SwitchProps\n extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'checked' | 'defaultChecked' | 'disabled' | 'id' | 'onChange' | 'style'\n > {\n checked?: boolean;\n defaultChecked?: boolean;\n onChange?: (checked: boolean) => void;\n disabled?: boolean;\n label?: ReactNode;\n id?: string;\n style?: CSSProperties;\n}\n\n/** Toggle switch for instant on/off settings — persimmon track when on. */\nexport function Switch({ checked, defaultChecked, onChange, disabled, label, style }: SwitchProps) {\n const [internal, setInternal] = useState(defaultChecked ?? false);\n const isOn = checked !== undefined ? checked : internal;\n const toggle = () => {\n if (disabled) return;\n if (checked === undefined) setInternal((v) => !v);\n onChange?.(!isOn);\n };\n const sw = (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={isOn}\n disabled={disabled}\n onClick={toggle}\n style={{\n width: 38,\n height: 22,\n flex: '0 0 auto',\n borderRadius: 9999,\n border: 'none',\n padding: 2,\n background: isOn ? 'var(--dt-accent)' : 'var(--dt-border-strong)',\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.55 : 1,\n transition: 'background-color 160ms var(--dt-ease)',\n display: 'inline-flex',\n }}\n >\n <span\n style={{\n width: 18,\n height: 18,\n borderRadius: 9999,\n background: '#fff',\n boxShadow: '0 1px 2px rgba(0,0,0,0.25)',\n transform: isOn ? 'translateX(16px)' : 'translateX(0)',\n transition: 'transform 160ms var(--dt-ease)',\n }}\n />\n </button>\n );\n if (!label) return sw;\n return (\n <label\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 10,\n cursor: disabled ? 'not-allowed' : 'pointer',\n ...style,\n }}\n >\n {sw}\n <span style={{ fontSize: 14, color: 'var(--dt-ink)' }}>{label}</span>\n </label>\n );\n}\n\nexport interface ToggleSwitchProps {\n readonly checked: boolean;\n readonly label: string;\n readonly onChange: (next: boolean) => void;\n readonly disabled?: boolean;\n readonly className?: string;\n}\n\nexport function ToggleSwitch({\n checked,\n label,\n onChange,\n disabled = false,\n className = '',\n}: ToggleSwitchProps) {\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-label={label}\n disabled={disabled}\n onClick={() => onChange(!checked)}\n className={`relative inline-flex h-6 w-11 shrink-0 items-center rounded-full border transition-colors disabled:cursor-not-allowed disabled:opacity-50 ${\n checked ? 'border-success/40 bg-success/80' : 'border-line-strong bg-raised'\n } ${className}`}\n >\n <span\n aria-hidden\n className={`inline-block h-4 w-4 transform rounded-full bg-surface shadow-dtSubtle transition-transform ${\n checked ? 'translate-x-6' : 'translate-x-1'\n }`}\n />\n </button>\n );\n}\n"]}
@@ -0,0 +1,35 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+
5
+ // src/components/forms/Textarea.tsx
6
+ function Textarea({ label, hint, rows = 4, mono = false, id, style, ...rest }) {
7
+ const taId = id || (label ? `ta-${label.replace(/\s+/g, "-")}` : void 0);
8
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "grid", gap: 7 }, children: [
9
+ label ? /* @__PURE__ */ jsxRuntime.jsx("label", { htmlFor: taId, style: { fontSize: 13, fontWeight: 600, color: "var(--dt-muted-strong)" }, children: label }) : null,
10
+ /* @__PURE__ */ jsxRuntime.jsx(
11
+ "textarea",
12
+ {
13
+ id: taId,
14
+ rows,
15
+ className: "dt-field",
16
+ style: {
17
+ width: "100%",
18
+ resize: "vertical",
19
+ padding: "11px 13px",
20
+ fontSize: mono ? 13 : 14,
21
+ fontFamily: mono ? "var(--dt-font-mono)" : "inherit",
22
+ lineHeight: 1.55,
23
+ color: "var(--dt-ink-strong)",
24
+ ...style
25
+ },
26
+ ...rest
27
+ }
28
+ ),
29
+ hint ? /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 12, color: "var(--dt-muted)" }, children: hint }) : null
30
+ ] });
31
+ }
32
+
33
+ exports.Textarea = Textarea;
34
+ //# sourceMappingURL=Textarea.cjs.map
35
+ //# sourceMappingURL=Textarea.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/forms/Textarea.tsx"],"names":["jsxs","jsx"],"mappings":";;;;;AAYO,SAAS,QAAA,CAAS,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,KAAA,EAAO,EAAA,EAAI,KAAA,EAAO,GAAG,IAAA,EAAK,EAAkB;AACnG,EAAA,MAAM,IAAA,GAAO,OAAO,KAAA,GAAQ,CAAA,GAAA,EAAM,MAAM,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAC,CAAA,CAAA,GAAK,MAAA,CAAA;AACjE,EAAA,uBACEA,eAAA,CAAC,SAAI,KAAA,EAAO,EAAE,SAAS,MAAA,EAAQ,GAAA,EAAK,GAAE,EACnC,QAAA,EAAA;AAAA,IAAA,KAAA,mBACCC,cAAA,CAAC,OAAA,EAAA,EAAM,OAAA,EAAS,IAAA,EAAM,OAAO,EAAE,QAAA,EAAU,EAAA,EAAI,UAAA,EAAY,GAAA,EAAK,KAAA,EAAO,wBAAA,EAAyB,EAC3F,iBACH,CAAA,GACE,IAAA;AAAA,oBACJA,cAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI,IAAA;AAAA,QACJ,IAAA;AAAA,QACA,SAAA,EAAU,UAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,KAAA,EAAO,MAAA;AAAA,UACP,MAAA,EAAQ,UAAA;AAAA,UACR,OAAA,EAAS,WAAA;AAAA,UACT,QAAA,EAAU,OAAO,EAAA,GAAK,EAAA;AAAA,UACtB,UAAA,EAAY,OAAO,qBAAA,GAAwB,SAAA;AAAA,UAC3C,UAAA,EAAY,IAAA;AAAA,UACZ,KAAA,EAAO,sBAAA;AAAA,UACP,GAAG;AAAA,SACL;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,IACC,IAAA,mBAAOA,cAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,KAAA,EAAO,iBAAA,EAAkB,EAAI,QAAA,EAAA,IAAA,EAAK,CAAA,GAAU;AAAA,GAAA,EACnF,CAAA;AAEJ","file":"Textarea.cjs","sourcesContent":["import type { CSSProperties, TextareaHTMLAttributes } from 'react';\n\nexport interface TextareaProps extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'style'> {\n label?: string;\n hint?: string;\n rows?: number;\n /** Render in JetBrains Mono (for JSON / payloads). */\n mono?: boolean;\n style?: CSSProperties;\n}\n\n/** Multi-line text field with a persimmon focus ring. */\nexport function Textarea({ label, hint, rows = 4, mono = false, id, style, ...rest }: TextareaProps) {\n const taId = id || (label ? `ta-${label.replace(/\\s+/g, '-')}` : undefined);\n return (\n <div style={{ display: 'grid', gap: 7 }}>\n {label ? (\n <label htmlFor={taId} style={{ fontSize: 13, fontWeight: 600, color: 'var(--dt-muted-strong)' }}>\n {label}\n </label>\n ) : null}\n <textarea\n id={taId}\n rows={rows}\n className=\"dt-field\"\n style={{\n width: '100%',\n resize: 'vertical',\n padding: '11px 13px',\n fontSize: mono ? 13 : 14,\n fontFamily: mono ? 'var(--dt-font-mono)' : 'inherit',\n lineHeight: 1.55,\n color: 'var(--dt-ink-strong)',\n ...style,\n }}\n {...rest}\n />\n {hint ? <span style={{ fontSize: 12, color: 'var(--dt-muted)' }}>{hint}</span> : null}\n </div>\n );\n}\n"]}
@@ -0,0 +1,15 @@
1
+ import * as react from 'react';
2
+ import { TextareaHTMLAttributes, CSSProperties } from 'react';
3
+
4
+ interface TextareaProps extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'style'> {
5
+ label?: string;
6
+ hint?: string;
7
+ rows?: number;
8
+ /** Render in JetBrains Mono (for JSON / payloads). */
9
+ mono?: boolean;
10
+ style?: CSSProperties;
11
+ }
12
+ /** Multi-line text field with a persimmon focus ring. */
13
+ declare function Textarea({ label, hint, rows, mono, id, style, ...rest }: TextareaProps): react.JSX.Element;
14
+
15
+ export { Textarea, type TextareaProps };
@@ -0,0 +1,15 @@
1
+ import * as react from 'react';
2
+ import { TextareaHTMLAttributes, CSSProperties } from 'react';
3
+
4
+ interface TextareaProps extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'style'> {
5
+ label?: string;
6
+ hint?: string;
7
+ rows?: number;
8
+ /** Render in JetBrains Mono (for JSON / payloads). */
9
+ mono?: boolean;
10
+ style?: CSSProperties;
11
+ }
12
+ /** Multi-line text field with a persimmon focus ring. */
13
+ declare function Textarea({ label, hint, rows, mono, id, style, ...rest }: TextareaProps): react.JSX.Element;
14
+
15
+ export { Textarea, type TextareaProps };
@@ -0,0 +1,33 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+
3
+ // src/components/forms/Textarea.tsx
4
+ function Textarea({ label, hint, rows = 4, mono = false, id, style, ...rest }) {
5
+ const taId = id || (label ? `ta-${label.replace(/\s+/g, "-")}` : void 0);
6
+ return /* @__PURE__ */ jsxs("div", { style: { display: "grid", gap: 7 }, children: [
7
+ label ? /* @__PURE__ */ jsx("label", { htmlFor: taId, style: { fontSize: 13, fontWeight: 600, color: "var(--dt-muted-strong)" }, children: label }) : null,
8
+ /* @__PURE__ */ jsx(
9
+ "textarea",
10
+ {
11
+ id: taId,
12
+ rows,
13
+ className: "dt-field",
14
+ style: {
15
+ width: "100%",
16
+ resize: "vertical",
17
+ padding: "11px 13px",
18
+ fontSize: mono ? 13 : 14,
19
+ fontFamily: mono ? "var(--dt-font-mono)" : "inherit",
20
+ lineHeight: 1.55,
21
+ color: "var(--dt-ink-strong)",
22
+ ...style
23
+ },
24
+ ...rest
25
+ }
26
+ ),
27
+ hint ? /* @__PURE__ */ jsx("span", { style: { fontSize: 12, color: "var(--dt-muted)" }, children: hint }) : null
28
+ ] });
29
+ }
30
+
31
+ export { Textarea };
32
+ //# sourceMappingURL=Textarea.mjs.map
33
+ //# sourceMappingURL=Textarea.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/forms/Textarea.tsx"],"names":[],"mappings":";;;AAYO,SAAS,QAAA,CAAS,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,KAAA,EAAO,EAAA,EAAI,KAAA,EAAO,GAAG,IAAA,EAAK,EAAkB;AACnG,EAAA,MAAM,IAAA,GAAO,OAAO,KAAA,GAAQ,CAAA,GAAA,EAAM,MAAM,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAC,CAAA,CAAA,GAAK,MAAA,CAAA;AACjE,EAAA,uBACE,IAAA,CAAC,SAAI,KAAA,EAAO,EAAE,SAAS,MAAA,EAAQ,GAAA,EAAK,GAAE,EACnC,QAAA,EAAA;AAAA,IAAA,KAAA,mBACC,GAAA,CAAC,OAAA,EAAA,EAAM,OAAA,EAAS,IAAA,EAAM,OAAO,EAAE,QAAA,EAAU,EAAA,EAAI,UAAA,EAAY,GAAA,EAAK,KAAA,EAAO,wBAAA,EAAyB,EAC3F,iBACH,CAAA,GACE,IAAA;AAAA,oBACJ,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI,IAAA;AAAA,QACJ,IAAA;AAAA,QACA,SAAA,EAAU,UAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,KAAA,EAAO,MAAA;AAAA,UACP,MAAA,EAAQ,UAAA;AAAA,UACR,OAAA,EAAS,WAAA;AAAA,UACT,QAAA,EAAU,OAAO,EAAA,GAAK,EAAA;AAAA,UACtB,UAAA,EAAY,OAAO,qBAAA,GAAwB,SAAA;AAAA,UAC3C,UAAA,EAAY,IAAA;AAAA,UACZ,KAAA,EAAO,sBAAA;AAAA,UACP,GAAG;AAAA,SACL;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,IACC,IAAA,mBAAO,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,KAAA,EAAO,iBAAA,EAAkB,EAAI,QAAA,EAAA,IAAA,EAAK,CAAA,GAAU;AAAA,GAAA,EACnF,CAAA;AAEJ","file":"Textarea.mjs","sourcesContent":["import type { CSSProperties, TextareaHTMLAttributes } from 'react';\n\nexport interface TextareaProps extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'style'> {\n label?: string;\n hint?: string;\n rows?: number;\n /** Render in JetBrains Mono (for JSON / payloads). */\n mono?: boolean;\n style?: CSSProperties;\n}\n\n/** Multi-line text field with a persimmon focus ring. */\nexport function Textarea({ label, hint, rows = 4, mono = false, id, style, ...rest }: TextareaProps) {\n const taId = id || (label ? `ta-${label.replace(/\\s+/g, '-')}` : undefined);\n return (\n <div style={{ display: 'grid', gap: 7 }}>\n {label ? (\n <label htmlFor={taId} style={{ fontSize: 13, fontWeight: 600, color: 'var(--dt-muted-strong)' }}>\n {label}\n </label>\n ) : null}\n <textarea\n id={taId}\n rows={rows}\n className=\"dt-field\"\n style={{\n width: '100%',\n resize: 'vertical',\n padding: '11px 13px',\n fontSize: mono ? 13 : 14,\n fontFamily: mono ? 'var(--dt-font-mono)' : 'inherit',\n lineHeight: 1.55,\n color: 'var(--dt-ink-strong)',\n ...style,\n }}\n {...rest}\n />\n {hint ? <span style={{ fontSize: 12, color: 'var(--dt-muted)' }}>{hint}</span> : null}\n </div>\n );\n}\n"]}
@@ -0,0 +1,27 @@
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+ var jsxRuntime = require('react/jsx-runtime');
5
+
6
+ // src/components/navigation/Breadcrumb.tsx
7
+ function Breadcrumb({ items = [], style, ...rest }) {
8
+ return /* @__PURE__ */ jsxRuntime.jsx(
9
+ "nav",
10
+ {
11
+ ...rest,
12
+ "aria-label": "breadcrumb",
13
+ style: { display: "flex", alignItems: "center", gap: 6, flexWrap: "wrap", ...style },
14
+ children: items.map((it, i) => {
15
+ const last = i === items.length - 1;
16
+ return /* @__PURE__ */ jsxRuntime.jsxs(react.Fragment, { children: [
17
+ last ? /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-current": "page", style: { fontSize: 13, fontWeight: 600, color: "var(--dt-ink-strong)" }, children: it.label }) : /* @__PURE__ */ jsxRuntime.jsx("a", { href: it.href || "#", style: { fontSize: 13, fontWeight: 500, color: "var(--dt-muted)", textDecoration: "none" }, children: it.label }),
18
+ !last ? /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", style: { color: "var(--dt-border-strong)" }, "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M9 6l6 6-6 6", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) }) : null
19
+ ] }, i);
20
+ })
21
+ }
22
+ );
23
+ }
24
+
25
+ exports.Breadcrumb = Breadcrumb;
26
+ //# sourceMappingURL=Breadcrumb.cjs.map
27
+ //# sourceMappingURL=Breadcrumb.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/navigation/Breadcrumb.tsx"],"names":["jsx","Fragment"],"mappings":";;;;;;AAcO,SAAS,UAAA,CAAW,EAAE,KAAA,GAAQ,IAAI,KAAA,EAAO,GAAG,MAAK,EAAoB;AAC1E,EAAA,uBACEA,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,IAAA;AAAA,MACJ,YAAA,EAAW,YAAA;AAAA,MACX,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,CAAA,EAAG,QAAA,EAAU,MAAA,EAAQ,GAAG,KAAA,EAAM;AAAA,MAElF,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,EAAA,EAAI,CAAA,KAAM;AACpB,QAAA,MAAM,IAAA,GAAO,CAAA,KAAM,KAAA,CAAM,MAAA,GAAS,CAAA;AAClC,QAAA,uCACGC,cAAA,EAAA,EACE,QAAA,EAAA;AAAA,UAAA,IAAA,mBACGD,cAAA,CAAC,MAAA,EAAA,EAAK,cAAA,EAAa,MAAA,EAAO,OAAO,EAAE,QAAA,EAAU,EAAA,EAAI,UAAA,EAAY,KAAK,KAAA,EAAO,sBAAA,EAAuB,EAAI,QAAA,EAAA,EAAA,CAAG,OAAM,CAAA,mBAC7GA,cAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAM,EAAA,CAAG,IAAA,IAAQ,GAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,UAAA,EAAY,GAAA,EAAK,OAAO,iBAAA,EAAmB,cAAA,EAAgB,MAAA,EAAO,EAAI,aAAG,KAAA,EAAM,CAAA;AAAA,UAClI,CAAC,IAAA,mBACAA,cAAA,CAAC,KAAA,EAAA,EAAI,OAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,KAAA,EAAO,EAAE,KAAA,EAAO,yBAAA,EAA0B,EAAG,aAAA,EAAY,MAAA,EACnH,QAAA,kBAAAA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gBAAe,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAAI,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,GAC5G,CAAA,GACE;AAAA,SAAA,EAAA,EARS,CASf,CAAA;AAAA,MAEJ,CAAC;AAAA;AAAA,GACH;AAEJ","file":"Breadcrumb.cjs","sourcesContent":["import { Fragment } from 'react';\nimport type { CSSProperties, HTMLAttributes, ReactNode } from 'react';\n\nexport interface BreadcrumbItem {\n label: ReactNode;\n href?: string;\n}\n\nexport interface BreadcrumbProps extends Omit<HTMLAttributes<HTMLElement>, 'children'> {\n items?: BreadcrumbItem[];\n style?: CSSProperties;\n}\n\n/** Breadcrumb trail — last item is the current page. */\nexport function Breadcrumb({ items = [], style, ...rest }: BreadcrumbProps) {\n return (\n <nav\n {...rest}\n aria-label=\"breadcrumb\"\n style={{ display: 'flex', alignItems: 'center', gap: 6, flexWrap: 'wrap', ...style }}\n >\n {items.map((it, i) => {\n const last = i === items.length - 1;\n return (\n <Fragment key={i}>\n {last\n ? <span aria-current=\"page\" style={{ fontSize: 13, fontWeight: 600, color: 'var(--dt-ink-strong)' }}>{it.label}</span>\n : <a href={it.href || '#'} style={{ fontSize: 13, fontWeight: 500, color: 'var(--dt-muted)', textDecoration: 'none' }}>{it.label}</a>}\n {!last ? (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" style={{ color: 'var(--dt-border-strong)' }} aria-hidden=\"true\">\n <path d=\"M9 6l6 6-6 6\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ) : null}\n </Fragment>\n );\n })}\n </nav>\n );\n}\n"]}
@@ -0,0 +1,15 @@
1
+ import * as react from 'react';
2
+ import { HTMLAttributes, ReactNode, CSSProperties } from 'react';
3
+
4
+ interface BreadcrumbItem {
5
+ label: ReactNode;
6
+ href?: string;
7
+ }
8
+ interface BreadcrumbProps extends Omit<HTMLAttributes<HTMLElement>, 'children'> {
9
+ items?: BreadcrumbItem[];
10
+ style?: CSSProperties;
11
+ }
12
+ /** Breadcrumb trail — last item is the current page. */
13
+ declare function Breadcrumb({ items, style, ...rest }: BreadcrumbProps): react.JSX.Element;
14
+
15
+ export { Breadcrumb, type BreadcrumbItem, type BreadcrumbProps };