@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
package/dist/index.mjs ADDED
@@ -0,0 +1,2532 @@
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
+ import { forwardRef, useState, useImperativeHandle, useEffect, useRef, useId, Fragment as Fragment$1 } from 'react';
3
+
4
+ // src/lib/cx.ts
5
+ function cx(...classes) {
6
+ return classes.filter(Boolean).join(" ");
7
+ }
8
+ var TONE_CLASS = {
9
+ neutral: "badge",
10
+ accent: "badge badge-accent",
11
+ info: "badge badge-info",
12
+ success: "badge badge-success",
13
+ warning: "badge badge-warning",
14
+ danger: "badge badge-danger"
15
+ };
16
+ function Badge({ children, tone = "neutral", dot = false, style, ...rest }) {
17
+ const cls = TONE_CLASS[tone] ?? TONE_CLASS.neutral;
18
+ return /* @__PURE__ */ jsxs("span", { className: cls, style, ...rest, children: [
19
+ dot ? /* @__PURE__ */ jsx(
20
+ "span",
21
+ {
22
+ "aria-hidden": "true",
23
+ style: {
24
+ width: 6,
25
+ height: 6,
26
+ borderRadius: "9999px",
27
+ background: "currentColor",
28
+ display: "inline-block"
29
+ }
30
+ }
31
+ ) : null,
32
+ children
33
+ ] });
34
+ }
35
+ var SIZE = {
36
+ sm: { height: 36, padding: "0 14px", fontSize: 13 },
37
+ md: { height: 40, padding: "0 16px", fontSize: 14 },
38
+ lg: { height: 48, padding: "0 20px", fontSize: 15 }
39
+ };
40
+ var VARIANT_CLASS = {
41
+ primary: "btn-primary",
42
+ secondary: "btn-secondary",
43
+ ghost: "btn-ghost"
44
+ };
45
+ function Button({
46
+ children,
47
+ variant = "primary",
48
+ size = "md",
49
+ icon = null,
50
+ iconRight = null,
51
+ disabled = false,
52
+ type = "button",
53
+ onClick,
54
+ style,
55
+ ...rest
56
+ }) {
57
+ const cls = VARIANT_CLASS[variant] ?? VARIANT_CLASS.primary;
58
+ const s = SIZE[size] ?? SIZE.md;
59
+ return /* @__PURE__ */ jsxs(
60
+ "button",
61
+ {
62
+ type,
63
+ className: cls,
64
+ disabled,
65
+ onClick,
66
+ style: {
67
+ height: s.height,
68
+ padding: s.padding,
69
+ fontSize: s.fontSize,
70
+ opacity: disabled ? 0.55 : 1,
71
+ cursor: disabled ? "not-allowed" : "pointer",
72
+ ...style
73
+ },
74
+ ...rest,
75
+ children: [
76
+ icon ? /* @__PURE__ */ jsx("span", { style: { display: "inline-flex" }, "aria-hidden": "true", children: icon }) : null,
77
+ children,
78
+ iconRight ? /* @__PURE__ */ jsx("span", { style: { display: "inline-flex" }, "aria-hidden": "true", children: iconRight }) : null
79
+ ]
80
+ }
81
+ );
82
+ }
83
+ var CardTone = {
84
+ Default: "default",
85
+ Muted: "muted",
86
+ Raised: "raised",
87
+ Panel: "panel"
88
+ };
89
+ var VARIANT_STYLE = {
90
+ default: { background: "var(--dt-surface)", boxShadow: "var(--dt-card-rest)" },
91
+ muted: { background: "var(--dt-surface-sunken)" },
92
+ raised: { background: "var(--dt-surface-raised)", boxShadow: "var(--dt-card-float)" },
93
+ panel: { background: "var(--dt-surface)", boxShadow: "var(--dt-shadow-xs)" }
94
+ };
95
+ function Card({
96
+ children,
97
+ variant,
98
+ tone,
99
+ interactive = false,
100
+ padding = 20,
101
+ className,
102
+ style,
103
+ ...rest
104
+ }) {
105
+ const selectedTone = tone ?? variant ?? CardTone.Default;
106
+ const v = VARIANT_STYLE[selectedTone] ?? VARIANT_STYLE[CardTone.Default];
107
+ return /* @__PURE__ */ jsxs(
108
+ "div",
109
+ {
110
+ className: cx(interactive && "dt-card-interactive", className),
111
+ style: {
112
+ borderRadius: "var(--dt-radius-lg)",
113
+ color: "var(--dt-ink)",
114
+ padding,
115
+ transition: "box-shadow var(--dt-motion), background-color var(--dt-motion)",
116
+ ...v,
117
+ ...style
118
+ },
119
+ ...rest,
120
+ children: [
121
+ children,
122
+ interactive ? /* @__PURE__ */ jsx("style", { children: ".dt-card-interactive:hover{box-shadow:var(--dt-card-hover)}" }) : null
123
+ ]
124
+ }
125
+ );
126
+ }
127
+ function FilterChip({ label, count, active = false, removable = false, onToggle, onRemove, icon, style }) {
128
+ return /* @__PURE__ */ jsxs(
129
+ "button",
130
+ {
131
+ type: "button",
132
+ onClick: onToggle,
133
+ "aria-pressed": active,
134
+ style: {
135
+ display: "inline-flex",
136
+ alignItems: "center",
137
+ gap: 7,
138
+ height: 30,
139
+ padding: "0 10px",
140
+ borderRadius: "var(--dt-radius-sm)",
141
+ cursor: "pointer",
142
+ fontFamily: "var(--dt-font-sans)",
143
+ fontSize: 13,
144
+ fontWeight: active ? 650 : 500,
145
+ background: active ? "var(--dt-tint-accent)" : "var(--dt-surface)",
146
+ color: active ? "var(--dt-accent)" : "var(--dt-muted-strong)",
147
+ boxShadow: `inset 0 0 0 1px ${active ? "color-mix(in srgb, var(--dt-accent) 40%, transparent)" : "var(--dt-border-strong)"}`,
148
+ transition: "background-color var(--dt-motion-fast), box-shadow var(--dt-motion-fast)",
149
+ ...style
150
+ },
151
+ children: [
152
+ icon ? /* @__PURE__ */ jsx("span", { style: { display: "inline-flex", color: active ? "var(--dt-accent)" : "var(--dt-muted)" }, "aria-hidden": "true", children: icon }) : null,
153
+ /* @__PURE__ */ jsx("span", { children: label }),
154
+ count != null ? /* @__PURE__ */ jsx("span", { style: { fontFamily: "var(--dt-font-mono)", fontSize: 11, fontWeight: 600, color: active ? "var(--dt-accent)" : "var(--dt-muted)", fontVariantNumeric: "tabular-nums" }, children: count }) : null,
155
+ removable ? /* @__PURE__ */ jsx(
156
+ "span",
157
+ {
158
+ role: "button",
159
+ "aria-label": "\uC81C\uAC70",
160
+ onClick: (e) => {
161
+ e.stopPropagation();
162
+ onRemove?.();
163
+ },
164
+ style: { display: "inline-flex", marginRight: -2, color: active ? "var(--dt-accent)" : "var(--dt-muted)" },
165
+ children: /* @__PURE__ */ jsx("svg", { width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx("path", { d: "M18 6L6 18M6 6l12 12", stroke: "currentColor", strokeWidth: "2.2", strokeLinecap: "round" }) })
166
+ }
167
+ ) : null
168
+ ]
169
+ }
170
+ );
171
+ }
172
+ function Input({
173
+ label,
174
+ hint,
175
+ mono = false,
176
+ id,
177
+ type = "text",
178
+ prefix = null,
179
+ invalid = false,
180
+ style,
181
+ ...rest
182
+ }) {
183
+ const inputId = id || (label ? `in-${label.replace(/\s+/g, "-")}` : void 0);
184
+ return /* @__PURE__ */ jsxs("div", { style: { display: "grid", gap: 8 }, children: [
185
+ label ? /* @__PURE__ */ jsx(
186
+ "label",
187
+ {
188
+ htmlFor: inputId,
189
+ style: { fontSize: 13, fontWeight: 600, color: "var(--dt-muted-strong)" },
190
+ children: label
191
+ }
192
+ ) : null,
193
+ /* @__PURE__ */ jsxs(
194
+ "div",
195
+ {
196
+ className: invalid ? "dt-field dt-field-invalid" : "dt-field",
197
+ style: {
198
+ display: "flex",
199
+ alignItems: "center",
200
+ gap: 8,
201
+ padding: "0 12px"
202
+ },
203
+ children: [
204
+ prefix ? /* @__PURE__ */ jsx("span", { style: { color: "var(--dt-muted)", display: "inline-flex" }, children: prefix }) : null,
205
+ /* @__PURE__ */ jsx(
206
+ "input",
207
+ {
208
+ id: inputId,
209
+ type,
210
+ style: {
211
+ flex: 1,
212
+ border: "none",
213
+ outline: "none",
214
+ background: "transparent",
215
+ color: "var(--dt-ink-strong)",
216
+ padding: "11px 0",
217
+ fontFamily: mono ? "var(--dt-font-mono)" : "var(--dt-font-sans)",
218
+ fontSize: mono ? 13 : 14,
219
+ ...style
220
+ },
221
+ ...rest
222
+ }
223
+ )
224
+ ]
225
+ }
226
+ ),
227
+ hint ? /* @__PURE__ */ jsx("span", { style: { fontSize: 12, color: "var(--dt-muted)" }, children: hint }) : null
228
+ ] });
229
+ }
230
+ var STATUS = {
231
+ connected: { bg: "var(--dt-tint-success)", fg: "var(--dt-success)" },
232
+ success: { bg: "var(--dt-tint-success)", fg: "var(--dt-success)" },
233
+ reconnecting: { bg: "var(--dt-tint-warning)", fg: "var(--dt-warning)" },
234
+ warning: { bg: "var(--dt-tint-warning)", fg: "var(--dt-warning)" },
235
+ disconnected: { bg: "var(--dt-tint-danger)", fg: "var(--dt-danger)" },
236
+ danger: { bg: "var(--dt-tint-danger)", fg: "var(--dt-danger)" },
237
+ info: { bg: "var(--dt-tint-cobalt)", fg: "var(--dt-info)" },
238
+ idle: { bg: "var(--dt-tint-muted)", fg: "var(--dt-muted-strong)" }
239
+ };
240
+ function StatusPill({ status = "idle", children, pulse = false, style, ...rest }) {
241
+ const tone = STATUS[status] ?? STATUS.idle;
242
+ return /* @__PURE__ */ jsxs(
243
+ "span",
244
+ {
245
+ style: {
246
+ display: "inline-flex",
247
+ alignItems: "center",
248
+ gap: 6,
249
+ borderRadius: "var(--dt-radius-full)",
250
+ background: tone.bg,
251
+ padding: "4px 10px",
252
+ fontSize: 12,
253
+ fontWeight: 600,
254
+ color: tone.fg,
255
+ ...style
256
+ },
257
+ ...rest,
258
+ children: [
259
+ pulse ? /* @__PURE__ */ jsx(
260
+ "span",
261
+ {
262
+ "aria-hidden": "true",
263
+ style: {
264
+ width: 7,
265
+ height: 7,
266
+ borderRadius: "9999px",
267
+ background: tone.fg,
268
+ animation: "dt-status-pulse 1.6s var(--dt-ease) infinite"
269
+ }
270
+ }
271
+ ) : null,
272
+ children,
273
+ /* @__PURE__ */ jsx("style", { children: "@keyframes dt-status-pulse{0%,100%{opacity:1}50%{opacity:.35}}" })
274
+ ]
275
+ }
276
+ );
277
+ }
278
+ var SurfaceTone = {
279
+ Default: "default",
280
+ Raised: "raised",
281
+ Sunken: "sunken"
282
+ };
283
+ var MetricAccent = {
284
+ Accent: "accent",
285
+ Success: "success",
286
+ Info: "info"
287
+ };
288
+ var surfaceToneClass = {
289
+ [SurfaceTone.Default]: "bg-[var(--dt-surface)]",
290
+ [SurfaceTone.Raised]: "bg-[var(--dt-surface-raised)]",
291
+ [SurfaceTone.Sunken]: "bg-[var(--dt-surface-sunken)]"
292
+ };
293
+ var metricAccentClass = {
294
+ [MetricAccent.Accent]: "text-[var(--dt-accent)]",
295
+ [MetricAccent.Success]: "text-[var(--dt-success)]",
296
+ [MetricAccent.Info]: "text-[var(--dt-info)]"
297
+ };
298
+ function Panel({ tone = SurfaceTone.Default, className, children, ...props }) {
299
+ return /* @__PURE__ */ jsx(
300
+ "section",
301
+ {
302
+ className: cx(
303
+ "rounded-dtLg border border-[var(--dt-border)] px-5 py-5 md:px-6 md:py-6",
304
+ surfaceToneClass[tone],
305
+ className
306
+ ),
307
+ ...props,
308
+ children
309
+ }
310
+ );
311
+ }
312
+ function metricAccentColor(accent) {
313
+ return metricAccentClass[accent];
314
+ }
315
+ function Tabs({ tabs = [], value, defaultValue, onChange, style }) {
316
+ const [internal, setInternal] = useState(defaultValue ?? tabs[0]?.id);
317
+ const active = value !== void 0 ? value : internal;
318
+ const select = (id) => {
319
+ if (value === void 0) setInternal(id);
320
+ onChange?.(id);
321
+ };
322
+ return /* @__PURE__ */ jsx(
323
+ "div",
324
+ {
325
+ role: "tablist",
326
+ style: {
327
+ display: "flex",
328
+ gap: 4,
329
+ borderBottom: "1px solid var(--dt-border)",
330
+ ...style
331
+ },
332
+ children: tabs.map((tab) => {
333
+ const isActive = tab.id === active;
334
+ return /* @__PURE__ */ jsxs(
335
+ "button",
336
+ {
337
+ role: "tab",
338
+ "aria-selected": isActive,
339
+ type: "button",
340
+ onClick: () => select(tab.id),
341
+ style: {
342
+ position: "relative",
343
+ display: "inline-flex",
344
+ alignItems: "center",
345
+ gap: 7,
346
+ background: "transparent",
347
+ border: "none",
348
+ cursor: "pointer",
349
+ padding: "10px 12px",
350
+ marginBottom: -1,
351
+ fontSize: 13,
352
+ fontWeight: 600,
353
+ color: isActive ? "var(--dt-ink-strong)" : "var(--dt-muted)",
354
+ borderBottom: `2px solid ${isActive ? "var(--dt-accent)" : "transparent"}`,
355
+ transition: "color var(--dt-motion-fast)"
356
+ },
357
+ children: [
358
+ tab.icon ? /* @__PURE__ */ jsx("span", { "aria-hidden": "true", style: { display: "inline-flex" }, children: tab.icon }) : null,
359
+ tab.label,
360
+ tab.count != null ? /* @__PURE__ */ jsx("span", { style: { fontFamily: "var(--dt-font-mono)", fontSize: 11, color: "var(--dt-muted)" }, children: tab.count }) : null
361
+ ]
362
+ },
363
+ tab.id
364
+ );
365
+ })
366
+ }
367
+ );
368
+ }
369
+ function Checkbox({ label, checked, defaultChecked, onChange, disabled, id, style }) {
370
+ const cbId = id || (label ? `cb-${String(label).replace(/\s+/g, "-")}` : void 0);
371
+ const [internal, setInternal] = useState(defaultChecked ?? false);
372
+ const isOn = checked !== void 0 ? checked : internal;
373
+ const toggle = () => {
374
+ if (disabled) return;
375
+ if (checked === void 0) setInternal((v) => !v);
376
+ onChange?.(!isOn);
377
+ };
378
+ return /* @__PURE__ */ jsxs(
379
+ "label",
380
+ {
381
+ htmlFor: cbId,
382
+ style: {
383
+ display: "inline-flex",
384
+ alignItems: "center",
385
+ gap: 9,
386
+ cursor: disabled ? "not-allowed" : "pointer",
387
+ opacity: disabled ? 0.55 : 1,
388
+ ...style
389
+ },
390
+ children: [
391
+ /* @__PURE__ */ jsx(
392
+ "input",
393
+ {
394
+ id: cbId,
395
+ type: "checkbox",
396
+ checked: isOn,
397
+ onChange: toggle,
398
+ disabled,
399
+ style: { position: "absolute", opacity: 0, width: 0, height: 0 }
400
+ }
401
+ ),
402
+ /* @__PURE__ */ jsx(
403
+ "span",
404
+ {
405
+ style: {
406
+ width: 18,
407
+ height: 18,
408
+ flex: "0 0 auto",
409
+ borderRadius: 5,
410
+ display: "grid",
411
+ placeItems: "center",
412
+ background: isOn ? "var(--dt-accent)" : "var(--dt-surface)",
413
+ border: `1.5px solid ${isOn ? "var(--dt-accent)" : "var(--dt-border-strong)"}`,
414
+ transition: "background-color 130ms, border-color 130ms"
415
+ },
416
+ children: isOn ? /* @__PURE__ */ jsx("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx(
417
+ "path",
418
+ {
419
+ d: "M5 12l4.5 4.5L19 7",
420
+ stroke: "var(--dt-accent-ink)",
421
+ strokeWidth: "3",
422
+ strokeLinecap: "round",
423
+ strokeLinejoin: "round"
424
+ }
425
+ ) }) : null
426
+ }
427
+ ),
428
+ label ? /* @__PURE__ */ jsx("span", { style: { fontSize: 14, color: "var(--dt-ink)" }, children: label }) : null
429
+ ]
430
+ }
431
+ );
432
+ }
433
+ function Combobox({
434
+ label,
435
+ hint,
436
+ options = [],
437
+ value,
438
+ onChange,
439
+ placeholder = "\uAC80\uC0C9\u2026",
440
+ emptyText = "\uACB0\uACFC \uC5C6\uC74C",
441
+ id,
442
+ style
443
+ }) {
444
+ const [open, setOpen] = useState(false);
445
+ const [query, setQuery] = useState("");
446
+ const [active, setActive] = useState(0);
447
+ const rootRef = useRef(null);
448
+ const cbId = id || (label ? `cb-${label.replace(/\s+/g, "-")}` : void 0);
449
+ const selected = options.find((o) => o.value === value) || null;
450
+ useEffect(() => {
451
+ const onDoc = (e) => {
452
+ if (rootRef.current && !rootRef.current.contains(e.target)) setOpen(false);
453
+ };
454
+ document.addEventListener("mousedown", onDoc);
455
+ return () => document.removeEventListener("mousedown", onDoc);
456
+ }, []);
457
+ const q = query.trim().toLowerCase();
458
+ const filtered = q ? options.filter((o) => (o.label + " " + (o.meta || "")).toLowerCase().includes(q)) : options;
459
+ const commit = (o) => {
460
+ onChange?.(o.value);
461
+ setOpen(false);
462
+ setQuery("");
463
+ };
464
+ const onKey = (e) => {
465
+ if (e.key === "ArrowDown") {
466
+ e.preventDefault();
467
+ setOpen(true);
468
+ setActive((i) => Math.min(i + 1, filtered.length - 1));
469
+ } else if (e.key === "ArrowUp") {
470
+ e.preventDefault();
471
+ setActive((i) => Math.max(i - 1, 0));
472
+ } else if (e.key === "Enter" && open && filtered[active]) {
473
+ e.preventDefault();
474
+ commit(filtered[active]);
475
+ } else if (e.key === "Escape") {
476
+ setOpen(false);
477
+ }
478
+ };
479
+ return /* @__PURE__ */ jsxs("div", { ref: rootRef, style: { display: "grid", gap: 7, position: "relative", ...style }, children: [
480
+ label ? /* @__PURE__ */ jsx("label", { htmlFor: cbId, style: { fontSize: 13, fontWeight: 600, color: "var(--dt-muted-strong)" }, children: label }) : null,
481
+ /* @__PURE__ */ jsxs(
482
+ "div",
483
+ {
484
+ className: "dt-field",
485
+ style: {
486
+ display: "flex",
487
+ alignItems: "center",
488
+ gap: 9,
489
+ height: 44,
490
+ padding: "0 12px",
491
+ boxShadow: open ? "var(--dt-shadow-focus)" : void 0,
492
+ background: open ? "var(--dt-surface)" : "var(--dt-surface-sunken)"
493
+ },
494
+ onClick: () => setOpen(true),
495
+ children: [
496
+ /* @__PURE__ */ jsxs(
497
+ "svg",
498
+ {
499
+ width: "16",
500
+ height: "16",
501
+ viewBox: "0 0 24 24",
502
+ fill: "none",
503
+ "aria-hidden": "true",
504
+ style: { color: "var(--dt-muted)", flex: "0 0 auto" },
505
+ children: [
506
+ /* @__PURE__ */ jsx("circle", { cx: "11", cy: "11", r: "7", stroke: "currentColor", strokeWidth: "2" }),
507
+ /* @__PURE__ */ jsx("path", { d: "M21 21l-4-4", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round" })
508
+ ]
509
+ }
510
+ ),
511
+ /* @__PURE__ */ jsx(
512
+ "input",
513
+ {
514
+ id: cbId,
515
+ value: open ? query : selected ? selected.label : "",
516
+ placeholder: selected && !open ? selected.label : placeholder,
517
+ onChange: (e) => {
518
+ setQuery(e.target.value);
519
+ setOpen(true);
520
+ setActive(0);
521
+ },
522
+ onFocus: () => setOpen(true),
523
+ onKeyDown: onKey,
524
+ style: {
525
+ flex: 1,
526
+ minWidth: 0,
527
+ border: "none",
528
+ outline: "none",
529
+ background: "transparent",
530
+ fontSize: 14,
531
+ fontFamily: "inherit",
532
+ color: "var(--dt-ink-strong)"
533
+ }
534
+ }
535
+ ),
536
+ selected && !open ? /* @__PURE__ */ jsx("span", { style: { fontFamily: "var(--dt-font-mono)", fontSize: 11, color: "var(--dt-muted)" }, children: selected.meta }) : null
537
+ ]
538
+ }
539
+ ),
540
+ open ? /* @__PURE__ */ jsx(
541
+ "div",
542
+ {
543
+ role: "listbox",
544
+ style: {
545
+ position: "absolute",
546
+ top: "calc(100% + 6px)",
547
+ left: 0,
548
+ right: 0,
549
+ zIndex: 20,
550
+ background: "var(--dt-surface)",
551
+ border: "1px solid var(--dt-border-strong)",
552
+ borderRadius: "var(--dt-radius-lg)",
553
+ boxShadow: "var(--dt-shadow-md)",
554
+ maxHeight: 240,
555
+ overflowY: "auto",
556
+ padding: 4
557
+ },
558
+ children: filtered.length === 0 ? /* @__PURE__ */ jsx("div", { style: { padding: "12px 12px", fontSize: 13, color: "var(--dt-muted)" }, children: emptyText }) : filtered.map((o, i) => {
559
+ const isActive = i === active;
560
+ const isSel = o.value === value;
561
+ return /* @__PURE__ */ jsxs(
562
+ "div",
563
+ {
564
+ role: "option",
565
+ "aria-selected": isSel,
566
+ onMouseEnter: () => setActive(i),
567
+ onMouseDown: (e) => {
568
+ e.preventDefault();
569
+ commit(o);
570
+ },
571
+ style: {
572
+ display: "flex",
573
+ alignItems: "center",
574
+ gap: 10,
575
+ padding: "9px 10px",
576
+ borderRadius: "var(--dt-radius-md)",
577
+ cursor: "pointer",
578
+ background: isActive ? "var(--dt-surface-sunken)" : "transparent"
579
+ },
580
+ children: [
581
+ /* @__PURE__ */ jsx(
582
+ "span",
583
+ {
584
+ style: {
585
+ flex: 1,
586
+ minWidth: 0,
587
+ fontSize: 13.5,
588
+ fontWeight: isSel ? 600 : 500,
589
+ color: "var(--dt-ink-strong)",
590
+ overflow: "hidden",
591
+ textOverflow: "ellipsis",
592
+ whiteSpace: "nowrap"
593
+ },
594
+ children: o.label
595
+ }
596
+ ),
597
+ o.meta ? /* @__PURE__ */ jsx(
598
+ "span",
599
+ {
600
+ style: {
601
+ fontFamily: "var(--dt-font-mono)",
602
+ fontSize: 11,
603
+ color: "var(--dt-muted)",
604
+ flex: "0 0 auto"
605
+ },
606
+ children: o.meta
607
+ }
608
+ ) : null,
609
+ isSel ? /* @__PURE__ */ jsx(
610
+ "svg",
611
+ {
612
+ width: "15",
613
+ height: "15",
614
+ viewBox: "0 0 24 24",
615
+ fill: "none",
616
+ "aria-hidden": "true",
617
+ style: { color: "var(--dt-accent)", flex: "0 0 auto" },
618
+ children: /* @__PURE__ */ jsx(
619
+ "path",
620
+ {
621
+ d: "M20 6L9 17l-5-5",
622
+ stroke: "currentColor",
623
+ strokeWidth: "2.2",
624
+ strokeLinecap: "round",
625
+ strokeLinejoin: "round"
626
+ }
627
+ )
628
+ }
629
+ ) : null
630
+ ]
631
+ },
632
+ o.value
633
+ );
634
+ })
635
+ }
636
+ ) : null,
637
+ hint ? /* @__PURE__ */ jsx("span", { style: { fontSize: 12, color: "var(--dt-muted)" }, children: hint }) : null
638
+ ] });
639
+ }
640
+ function fmtSize(bytes) {
641
+ if (bytes == null) return "";
642
+ if (bytes < 1024) return `${bytes} B`;
643
+ if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(0)} KB`;
644
+ return `${(bytes / 1024 / 1024).toFixed(1)} MB`;
645
+ }
646
+ function FileUpload({
647
+ label,
648
+ accept = ".json,.yaml,.yml",
649
+ hint = "OpenAPI \uC2A4\uD399 \xB7 JSON \uB610\uB294 YAML",
650
+ file,
651
+ onFiles,
652
+ onRemove,
653
+ id,
654
+ style
655
+ }) {
656
+ const [drag, setDrag] = useState(false);
657
+ const inputRef = useRef(null);
658
+ const fId = id || "fu";
659
+ const handle = (files) => {
660
+ if (files && files.length) onFiles?.(files);
661
+ };
662
+ return /* @__PURE__ */ jsxs("div", { style: { display: "grid", gap: 7, ...style }, children: [
663
+ label ? /* @__PURE__ */ jsx("span", { style: { fontSize: 13, fontWeight: 600, color: "var(--dt-muted-strong)" }, children: label }) : null,
664
+ file ? /* @__PURE__ */ jsxs(
665
+ "div",
666
+ {
667
+ style: {
668
+ display: "flex",
669
+ alignItems: "center",
670
+ gap: 12,
671
+ padding: "12px 14px",
672
+ background: "var(--dt-surface)",
673
+ border: "1px solid var(--dt-border-strong)",
674
+ borderRadius: "var(--dt-radius-lg)"
675
+ },
676
+ children: [
677
+ /* @__PURE__ */ jsx(
678
+ "span",
679
+ {
680
+ style: {
681
+ width: 34,
682
+ height: 34,
683
+ flex: "0 0 auto",
684
+ display: "grid",
685
+ placeItems: "center",
686
+ borderRadius: "var(--dt-radius-md)",
687
+ background: "var(--dt-tint-accent)",
688
+ color: "var(--dt-accent)"
689
+ },
690
+ children: /* @__PURE__ */ jsxs("svg", { width: "17", height: "17", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [
691
+ /* @__PURE__ */ jsx(
692
+ "path",
693
+ {
694
+ d: "M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z",
695
+ stroke: "currentColor",
696
+ strokeWidth: "2",
697
+ strokeLinejoin: "round"
698
+ }
699
+ ),
700
+ /* @__PURE__ */ jsx("path", { d: "M14 2v6h6", stroke: "currentColor", strokeWidth: "2", strokeLinejoin: "round" })
701
+ ] })
702
+ }
703
+ ),
704
+ /* @__PURE__ */ jsxs("div", { style: { flex: 1, minWidth: 0 }, children: [
705
+ /* @__PURE__ */ jsx(
706
+ "div",
707
+ {
708
+ style: {
709
+ fontFamily: "var(--dt-font-mono)",
710
+ fontSize: 13,
711
+ fontWeight: 600,
712
+ color: "var(--dt-ink-strong)",
713
+ overflow: "hidden",
714
+ textOverflow: "ellipsis",
715
+ whiteSpace: "nowrap"
716
+ },
717
+ children: file.name
718
+ }
719
+ ),
720
+ /* @__PURE__ */ jsxs("div", { style: { fontFamily: "var(--dt-font-mono)", fontSize: 11, color: "var(--dt-muted)", marginTop: 2 }, children: [
721
+ fmtSize(file.size),
722
+ " \xB7 \uC5C5\uB85C\uB4DC \uC644\uB8CC"
723
+ ] })
724
+ ] }),
725
+ /* @__PURE__ */ jsx(
726
+ "button",
727
+ {
728
+ type: "button",
729
+ onClick: onRemove,
730
+ "aria-label": "\uC81C\uAC70",
731
+ style: {
732
+ flex: "0 0 auto",
733
+ width: 30,
734
+ height: 30,
735
+ display: "grid",
736
+ placeItems: "center",
737
+ border: "none",
738
+ background: "var(--dt-surface-sunken)",
739
+ borderRadius: "var(--dt-radius-sm)",
740
+ color: "var(--dt-muted-strong)",
741
+ cursor: "pointer"
742
+ },
743
+ children: /* @__PURE__ */ jsx("svg", { width: "15", height: "15", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx("path", { d: "M18 6L6 18M6 6l12 12", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round" }) })
744
+ }
745
+ )
746
+ ]
747
+ }
748
+ ) : /* @__PURE__ */ jsxs(
749
+ "label",
750
+ {
751
+ htmlFor: fId,
752
+ onDragOver: (e) => {
753
+ e.preventDefault();
754
+ setDrag(true);
755
+ },
756
+ onDragLeave: () => setDrag(false),
757
+ onDrop: (e) => {
758
+ e.preventDefault();
759
+ setDrag(false);
760
+ handle(e.dataTransfer.files);
761
+ },
762
+ style: {
763
+ display: "grid",
764
+ placeItems: "center",
765
+ gap: 8,
766
+ padding: "26px 20px",
767
+ textAlign: "center",
768
+ cursor: "pointer",
769
+ borderRadius: "var(--dt-radius-lg)",
770
+ border: `1.5px dashed ${drag ? "var(--dt-accent)" : "var(--dt-border-strong)"}`,
771
+ background: drag ? "var(--dt-tint-accent)" : "var(--dt-surface-sunken)",
772
+ transition: "background-color var(--dt-motion-fast), border-color var(--dt-motion-fast)"
773
+ },
774
+ children: [
775
+ /* @__PURE__ */ jsx("span", { style: { color: drag ? "var(--dt-accent)" : "var(--dt-muted)" }, children: /* @__PURE__ */ jsxs("svg", { width: "22", height: "22", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [
776
+ /* @__PURE__ */ jsx(
777
+ "path",
778
+ {
779
+ d: "M12 16V4m0 0L7 9m5-5l5 5",
780
+ stroke: "currentColor",
781
+ strokeWidth: "2",
782
+ strokeLinecap: "round",
783
+ strokeLinejoin: "round"
784
+ }
785
+ ),
786
+ /* @__PURE__ */ jsx(
787
+ "path",
788
+ {
789
+ d: "M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2",
790
+ stroke: "currentColor",
791
+ strokeWidth: "2",
792
+ strokeLinecap: "round"
793
+ }
794
+ )
795
+ ] }) }),
796
+ /* @__PURE__ */ jsxs("span", { style: { fontSize: 13.5, color: "var(--dt-ink-strong)" }, children: [
797
+ /* @__PURE__ */ jsx("span", { style: { fontWeight: 600, color: "var(--dt-accent)" }, children: "\uD30C\uC77C \uC120\uD0DD" }),
798
+ " \uB610\uB294 \uB04C\uC5B4\uB2E4 \uB193\uAE30"
799
+ ] }),
800
+ /* @__PURE__ */ jsx("span", { style: { fontFamily: "var(--dt-font-mono)", fontSize: 11, color: "var(--dt-muted)" }, children: hint }),
801
+ /* @__PURE__ */ jsx(
802
+ "input",
803
+ {
804
+ ref: inputRef,
805
+ id: fId,
806
+ type: "file",
807
+ accept,
808
+ onChange: (e) => handle(e.target.files),
809
+ style: { display: "none" }
810
+ }
811
+ )
812
+ ]
813
+ }
814
+ )
815
+ ] });
816
+ }
817
+ function RadioGroup({ name, options = [], value, defaultValue, onChange, disabled, style }) {
818
+ const [internal, setInternal] = useState(defaultValue);
819
+ const current = value !== void 0 ? value : internal;
820
+ const generatedName = useId();
821
+ const groupName = name || generatedName;
822
+ const select = (v) => {
823
+ if (disabled) return;
824
+ if (value === void 0) setInternal(v);
825
+ onChange?.(v);
826
+ };
827
+ return /* @__PURE__ */ jsx("div", { role: "radiogroup", style: { display: "grid", gap: 10, ...style }, children: options.map((o) => {
828
+ const opt = typeof o === "string" ? { value: o, label: o } : o;
829
+ const on = opt.value === current;
830
+ return /* @__PURE__ */ jsxs(
831
+ "label",
832
+ {
833
+ style: {
834
+ display: "flex",
835
+ alignItems: "flex-start",
836
+ gap: 10,
837
+ cursor: disabled ? "not-allowed" : "pointer",
838
+ opacity: disabled ? 0.55 : 1
839
+ },
840
+ children: [
841
+ /* @__PURE__ */ jsx(
842
+ "input",
843
+ {
844
+ type: "radio",
845
+ name: groupName,
846
+ checked: on,
847
+ onChange: () => select(opt.value),
848
+ disabled,
849
+ style: { position: "absolute", opacity: 0, width: 0, height: 0 }
850
+ }
851
+ ),
852
+ /* @__PURE__ */ jsx(
853
+ "span",
854
+ {
855
+ style: {
856
+ width: 18,
857
+ height: 18,
858
+ marginTop: 1,
859
+ flex: "0 0 auto",
860
+ borderRadius: 9999,
861
+ display: "grid",
862
+ placeItems: "center",
863
+ background: "var(--dt-surface)",
864
+ border: `1.5px solid ${on ? "var(--dt-accent)" : "var(--dt-border-strong)"}`,
865
+ transition: "border-color 130ms"
866
+ },
867
+ children: on ? /* @__PURE__ */ jsx("span", { style: { width: 9, height: 9, borderRadius: 9999, background: "var(--dt-accent)" } }) : null
868
+ }
869
+ ),
870
+ /* @__PURE__ */ jsxs("span", { style: { display: "grid", gap: 2 }, children: [
871
+ /* @__PURE__ */ jsx("span", { style: { fontSize: 14, color: "var(--dt-ink)", lineHeight: 1.3 }, children: opt.label }),
872
+ opt.hint ? /* @__PURE__ */ jsx("span", { style: { fontSize: 12, color: "var(--dt-muted)" }, children: opt.hint }) : null
873
+ ] })
874
+ ]
875
+ },
876
+ opt.value
877
+ );
878
+ }) });
879
+ }
880
+ function SegmentedControl({
881
+ options = [],
882
+ value,
883
+ defaultValue,
884
+ onChange,
885
+ size = "md",
886
+ style
887
+ }) {
888
+ const firstOption = typeof options[0] === "string" ? options[0] : options[0]?.value;
889
+ const [internal, setInternal] = useState(defaultValue ?? firstOption);
890
+ const current = value !== void 0 ? value : internal;
891
+ const select = (v) => {
892
+ if (value === void 0) setInternal(v);
893
+ onChange?.(v);
894
+ };
895
+ const pad = size === "sm" ? "5px 11px" : "7px 14px";
896
+ return /* @__PURE__ */ jsx(
897
+ "div",
898
+ {
899
+ style: {
900
+ display: "inline-flex",
901
+ padding: 3,
902
+ gap: 2,
903
+ background: "var(--dt-surface-sunken)",
904
+ borderRadius: "var(--dt-radius-md)",
905
+ ...style
906
+ },
907
+ children: options.map((o) => {
908
+ const opt = typeof o === "string" ? { value: o, label: o } : o;
909
+ const on = opt.value === current;
910
+ return /* @__PURE__ */ jsx(
911
+ "button",
912
+ {
913
+ type: "button",
914
+ onClick: () => select(opt.value),
915
+ style: {
916
+ border: "none",
917
+ cursor: "pointer",
918
+ padding: pad,
919
+ borderRadius: "var(--dt-radius-sm)",
920
+ fontSize: size === "sm" ? 12 : 13,
921
+ fontWeight: 600,
922
+ fontFamily: "inherit",
923
+ whiteSpace: "nowrap",
924
+ color: on ? "var(--dt-ink-strong)" : "var(--dt-muted)",
925
+ background: on ? "var(--dt-surface)" : "transparent",
926
+ boxShadow: on ? "var(--dt-ring), var(--dt-shadow-xs)" : "none",
927
+ transition: "color 130ms, background-color 130ms"
928
+ },
929
+ children: opt.label
930
+ },
931
+ opt.value
932
+ );
933
+ })
934
+ }
935
+ );
936
+ }
937
+ function Select({ label, hint, options = [], value, defaultValue, onChange, placeholder, disabled, id, style }) {
938
+ const selId = id || (label ? `sel-${label.replace(/\s+/g, "-")}` : void 0);
939
+ return /* @__PURE__ */ jsxs("div", { style: { display: "grid", gap: 7 }, children: [
940
+ label ? /* @__PURE__ */ jsx("label", { htmlFor: selId, style: { fontSize: 13, fontWeight: 600, color: "var(--dt-muted-strong)" }, children: label }) : null,
941
+ /* @__PURE__ */ jsxs("div", { style: { position: "relative", display: "flex" }, children: [
942
+ /* @__PURE__ */ jsxs(
943
+ "select",
944
+ {
945
+ id: selId,
946
+ className: "dt-field",
947
+ value,
948
+ defaultValue,
949
+ disabled,
950
+ onChange: (e) => onChange?.(e.target.value),
951
+ style: {
952
+ appearance: "none",
953
+ WebkitAppearance: "none",
954
+ width: "100%",
955
+ padding: "10px 36px 10px 13px",
956
+ fontSize: 14,
957
+ fontFamily: "inherit",
958
+ color: "var(--dt-ink-strong)",
959
+ cursor: disabled ? "not-allowed" : "pointer",
960
+ opacity: disabled ? 0.55 : 1,
961
+ ...style
962
+ },
963
+ children: [
964
+ placeholder ? /* @__PURE__ */ jsx("option", { value: "", disabled: true, children: placeholder }) : null,
965
+ options.map((o) => {
966
+ const opt = typeof o === "string" ? { value: o, label: o } : o;
967
+ return /* @__PURE__ */ jsx("option", { value: opt.value, children: opt.label }, opt.value);
968
+ })
969
+ ]
970
+ }
971
+ ),
972
+ /* @__PURE__ */ jsx(
973
+ "svg",
974
+ {
975
+ width: "16",
976
+ height: "16",
977
+ viewBox: "0 0 24 24",
978
+ fill: "none",
979
+ "aria-hidden": "true",
980
+ style: {
981
+ position: "absolute",
982
+ right: 11,
983
+ top: "50%",
984
+ transform: "translateY(-50%)",
985
+ pointerEvents: "none",
986
+ color: "var(--dt-muted)"
987
+ },
988
+ children: /* @__PURE__ */ jsx("path", { d: "M6 9l6 6 6-6", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" })
989
+ }
990
+ )
991
+ ] }),
992
+ hint ? /* @__PURE__ */ jsx("span", { style: { fontSize: 12, color: "var(--dt-muted)" }, children: hint }) : null
993
+ ] });
994
+ }
995
+ function Slider({
996
+ label,
997
+ min = 0,
998
+ max = 100,
999
+ step = 1,
1000
+ value,
1001
+ defaultValue,
1002
+ onChange,
1003
+ unit = "",
1004
+ hint,
1005
+ id,
1006
+ style
1007
+ }) {
1008
+ const [internal, setInternal] = useState(defaultValue ?? min);
1009
+ const v = value != null ? value : internal;
1010
+ const trackRef = useRef(null);
1011
+ const sId = id || (label ? `sl-${label.replace(/\s+/g, "-")}` : void 0);
1012
+ const pct = (v - min) / (max - min) * 100;
1013
+ const set = (nv) => {
1014
+ const clamped = Math.min(max, Math.max(min, Math.round(nv / step) * step));
1015
+ if (value == null) setInternal(clamped);
1016
+ onChange?.(clamped);
1017
+ };
1018
+ const fromClientX = (clientX) => {
1019
+ const r = trackRef.current.getBoundingClientRect();
1020
+ const ratio = Math.min(1, Math.max(0, (clientX - r.left) / r.width));
1021
+ return min + ratio * (max - min);
1022
+ };
1023
+ const onPointerDown = (e) => {
1024
+ e.preventDefault();
1025
+ set(fromClientX(e.clientX));
1026
+ const move = (ev) => set(fromClientX(ev.clientX));
1027
+ const up = () => {
1028
+ window.removeEventListener("pointermove", move);
1029
+ window.removeEventListener("pointerup", up);
1030
+ };
1031
+ window.addEventListener("pointermove", move);
1032
+ window.addEventListener("pointerup", up);
1033
+ };
1034
+ const onKey = (e) => {
1035
+ if (e.key === "ArrowRight" || e.key === "ArrowUp") {
1036
+ e.preventDefault();
1037
+ set(v + step);
1038
+ } else if (e.key === "ArrowLeft" || e.key === "ArrowDown") {
1039
+ e.preventDefault();
1040
+ set(v - step);
1041
+ }
1042
+ };
1043
+ return /* @__PURE__ */ jsxs("div", { style: { display: "grid", gap: 9, ...style }, children: [
1044
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "baseline", justifyContent: "space-between" }, children: [
1045
+ label ? /* @__PURE__ */ jsx("label", { htmlFor: sId, style: { fontSize: 13, fontWeight: 600, color: "var(--dt-muted-strong)" }, children: label }) : /* @__PURE__ */ jsx("span", {}),
1046
+ /* @__PURE__ */ jsxs(
1047
+ "span",
1048
+ {
1049
+ style: {
1050
+ fontFamily: "var(--dt-font-mono)",
1051
+ fontSize: 13,
1052
+ fontWeight: 600,
1053
+ color: "var(--dt-ink-strong)",
1054
+ fontVariantNumeric: "tabular-nums"
1055
+ },
1056
+ children: [
1057
+ v,
1058
+ unit ? /* @__PURE__ */ jsx("span", { style: { color: "var(--dt-muted)", fontWeight: 400 }, children: unit }) : null
1059
+ ]
1060
+ }
1061
+ )
1062
+ ] }),
1063
+ /* @__PURE__ */ jsxs(
1064
+ "div",
1065
+ {
1066
+ ref: trackRef,
1067
+ id: sId,
1068
+ role: "slider",
1069
+ tabIndex: 0,
1070
+ "aria-valuemin": min,
1071
+ "aria-valuemax": max,
1072
+ "aria-valuenow": v,
1073
+ onPointerDown,
1074
+ onKeyDown: onKey,
1075
+ style: { position: "relative", height: 20, display: "flex", alignItems: "center", cursor: "pointer", outline: "none" },
1076
+ children: [
1077
+ /* @__PURE__ */ jsx(
1078
+ "div",
1079
+ {
1080
+ style: {
1081
+ position: "absolute",
1082
+ left: 0,
1083
+ right: 0,
1084
+ height: 4,
1085
+ borderRadius: 2,
1086
+ background: "var(--dt-surface-sunken)",
1087
+ boxShadow: "inset 0 0 0 1px var(--dt-border-strong)"
1088
+ }
1089
+ }
1090
+ ),
1091
+ /* @__PURE__ */ jsx("div", { style: { position: "absolute", left: 0, width: `${pct}%`, height: 4, borderRadius: 2, background: "var(--dt-accent)" } }),
1092
+ /* @__PURE__ */ jsx(
1093
+ "div",
1094
+ {
1095
+ style: {
1096
+ position: "absolute",
1097
+ left: `${pct}%`,
1098
+ transform: "translateX(-50%)",
1099
+ width: 16,
1100
+ height: 16,
1101
+ borderRadius: "var(--dt-radius-sm)",
1102
+ background: "var(--dt-surface)",
1103
+ boxShadow: "0 0 0 1.5px var(--dt-accent)",
1104
+ border: "3px solid var(--dt-surface)"
1105
+ }
1106
+ }
1107
+ )
1108
+ ]
1109
+ }
1110
+ ),
1111
+ hint ? /* @__PURE__ */ jsx("span", { style: { fontSize: 12, color: "var(--dt-muted)" }, children: hint }) : null
1112
+ ] });
1113
+ }
1114
+ function Switch({ checked, defaultChecked, onChange, disabled, label, style }) {
1115
+ const [internal, setInternal] = useState(defaultChecked ?? false);
1116
+ const isOn = checked !== void 0 ? checked : internal;
1117
+ const toggle = () => {
1118
+ if (disabled) return;
1119
+ if (checked === void 0) setInternal((v) => !v);
1120
+ onChange?.(!isOn);
1121
+ };
1122
+ const sw = /* @__PURE__ */ jsx(
1123
+ "button",
1124
+ {
1125
+ type: "button",
1126
+ role: "switch",
1127
+ "aria-checked": isOn,
1128
+ disabled,
1129
+ onClick: toggle,
1130
+ style: {
1131
+ width: 38,
1132
+ height: 22,
1133
+ flex: "0 0 auto",
1134
+ borderRadius: 9999,
1135
+ border: "none",
1136
+ padding: 2,
1137
+ background: isOn ? "var(--dt-accent)" : "var(--dt-border-strong)",
1138
+ cursor: disabled ? "not-allowed" : "pointer",
1139
+ opacity: disabled ? 0.55 : 1,
1140
+ transition: "background-color 160ms var(--dt-ease)",
1141
+ display: "inline-flex"
1142
+ },
1143
+ children: /* @__PURE__ */ jsx(
1144
+ "span",
1145
+ {
1146
+ style: {
1147
+ width: 18,
1148
+ height: 18,
1149
+ borderRadius: 9999,
1150
+ background: "#fff",
1151
+ boxShadow: "0 1px 2px rgba(0,0,0,0.25)",
1152
+ transform: isOn ? "translateX(16px)" : "translateX(0)",
1153
+ transition: "transform 160ms var(--dt-ease)"
1154
+ }
1155
+ }
1156
+ )
1157
+ }
1158
+ );
1159
+ if (!label) return sw;
1160
+ return /* @__PURE__ */ jsxs(
1161
+ "label",
1162
+ {
1163
+ style: {
1164
+ display: "inline-flex",
1165
+ alignItems: "center",
1166
+ gap: 10,
1167
+ cursor: disabled ? "not-allowed" : "pointer",
1168
+ ...style
1169
+ },
1170
+ children: [
1171
+ sw,
1172
+ /* @__PURE__ */ jsx("span", { style: { fontSize: 14, color: "var(--dt-ink)" }, children: label })
1173
+ ]
1174
+ }
1175
+ );
1176
+ }
1177
+ function ToggleSwitch({
1178
+ checked,
1179
+ label,
1180
+ onChange,
1181
+ disabled = false,
1182
+ className = ""
1183
+ }) {
1184
+ return /* @__PURE__ */ jsx(
1185
+ "button",
1186
+ {
1187
+ type: "button",
1188
+ role: "switch",
1189
+ "aria-checked": checked,
1190
+ "aria-label": label,
1191
+ disabled,
1192
+ onClick: () => onChange(!checked),
1193
+ 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}`,
1194
+ children: /* @__PURE__ */ jsx(
1195
+ "span",
1196
+ {
1197
+ "aria-hidden": true,
1198
+ className: `inline-block h-4 w-4 transform rounded-full bg-surface shadow-dtSubtle transition-transform ${checked ? "translate-x-6" : "translate-x-1"}`
1199
+ }
1200
+ )
1201
+ }
1202
+ );
1203
+ }
1204
+ function Textarea({ label, hint, rows = 4, mono = false, id, style, ...rest }) {
1205
+ const taId = id || (label ? `ta-${label.replace(/\s+/g, "-")}` : void 0);
1206
+ return /* @__PURE__ */ jsxs("div", { style: { display: "grid", gap: 7 }, children: [
1207
+ label ? /* @__PURE__ */ jsx("label", { htmlFor: taId, style: { fontSize: 13, fontWeight: 600, color: "var(--dt-muted-strong)" }, children: label }) : null,
1208
+ /* @__PURE__ */ jsx(
1209
+ "textarea",
1210
+ {
1211
+ id: taId,
1212
+ rows,
1213
+ className: "dt-field",
1214
+ style: {
1215
+ width: "100%",
1216
+ resize: "vertical",
1217
+ padding: "11px 13px",
1218
+ fontSize: mono ? 13 : 14,
1219
+ fontFamily: mono ? "var(--dt-font-mono)" : "inherit",
1220
+ lineHeight: 1.55,
1221
+ color: "var(--dt-ink-strong)",
1222
+ ...style
1223
+ },
1224
+ ...rest
1225
+ }
1226
+ ),
1227
+ hint ? /* @__PURE__ */ jsx("span", { style: { fontSize: 12, color: "var(--dt-muted)" }, children: hint }) : null
1228
+ ] });
1229
+ }
1230
+ var AlertTone = {
1231
+ Info: "info",
1232
+ Success: "success",
1233
+ Warning: "warning",
1234
+ Danger: "danger"
1235
+ };
1236
+ var AlertMotion = {
1237
+ None: "none",
1238
+ Subtle: "subtle",
1239
+ Pulse: "pulse"
1240
+ };
1241
+ var TONE_BACKGROUND = {
1242
+ info: "var(--dt-status-cobalt)",
1243
+ success: "var(--dt-status-success)",
1244
+ warning: "var(--dt-status-warning)",
1245
+ danger: "var(--dt-status-danger)"
1246
+ };
1247
+ function Alert({
1248
+ tone = AlertTone.Info,
1249
+ title,
1250
+ children,
1251
+ icon,
1252
+ action,
1253
+ motion = AlertMotion.None,
1254
+ onDismiss,
1255
+ className,
1256
+ style,
1257
+ ...rest
1258
+ }) {
1259
+ const background = TONE_BACKGROUND[tone] ?? TONE_BACKGROUND[AlertTone.Info];
1260
+ const motionClass = motion === AlertMotion.None ? void 0 : `dt-alert-motion-${motion}`;
1261
+ return /* @__PURE__ */ jsxs(
1262
+ "div",
1263
+ {
1264
+ role: "status",
1265
+ className: cx("dt-alert", motionClass, className),
1266
+ style: {
1267
+ alignItems: "flex-start",
1268
+ background,
1269
+ borderRadius: "20px",
1270
+ color: "var(--dt-alert-ink)",
1271
+ display: "flex",
1272
+ gap: 12,
1273
+ minHeight: 62,
1274
+ overflow: "clip",
1275
+ padding: "13px 15px",
1276
+ position: "relative",
1277
+ transition: "filter var(--dt-motion-fast), transform var(--dt-motion-fast)",
1278
+ width: "min(100%, 380px)",
1279
+ ...style
1280
+ },
1281
+ ...rest,
1282
+ children: [
1283
+ icon ? /* @__PURE__ */ jsx("span", { style: { color: "currentColor", display: "inline-flex", flex: "0 0 auto", marginTop: 1 }, children: icon }) : null,
1284
+ /* @__PURE__ */ jsxs("div", { style: { flex: "1 0 0", minWidth: 1, overflow: "clip", wordBreak: "break-word" }, children: [
1285
+ title ? /* @__PURE__ */ jsx("div", { style: { fontSize: 14, fontWeight: 600, lineHeight: "normal" }, children: title }) : null,
1286
+ children ? /* @__PURE__ */ jsx("div", { style: { marginTop: title ? 3 : 0, fontSize: 13, fontWeight: 400, lineHeight: "normal" }, children }) : null,
1287
+ action ? /* @__PURE__ */ jsx("div", { style: { marginTop: 10 }, children: action }) : null
1288
+ ] }),
1289
+ onDismiss ? /* @__PURE__ */ jsx("button", { onClick: onDismiss, "aria-label": "\uB2EB\uAE30", style: { flex: "0 0 auto", border: "none", background: "transparent", cursor: "pointer", color: "currentColor", padding: 2, lineHeight: 0 }, children: /* @__PURE__ */ jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx("path", { d: "M6 6l12 12M18 6L6 18", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round" }) }) }) : null
1290
+ ]
1291
+ }
1292
+ );
1293
+ }
1294
+ function Dialog({ open, onClose, title, description, children, footer, "aria-label": ariaLabel, width = 460 }) {
1295
+ const titleId = useId();
1296
+ useEffect(() => {
1297
+ if (!open) return void 0;
1298
+ const onKey = (event) => {
1299
+ if (event.key === "Escape") onClose?.();
1300
+ };
1301
+ window.addEventListener("keydown", onKey);
1302
+ return () => window.removeEventListener("keydown", onKey);
1303
+ }, [open, onClose]);
1304
+ if (!open) return null;
1305
+ return /* @__PURE__ */ jsxs("div", { onClick: onClose, style: {
1306
+ position: "fixed",
1307
+ inset: 0,
1308
+ zIndex: 100,
1309
+ display: "grid",
1310
+ placeItems: "center",
1311
+ padding: 20,
1312
+ background: "color-mix(in srgb, var(--dt-ink-strong) 32%, transparent)",
1313
+ backdropFilter: "blur(2px)",
1314
+ animation: "dt-fade 160ms var(--dt-ease)"
1315
+ }, children: [
1316
+ /* @__PURE__ */ jsxs(
1317
+ "div",
1318
+ {
1319
+ role: "dialog",
1320
+ "aria-modal": "true",
1321
+ onClick: (event) => event.stopPropagation(),
1322
+ "aria-labelledby": title ? titleId : void 0,
1323
+ "aria-label": title ? void 0 : ariaLabel,
1324
+ style: {
1325
+ width: "100%",
1326
+ maxWidth: width,
1327
+ background: "var(--dt-surface)",
1328
+ borderRadius: "var(--dt-radius-lg)",
1329
+ boxShadow: "var(--dt-shadow-xl)",
1330
+ animation: "dt-pop 200ms var(--dt-ease)",
1331
+ overflow: "hidden"
1332
+ },
1333
+ children: [
1334
+ /* @__PURE__ */ jsxs("div", { style: { padding: "22px 24px" }, children: [
1335
+ title ? /* @__PURE__ */ jsx("h3", { id: titleId, style: { fontSize: 18, fontWeight: 700, letterSpacing: "-0.01em", color: "var(--dt-ink-strong)" }, children: title }) : null,
1336
+ description ? /* @__PURE__ */ jsx("p", { style: { marginTop: 8, fontSize: 14, lineHeight: 1.55, color: "var(--dt-muted-strong)" }, children: description }) : null,
1337
+ children ? /* @__PURE__ */ jsx("div", { style: { marginTop: title || description ? 16 : 0 }, children }) : null
1338
+ ] }),
1339
+ footer ? /* @__PURE__ */ jsx("div", { style: { display: "flex", justifyContent: "flex-end", gap: 8, padding: "14px 24px", background: "var(--dt-surface-sunken)" }, children: footer }) : null
1340
+ ]
1341
+ }
1342
+ ),
1343
+ /* @__PURE__ */ jsx("style", { children: `@keyframes dt-fade{from{opacity:0}}@keyframes dt-pop{from{opacity:0;transform:translateY(8px) scale(.98)}}` })
1344
+ ] });
1345
+ }
1346
+ function Drawer({ open = false, side = "right", title, children, footer, onClose, width = 420, style, "aria-label": ariaLabel }) {
1347
+ const titleId = useId();
1348
+ if (!open) return null;
1349
+ const fromRight = side === "right";
1350
+ return /* @__PURE__ */ jsxs("div", { style: { position: "absolute", inset: 0, zIndex: 40, display: "flex", justifyContent: fromRight ? "flex-end" : "flex-start" }, children: [
1351
+ /* @__PURE__ */ jsx("div", { onClick: onClose, style: { position: "absolute", inset: 0, background: "rgba(24,22,18,0.32)" } }),
1352
+ /* @__PURE__ */ jsxs(
1353
+ "aside",
1354
+ {
1355
+ role: "dialog",
1356
+ "aria-modal": "true",
1357
+ "aria-labelledby": title ? titleId : void 0,
1358
+ "aria-label": title ? void 0 : ariaLabel || "pane",
1359
+ style: {
1360
+ position: "relative",
1361
+ width,
1362
+ maxWidth: "100%",
1363
+ height: "100%",
1364
+ display: "flex",
1365
+ flexDirection: "column",
1366
+ background: "var(--dt-surface)",
1367
+ boxShadow: "var(--dt-shadow-xl)",
1368
+ borderLeft: fromRight ? "1px solid var(--dt-border-strong)" : "none",
1369
+ borderRight: fromRight ? "none" : "1px solid var(--dt-border-strong)",
1370
+ fontFamily: "var(--dt-font-sans)",
1371
+ ...style
1372
+ },
1373
+ children: [
1374
+ /* @__PURE__ */ jsxs("header", { style: { display: "flex", alignItems: "center", gap: 12, padding: "16px 18px", borderBottom: "1px solid var(--dt-border)" }, children: [
1375
+ title ? /* @__PURE__ */ jsx("h3", { id: titleId, style: { margin: 0, flex: 1, minWidth: 0, fontSize: 16, fontWeight: 650, letterSpacing: "-0.01em", color: "var(--dt-ink-strong)" }, children: title }) : null,
1376
+ /* @__PURE__ */ jsx(
1377
+ "button",
1378
+ {
1379
+ type: "button",
1380
+ onClick: onClose,
1381
+ "aria-label": "\uB2EB\uAE30",
1382
+ style: { flex: "0 0 auto", width: 30, height: 30, display: "grid", placeItems: "center", border: "none", background: "var(--dt-surface-sunken)", borderRadius: "var(--dt-radius-sm)", color: "var(--dt-muted-strong)", cursor: "pointer" },
1383
+ children: /* @__PURE__ */ jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx("path", { d: "M18 6L6 18M6 6l12 12", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round" }) })
1384
+ }
1385
+ )
1386
+ ] }),
1387
+ /* @__PURE__ */ jsx("div", { style: { flex: 1, overflowY: "auto", padding: 18 }, children }),
1388
+ footer ? /* @__PURE__ */ jsx("footer", { style: { display: "flex", alignItems: "center", gap: 10, padding: "14px 18px", borderTop: "1px solid var(--dt-border)" }, children: footer }) : null
1389
+ ]
1390
+ }
1391
+ )
1392
+ ] });
1393
+ }
1394
+ function EmptyState({ icon, title, description, action, style }) {
1395
+ return /* @__PURE__ */ jsxs("div", { style: {
1396
+ display: "grid",
1397
+ placeItems: "center",
1398
+ gap: 10,
1399
+ textAlign: "center",
1400
+ padding: "40px 24px",
1401
+ borderRadius: "var(--dt-radius-lg)",
1402
+ background: "var(--dt-surface-sunken)",
1403
+ ...style
1404
+ }, children: [
1405
+ icon ? /* @__PURE__ */ jsx("span", { style: {
1406
+ display: "inline-flex",
1407
+ width: 44,
1408
+ height: 44,
1409
+ alignItems: "center",
1410
+ justifyContent: "center",
1411
+ borderRadius: "var(--dt-radius-md)",
1412
+ background: "var(--dt-surface)",
1413
+ color: "var(--dt-muted)",
1414
+ boxShadow: "var(--dt-ring), var(--dt-shadow-xs)"
1415
+ }, children: icon }) : null,
1416
+ title ? /* @__PURE__ */ jsx("div", { style: { fontSize: 15, fontWeight: 650, color: "var(--dt-ink-strong)" }, children: title }) : null,
1417
+ description ? /* @__PURE__ */ jsx("div", { style: { fontSize: 13, lineHeight: 1.55, color: "var(--dt-muted)", maxWidth: 320 }, children: description }) : null,
1418
+ action ? /* @__PURE__ */ jsx("div", { style: { marginTop: 6 }, children: action }) : null
1419
+ ] });
1420
+ }
1421
+ function Skeleton({ width = "100%", height = 14, radius = "var(--dt-radius-sm)", style }) {
1422
+ return /* @__PURE__ */ jsx("span", { className: "dt-skeleton", style: {
1423
+ display: "block",
1424
+ width,
1425
+ height,
1426
+ borderRadius: radius,
1427
+ background: "var(--dt-surface-sunken)",
1428
+ ...style
1429
+ } });
1430
+ }
1431
+ function Spinner({ size = 18, stroke = 2, color = "var(--dt-accent)", style }) {
1432
+ useId();
1433
+ return /* @__PURE__ */ jsx("span", { style: { display: "inline-flex", ...style }, role: "status", "aria-label": "\uB85C\uB529 \uC911", children: /* @__PURE__ */ jsxs("svg", { className: "dt-spinner-svg", width: size, height: size, viewBox: "0 0 24 24", fill: "none", children: [
1434
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "9", stroke: "currentColor", strokeWidth: stroke, style: { color: "var(--dt-border-strong)", opacity: 0.5 } }),
1435
+ /* @__PURE__ */ jsx("path", { d: "M12 3a9 9 0 0 1 9 9", stroke: color, strokeWidth: stroke, strokeLinecap: "round" })
1436
+ ] }) });
1437
+ }
1438
+ var DOT = { info: "var(--dt-cobalt)", success: "var(--dt-success)", warning: "var(--dt-warning)", danger: "var(--dt-danger)" };
1439
+ function Toast({ tone = "success", title, message, action, onDismiss, style }) {
1440
+ return /* @__PURE__ */ jsxs("div", { role: "status", className: "dt-toast", style: {
1441
+ display: "flex",
1442
+ alignItems: "flex-start",
1443
+ gap: 11,
1444
+ width: 340,
1445
+ maxWidth: "90vw",
1446
+ padding: "13px 15px",
1447
+ background: "var(--dt-surface)",
1448
+ borderRadius: "var(--dt-radius-md)",
1449
+ boxShadow: "var(--dt-shadow-lg)",
1450
+ ...style
1451
+ }, children: [
1452
+ /* @__PURE__ */ jsx("span", { style: { width: 8, height: 8, borderRadius: 9999, marginTop: 5, flex: "0 0 auto", background: DOT[tone] ?? DOT.success } }),
1453
+ /* @__PURE__ */ jsxs("div", { style: { flex: 1, minWidth: 0 }, children: [
1454
+ title ? /* @__PURE__ */ jsx("div", { style: { fontSize: 14, fontWeight: 650, color: "var(--dt-ink-strong)" }, children: title }) : null,
1455
+ message ? /* @__PURE__ */ jsx("div", { style: { marginTop: title ? 2 : 0, fontSize: 13, lineHeight: 1.5, color: "var(--dt-muted-strong)" }, children: message }) : null
1456
+ ] }),
1457
+ action ? /* @__PURE__ */ jsx("div", { style: { flex: "0 0 auto" }, children: action }) : null,
1458
+ onDismiss ? /* @__PURE__ */ jsx("button", { onClick: onDismiss, "aria-label": "\uB2EB\uAE30", style: { flex: "0 0 auto", border: "none", background: "transparent", cursor: "pointer", color: "var(--dt-muted)", padding: 2, lineHeight: 0 }, children: /* @__PURE__ */ jsx("svg", { width: "15", height: "15", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx("path", { d: "M6 6l12 12M18 6L6 18", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round" }) }) }) : null
1459
+ ] });
1460
+ }
1461
+ function Tooltip({ label, position = "top", children }) {
1462
+ const tooltipId = useId();
1463
+ const [show, setShow] = useState(false);
1464
+ const pos = {
1465
+ top: { bottom: "100%", left: "50%", transform: "translateX(-50%) translateY(-7px)" },
1466
+ bottom: { top: "100%", left: "50%", transform: "translateX(-50%) translateY(7px)" },
1467
+ left: { right: "100%", top: "50%", transform: "translateY(-50%) translateX(-7px)" },
1468
+ right: { left: "100%", top: "50%", transform: "translateY(-50%) translateX(7px)" }
1469
+ }[position];
1470
+ return /* @__PURE__ */ jsxs(
1471
+ "span",
1472
+ {
1473
+ style: { position: "relative", display: "inline-flex" },
1474
+ onMouseEnter: () => setShow(true),
1475
+ onMouseLeave: () => setShow(false),
1476
+ onFocus: () => setShow(true),
1477
+ onBlur: () => setShow(false),
1478
+ children: [
1479
+ /* @__PURE__ */ jsx("span", { "aria-describedby": show ? tooltipId : void 0, children }),
1480
+ /* @__PURE__ */ jsx("span", { id: tooltipId, role: "tooltip", style: {
1481
+ position: "absolute",
1482
+ zIndex: 60,
1483
+ whiteSpace: "nowrap",
1484
+ pointerEvents: "none",
1485
+ opacity: show ? 1 : 0,
1486
+ visibility: show ? "visible" : "hidden",
1487
+ padding: "6px 9px",
1488
+ fontSize: 12,
1489
+ fontWeight: 500,
1490
+ lineHeight: 1.2,
1491
+ color: "var(--dt-paper)",
1492
+ background: "var(--dt-ink-strong)",
1493
+ borderRadius: "var(--dt-radius-sm)",
1494
+ boxShadow: "var(--dt-shadow-md)",
1495
+ transition: "opacity var(--dt-motion-fast), visibility var(--dt-motion-fast)",
1496
+ ...pos
1497
+ }, children: label })
1498
+ ]
1499
+ }
1500
+ );
1501
+ }
1502
+ var SIZE2 = { sm: 26, md: 34, lg: 44 };
1503
+ function Avatar({ name = "", src, size = "md", status, square = true, style, ...rest }) {
1504
+ const px = typeof size === "number" ? size : SIZE2[size] ?? SIZE2.md;
1505
+ const initials = name.trim().split(/\s+/).map((word) => word[0]).slice(0, 2).join("").toUpperCase() || "\xB7";
1506
+ const radius = square ? Math.round(px * 0.28) : px;
1507
+ const statusColor = status ? { online: "var(--dt-success)", busy: "var(--dt-danger)", away: "var(--dt-warning)", offline: "var(--dt-muted)" }[status] ?? void 0 : void 0;
1508
+ return /* @__PURE__ */ jsxs("span", { ...rest, style: { position: "relative", display: "inline-flex", flex: "0 0 auto", ...style }, children: [
1509
+ src ? /* @__PURE__ */ jsx("img", { src, alt: name, width: px, height: px, style: { borderRadius: radius, objectFit: "cover", boxShadow: "var(--dt-ring)" } }) : /* @__PURE__ */ jsx("span", { style: {
1510
+ width: px,
1511
+ height: px,
1512
+ borderRadius: radius,
1513
+ display: "grid",
1514
+ placeItems: "center",
1515
+ background: "var(--dt-tint-accent)",
1516
+ color: "var(--dt-accent)",
1517
+ fontSize: px * 0.38,
1518
+ fontWeight: 700,
1519
+ letterSpacing: "-0.02em"
1520
+ }, children: initials }),
1521
+ statusColor ? /* @__PURE__ */ jsx("span", { style: {
1522
+ position: "absolute",
1523
+ right: -1,
1524
+ bottom: -1,
1525
+ width: px * 0.3,
1526
+ height: px * 0.3,
1527
+ borderRadius: 9999,
1528
+ background: statusColor,
1529
+ boxShadow: "0 0 0 2px var(--dt-surface)"
1530
+ } }) : null
1531
+ ] });
1532
+ }
1533
+ function highlight(line) {
1534
+ const out = [];
1535
+ const re = /("(?:[^"\\]|\\.)*"\s*:)|("(?:[^"\\]|\\.)*")|(\b-?\d+(?:\.\d+)?\b)|(\b(?:true|false|null|GET|POST|PUT|DELETE)\b)|([{}[\],:])/g;
1536
+ let last = 0;
1537
+ let match;
1538
+ while ((match = re.exec(line)) !== null) {
1539
+ if (match.index > last) out.push({ t: line.slice(last, match.index), c: "plain" });
1540
+ if (match[1]) out.push({ t: match[1], c: "key" });
1541
+ else if (match[2]) out.push({ t: match[2], c: "str" });
1542
+ else if (match[3]) out.push({ t: match[3], c: "num" });
1543
+ else if (match[4]) out.push({ t: match[4], c: "kw" });
1544
+ else if (match[5]) out.push({ t: match[5], c: "pun" });
1545
+ last = re.lastIndex;
1546
+ }
1547
+ if (last < line.length) out.push({ t: line.slice(last), c: "plain" });
1548
+ return out;
1549
+ }
1550
+ var COLOR = { plain: "#cdd0d8", key: "#7fd1c0", str: "#e0a96d", num: "#8fb3ff", kw: "#c98aff", pun: "#8a91a3" };
1551
+ function CodeBlock({ code = "", label, language = "json", showLineNumbers = true, copyable = true, style, ...rest }) {
1552
+ const [copied, setCopied] = useState(false);
1553
+ const lines = String(code).replace(/\n$/, "").split("\n");
1554
+ const copy = () => {
1555
+ try {
1556
+ navigator.clipboard?.writeText(code);
1557
+ } catch {
1558
+ }
1559
+ setCopied(true);
1560
+ setTimeout(() => setCopied(false), 1400);
1561
+ };
1562
+ return /* @__PURE__ */ jsxs("div", { ...rest, style: {
1563
+ background: "var(--dt-code-bg)",
1564
+ border: "1px solid var(--dt-code-border)",
1565
+ borderRadius: "var(--dt-radius-lg)",
1566
+ overflow: "hidden",
1567
+ ...style
1568
+ }, children: [
1569
+ label || copyable ? /* @__PURE__ */ jsxs("div", { style: {
1570
+ display: "flex",
1571
+ alignItems: "center",
1572
+ gap: 10,
1573
+ padding: "9px 12px",
1574
+ borderBottom: "1px solid var(--dt-code-border)"
1575
+ }, children: [
1576
+ /* @__PURE__ */ jsx("span", { style: { fontFamily: "var(--dt-font-mono)", fontSize: 11, color: "#8a91a3" }, children: label || language }),
1577
+ copyable ? /* @__PURE__ */ jsx(
1578
+ "button",
1579
+ {
1580
+ type: "button",
1581
+ onClick: copy,
1582
+ style: {
1583
+ marginLeft: "auto",
1584
+ display: "inline-flex",
1585
+ alignItems: "center",
1586
+ gap: 6,
1587
+ border: "none",
1588
+ background: "transparent",
1589
+ color: copied ? "#34d399" : "#8a91a3",
1590
+ cursor: "pointer",
1591
+ fontFamily: "var(--dt-font-mono)",
1592
+ fontSize: 11,
1593
+ fontWeight: 600,
1594
+ padding: 0
1595
+ },
1596
+ children: copied ? /* @__PURE__ */ jsxs(Fragment, { children: [
1597
+ /* @__PURE__ */ jsx("svg", { width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx("path", { d: "M20 6L9 17l-5-5", stroke: "currentColor", strokeWidth: "2.4", strokeLinecap: "round", strokeLinejoin: "round" }) }),
1598
+ "\uBCF5\uC0AC\uB428"
1599
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
1600
+ /* @__PURE__ */ jsxs("svg", { width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [
1601
+ /* @__PURE__ */ jsx("rect", { x: "9", y: "9", width: "11", height: "11", rx: "2", stroke: "currentColor", strokeWidth: "2" }),
1602
+ /* @__PURE__ */ jsx("path", { d: "M5 15V5a2 2 0 0 1 2-2h10", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round" })
1603
+ ] }),
1604
+ "\uBCF5\uC0AC"
1605
+ ] })
1606
+ }
1607
+ ) : null
1608
+ ] }) : null,
1609
+ /* @__PURE__ */ jsx("div", { style: { padding: "12px 0", overflowX: "auto" }, children: lines.map((line, index) => /* @__PURE__ */ jsxs("div", { style: { display: "grid", gridTemplateColumns: showLineNumbers ? "38px 1fr" : "1fr", fontFamily: "var(--dt-font-mono)", fontSize: 12.5, lineHeight: 1.75 }, children: [
1610
+ showLineNumbers ? /* @__PURE__ */ jsx("span", { style: { textAlign: "right", paddingRight: 14, color: "#5a6273", userSelect: "none" }, children: index + 1 }) : null,
1611
+ /* @__PURE__ */ jsx("code", { style: { color: COLOR.plain, whiteSpace: "pre", paddingRight: 14 }, children: highlight(line).map((segment, segmentIndex) => /* @__PURE__ */ jsx("span", { style: { color: COLOR[segment.c] }, children: segment.t }, segmentIndex)) })
1612
+ ] }, index)) })
1613
+ ] });
1614
+ }
1615
+ function KeyValue({ items = [], columns = 1, style, ...rest }) {
1616
+ return /* @__PURE__ */ jsx("dl", { ...rest, style: {
1617
+ margin: 0,
1618
+ display: "grid",
1619
+ gridTemplateColumns: columns === 2 ? "1fr 1fr" : "1fr",
1620
+ border: "1px solid var(--dt-border-strong)",
1621
+ borderRadius: "var(--dt-radius-lg)",
1622
+ overflow: "hidden",
1623
+ ...style
1624
+ }, children: items.map((item, index) => {
1625
+ const row = Math.floor(index / columns);
1626
+ const col = index % columns;
1627
+ const isLastRow = row === Math.floor((items.length - 1) / columns);
1628
+ return /* @__PURE__ */ jsxs(
1629
+ "div",
1630
+ {
1631
+ style: {
1632
+ display: "flex",
1633
+ alignItems: "baseline",
1634
+ justifyContent: "space-between",
1635
+ gap: 14,
1636
+ padding: "11px 14px",
1637
+ borderBottom: isLastRow ? "none" : "1px solid var(--dt-border)",
1638
+ borderRight: columns === 2 && col === 0 ? "1px solid var(--dt-border)" : "none"
1639
+ },
1640
+ children: [
1641
+ /* @__PURE__ */ jsx("dt", { style: { fontSize: 12.5, color: "var(--dt-muted)", flex: "0 0 auto" }, children: item.key }),
1642
+ /* @__PURE__ */ jsx("dd", { style: {
1643
+ margin: 0,
1644
+ textAlign: "right",
1645
+ minWidth: 0,
1646
+ fontFamily: item.mono ? "var(--dt-font-mono)" : "inherit",
1647
+ fontSize: item.mono ? 12.5 : 13,
1648
+ fontWeight: 600,
1649
+ color: item.accent ? "var(--dt-accent)" : "var(--dt-ink-strong)",
1650
+ fontVariantNumeric: "tabular-nums",
1651
+ overflow: "hidden",
1652
+ textOverflow: "ellipsis",
1653
+ whiteSpace: "nowrap"
1654
+ }, children: item.value })
1655
+ ]
1656
+ },
1657
+ index
1658
+ );
1659
+ }) });
1660
+ }
1661
+ var LEVEL = {
1662
+ ok: { dot: "var(--dt-success)", text: "var(--dt-success)", label: "OK" },
1663
+ warn: { dot: "var(--dt-warning)", text: "var(--dt-warning)", label: "WARN" },
1664
+ error: { dot: "var(--dt-danger)", text: "var(--dt-danger)", label: "ERR" },
1665
+ info: { dot: "var(--dt-muted)", text: "var(--dt-muted-strong)", label: "INFO" }
1666
+ };
1667
+ function LogRow({ entries = [], style, ...rest }) {
1668
+ return /* @__PURE__ */ jsx("div", { ...rest, style: {
1669
+ border: "1px solid var(--dt-border-strong)",
1670
+ borderRadius: "var(--dt-radius-lg)",
1671
+ overflow: "hidden",
1672
+ background: "var(--dt-surface)",
1673
+ fontVariantNumeric: "tabular-nums",
1674
+ ...style
1675
+ }, children: entries.map((entry, index) => {
1676
+ const level = LEVEL[entry.level] || LEVEL.info;
1677
+ return /* @__PURE__ */ jsxs(
1678
+ "div",
1679
+ {
1680
+ style: {
1681
+ display: "grid",
1682
+ gridTemplateColumns: "auto 14px 1fr auto",
1683
+ alignItems: "center",
1684
+ gap: 12,
1685
+ padding: "9px 14px",
1686
+ borderTop: index === 0 ? "none" : "1px solid var(--dt-border)",
1687
+ fontFamily: "var(--dt-font-mono)",
1688
+ fontSize: 12
1689
+ },
1690
+ children: [
1691
+ /* @__PURE__ */ jsx("span", { style: { color: "var(--dt-muted)" }, children: entry.time }),
1692
+ /* @__PURE__ */ jsx("span", { style: { width: 7, height: 7, borderRadius: 9999, background: level.dot, justifySelf: "center" } }),
1693
+ /* @__PURE__ */ jsxs("span", { style: { minWidth: 0, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: [
1694
+ /* @__PURE__ */ jsx("span", { style: { color: "var(--dt-ink-strong)", fontWeight: 600 }, children: entry.tool }),
1695
+ entry.message ? /* @__PURE__ */ jsxs("span", { style: { color: "var(--dt-muted-strong)" }, children: [
1696
+ " ",
1697
+ entry.message
1698
+ ] }) : null
1699
+ ] }),
1700
+ /* @__PURE__ */ jsx("span", { style: { color: entry.latency ? "var(--dt-muted-strong)" : level.text, fontWeight: 600 }, children: entry.latency || level.label })
1701
+ ]
1702
+ },
1703
+ index
1704
+ );
1705
+ }) });
1706
+ }
1707
+ function Pagination({ page = 1, pageCount = 1, onChange, style, ...rest }) {
1708
+ const go = (targetPage) => {
1709
+ if (targetPage >= 1 && targetPage <= pageCount && targetPage !== page) onChange?.(targetPage);
1710
+ };
1711
+ const pages = [];
1712
+ const add = (targetPage) => pages.push(targetPage);
1713
+ if (pageCount <= 7) {
1714
+ for (let i = 1; i <= pageCount; i += 1) add(i);
1715
+ } else {
1716
+ add(1);
1717
+ if (page > 3) add("\u2026");
1718
+ for (let i = Math.max(2, page - 1); i <= Math.min(pageCount - 1, page + 1); i += 1) add(i);
1719
+ if (page < pageCount - 2) add("\u2026");
1720
+ add(pageCount);
1721
+ }
1722
+ const cell = (active) => ({
1723
+ minWidth: 32,
1724
+ height: 32,
1725
+ padding: "0 8px",
1726
+ borderRadius: "var(--dt-radius-sm)",
1727
+ border: "none",
1728
+ cursor: "pointer",
1729
+ fontSize: 13,
1730
+ fontWeight: 600,
1731
+ fontVariantNumeric: "tabular-nums",
1732
+ background: active ? "var(--dt-accent)" : "transparent",
1733
+ color: active ? "var(--dt-accent-ink)" : "var(--dt-muted-strong)"
1734
+ });
1735
+ const arrow = (disabled) => ({ ...cell(false), opacity: disabled ? 0.4 : 1, cursor: disabled ? "not-allowed" : "pointer", display: "inline-flex", alignItems: "center", justifyContent: "center" });
1736
+ return /* @__PURE__ */ jsxs("nav", { ...rest, style: { display: "inline-flex", alignItems: "center", gap: 2, ...style }, "aria-label": "\uD398\uC774\uC9C0", children: [
1737
+ /* @__PURE__ */ jsx("button", { style: arrow(page <= 1), onClick: () => go(page - 1), disabled: page <= 1, "aria-label": "\uC774\uC804", children: /* @__PURE__ */ jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ jsx("path", { d: "M15 6l-6 6 6 6", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) }) }),
1738
+ pages.map((pageItem, index) => pageItem === "\u2026" ? /* @__PURE__ */ jsx("span", { style: { minWidth: 22, textAlign: "center", color: "var(--dt-muted)" }, children: "\u2026" }, `e${index}`) : /* @__PURE__ */ jsx("button", { style: cell(pageItem === page), onClick: () => go(pageItem), "aria-current": pageItem === page ? "page" : void 0, children: pageItem }, pageItem)),
1739
+ /* @__PURE__ */ jsx("button", { style: arrow(page >= pageCount), onClick: () => go(page + 1), disabled: page >= pageCount, "aria-label": "\uB2E4\uC74C", children: /* @__PURE__ */ jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ jsx("path", { d: "M9 6l6 6-6 6", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) }) })
1740
+ ] });
1741
+ }
1742
+ function StatTile({ label, value, delta, deltaTone = "neutral", hint, style, ...rest }) {
1743
+ const tone = { up: "var(--dt-success)", down: "var(--dt-danger)", neutral: "var(--dt-muted)" }[deltaTone];
1744
+ return /* @__PURE__ */ jsxs("div", { ...rest, style: { padding: 18, minWidth: 0, ...style }, children: [
1745
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 11, fontWeight: 650, letterSpacing: "0.04em", textTransform: "uppercase", color: "var(--dt-muted)" }, children: label }),
1746
+ /* @__PURE__ */ jsx("div", { style: { marginTop: 8, fontSize: 25, fontWeight: 700, lineHeight: 1.1, letterSpacing: "-0.02em", color: "var(--dt-ink-strong)", fontVariantNumeric: "tabular-nums" }, children: value }),
1747
+ delta || hint ? /* @__PURE__ */ jsxs("div", { style: { marginTop: 6, display: "flex", alignItems: "center", gap: 6, fontSize: 12, color: "var(--dt-muted)" }, children: [
1748
+ delta ? /* @__PURE__ */ jsx("span", { style: { color: tone, fontWeight: 600, fontVariantNumeric: "tabular-nums" }, children: delta }) : null,
1749
+ hint ? /* @__PURE__ */ jsx("span", { children: hint }) : null
1750
+ ] }) : null
1751
+ ] });
1752
+ }
1753
+ function Table({ columns = [], rows = [], rowKey, onRowClick, empty, style, ...rest }) {
1754
+ if (!rows.length && empty) return empty;
1755
+ return /* @__PURE__ */ jsxs("div", { ...rest, style: { overflowX: "auto", borderRadius: "var(--dt-radius-lg)", background: "var(--dt-surface)", boxShadow: "var(--dt-ring), var(--dt-shadow-xs)", ...style }, children: [
1756
+ /* @__PURE__ */ jsxs("table", { style: { width: "100%", borderCollapse: "collapse", color: "var(--dt-ink)" }, children: [
1757
+ /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsx("tr", { style: { background: "var(--dt-surface-muted)" }, children: columns.map((column) => /* @__PURE__ */ jsx("th", { style: {
1758
+ textAlign: column.align || "left",
1759
+ padding: "11px 18px",
1760
+ fontFamily: "var(--dt-font-mono)",
1761
+ fontSize: 11,
1762
+ fontWeight: 600,
1763
+ letterSpacing: "0.04em",
1764
+ textTransform: "uppercase",
1765
+ color: "var(--dt-muted)",
1766
+ borderBottom: "1px solid var(--dt-divider)",
1767
+ whiteSpace: "nowrap"
1768
+ }, children: column.header }, column.key)) }) }),
1769
+ /* @__PURE__ */ jsx("tbody", { children: rows.map((row, rowIndex) => /* @__PURE__ */ jsx(
1770
+ "tr",
1771
+ {
1772
+ onClick: onRowClick ? () => onRowClick(row) : void 0,
1773
+ className: "dt-tr",
1774
+ style: { cursor: onRowClick ? "pointer" : "default" },
1775
+ children: columns.map((column) => /* @__PURE__ */ jsx("td", { style: {
1776
+ textAlign: column.align || "left",
1777
+ padding: "13px 18px",
1778
+ fontSize: 13,
1779
+ borderBottom: "1px solid var(--dt-divider)",
1780
+ whiteSpace: column.nowrap ? "nowrap" : "normal"
1781
+ }, children: column.render ? column.render(row[column.key], row) : row[column.key] }, column.key))
1782
+ },
1783
+ rowKey ? rowKey(row, rowIndex) : rowIndex
1784
+ )) })
1785
+ ] }),
1786
+ /* @__PURE__ */ jsx("style", { children: `.dt-tr{transition:background-color 130ms}.dt-tr:hover{background:var(--dt-surface-muted)}tbody tr:last-child td{border-bottom:0}` })
1787
+ ] });
1788
+ }
1789
+ function UsageMeter({ label, value = 0, max = 100, unit = "", hint, style, ...rest }) {
1790
+ const pct = Math.min(100, Math.max(0, value / max * 100));
1791
+ const fill = pct >= 90 ? "var(--dt-danger)" : pct >= 75 ? "var(--dt-warning)" : "var(--dt-accent)";
1792
+ return /* @__PURE__ */ jsxs("div", { ...rest, style: { display: "grid", gap: 8, ...style }, children: [
1793
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "baseline", justifyContent: "space-between", gap: 12 }, children: [
1794
+ label ? /* @__PURE__ */ jsx("span", { style: { fontSize: 13, fontWeight: 600, color: "var(--dt-muted-strong)" }, children: label }) : /* @__PURE__ */ jsx("span", {}),
1795
+ /* @__PURE__ */ jsxs("span", { style: { fontFamily: "var(--dt-font-mono)", fontSize: 12.5, color: "var(--dt-ink-strong)", fontVariantNumeric: "tabular-nums" }, children: [
1796
+ /* @__PURE__ */ jsx("b", { style: { fontWeight: 700 }, children: value.toLocaleString() }),
1797
+ /* @__PURE__ */ jsxs("span", { style: { color: "var(--dt-muted)" }, children: [
1798
+ " / ",
1799
+ max.toLocaleString(),
1800
+ unit
1801
+ ] })
1802
+ ] })
1803
+ ] }),
1804
+ /* @__PURE__ */ jsx("div", { style: { position: "relative", height: 8, borderRadius: "var(--dt-radius-sm)", background: "var(--dt-surface-sunken)", boxShadow: "inset 0 0 0 1px var(--dt-border-strong)", overflow: "hidden" }, children: /* @__PURE__ */ jsx("div", { style: { position: "absolute", inset: 0, width: `${pct}%`, background: fill, borderRadius: "var(--dt-radius-sm)", transition: "width var(--dt-motion)" } }) }),
1805
+ hint ? /* @__PURE__ */ jsx("span", { style: { fontSize: 12, color: "var(--dt-muted)" }, children: hint }) : null
1806
+ ] });
1807
+ }
1808
+ function Breadcrumb({ items = [], style, ...rest }) {
1809
+ return /* @__PURE__ */ jsx(
1810
+ "nav",
1811
+ {
1812
+ ...rest,
1813
+ "aria-label": "breadcrumb",
1814
+ style: { display: "flex", alignItems: "center", gap: 6, flexWrap: "wrap", ...style },
1815
+ children: items.map((it, i) => {
1816
+ const last = i === items.length - 1;
1817
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [
1818
+ last ? /* @__PURE__ */ jsx("span", { "aria-current": "page", style: { fontSize: 13, fontWeight: 600, color: "var(--dt-ink-strong)" }, children: it.label }) : /* @__PURE__ */ jsx("a", { href: it.href || "#", style: { fontSize: 13, fontWeight: 500, color: "var(--dt-muted)", textDecoration: "none" }, children: it.label }),
1819
+ !last ? /* @__PURE__ */ jsx("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", style: { color: "var(--dt-border-strong)" }, "aria-hidden": "true", children: /* @__PURE__ */ jsx("path", { d: "M9 6l6 6-6 6", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) }) : null
1820
+ ] }, i);
1821
+ })
1822
+ }
1823
+ );
1824
+ }
1825
+ function CommandPalette({ open = true, query = "", onQueryChange, groups = [], footerHint = "\u2191\u2193 \uC774\uB3D9 \xB7 \u21B5 \uC2E4\uD589 \xB7 esc \uB2EB\uAE30", onSelect, style, ...rest }) {
1826
+ const [activeIndex, setActiveIndex] = useState([0, 0]);
1827
+ const [isOpen, setIsOpen] = useState(open);
1828
+ useEffect(() => {
1829
+ setIsOpen(open);
1830
+ }, [open]);
1831
+ if (!isOpen) return null;
1832
+ const handleKeyDown = (_e) => {
1833
+ if (_e.key === "ArrowDown") {
1834
+ _e.preventDefault();
1835
+ setActiveIndex((prev) => {
1836
+ const [groupIdx, itemIdx] = prev;
1837
+ const group = groups[groupIdx];
1838
+ if (!group) return prev;
1839
+ if (itemIdx < group.items.length - 1) return [groupIdx, itemIdx + 1];
1840
+ const nextGroupIdx = (groupIdx + 1) % groups.length;
1841
+ const nextGroup = groups[nextGroupIdx];
1842
+ if (nextGroup && nextGroup.items.length > 0) return [nextGroupIdx, 0];
1843
+ return prev;
1844
+ });
1845
+ } else if (_e.key === "ArrowUp") {
1846
+ _e.preventDefault();
1847
+ setActiveIndex((prev) => {
1848
+ const [groupIdx, itemIdx] = prev;
1849
+ if (itemIdx > 0) return [groupIdx, itemIdx - 1];
1850
+ const prevGroupIdx = (groupIdx - 1 + groups.length) % groups.length;
1851
+ const prevGroup = groups[prevGroupIdx];
1852
+ if (prevGroup && prevGroup.items.length > 0) return [prevGroupIdx, prevGroup.items.length - 1];
1853
+ return prev;
1854
+ });
1855
+ } else if (_e.key === "Enter") {
1856
+ _e.preventDefault();
1857
+ const [gi, ii] = activeIndex;
1858
+ const group = groups[gi];
1859
+ if (group && group.items[ii]) onSelect?.(group.items[ii]);
1860
+ } else if (_e.key === "Escape") {
1861
+ _e.preventDefault();
1862
+ setIsOpen(false);
1863
+ }
1864
+ };
1865
+ return /* @__PURE__ */ jsxs(
1866
+ "div",
1867
+ {
1868
+ ...rest,
1869
+ role: "listbox",
1870
+ onKeyDown: handleKeyDown,
1871
+ style: {
1872
+ width: 520,
1873
+ maxWidth: "100%",
1874
+ background: "var(--dt-surface)",
1875
+ border: "1px solid var(--dt-border-strong)",
1876
+ borderRadius: "var(--dt-radius-xl)",
1877
+ boxShadow: "var(--dt-shadow-xl)",
1878
+ overflow: "hidden",
1879
+ fontFamily: "var(--dt-font-sans)",
1880
+ ...style
1881
+ },
1882
+ children: [
1883
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: 11, padding: "14px 16px", borderBottom: "1px solid var(--dt-border)" }, children: [
1884
+ /* @__PURE__ */ jsxs("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", style: { color: "var(--dt-muted)", flex: "0 0 auto" }, children: [
1885
+ /* @__PURE__ */ jsx("circle", { cx: "11", cy: "11", r: "7", stroke: "currentColor", strokeWidth: "2" }),
1886
+ /* @__PURE__ */ jsx("path", { d: "M21 21l-4-4", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round" })
1887
+ ] }),
1888
+ /* @__PURE__ */ jsx(
1889
+ "input",
1890
+ {
1891
+ autoFocus: true,
1892
+ value: query,
1893
+ onChange: (e) => onQueryChange?.(e.target.value),
1894
+ placeholder: "\uB3C4\uAD6C \xB7 \uC561\uC158 \uAC80\uC0C9\u2026",
1895
+ style: { flex: 1, border: "none", outline: "none", background: "transparent", fontSize: 15, fontFamily: "inherit", color: "var(--dt-ink-strong)" }
1896
+ }
1897
+ ),
1898
+ /* @__PURE__ */ jsx("kbd", { style: {
1899
+ fontFamily: "var(--dt-font-mono)",
1900
+ fontSize: 11,
1901
+ fontWeight: 600,
1902
+ color: "var(--dt-muted)",
1903
+ border: "1px solid var(--dt-border-strong)",
1904
+ borderRadius: "var(--dt-radius-sm)",
1905
+ padding: "2px 7px"
1906
+ }, children: "\u2318K" })
1907
+ ] }),
1908
+ /* @__PURE__ */ jsx("div", { style: { maxHeight: 320, overflowY: "auto", padding: 6 }, children: groups.map((g, gi) => /* @__PURE__ */ jsxs("div", { style: { marginBottom: 4 }, children: [
1909
+ g.heading ? /* @__PURE__ */ jsx("div", { style: { fontFamily: "var(--dt-font-mono)", fontSize: 10, letterSpacing: ".1em", textTransform: "uppercase", color: "var(--dt-muted)", padding: "8px 10px 5px" }, children: g.heading }) : null,
1910
+ g.items.map((it, ii) => {
1911
+ const isActive = activeIndex[0] === gi && activeIndex[1] === ii;
1912
+ return /* @__PURE__ */ jsxs(
1913
+ "button",
1914
+ {
1915
+ type: "button",
1916
+ role: "option",
1917
+ "aria-selected": isActive,
1918
+ onMouseDown: (e) => {
1919
+ e.preventDefault();
1920
+ onSelect?.(it);
1921
+ },
1922
+ style: {
1923
+ display: "flex",
1924
+ alignItems: "center",
1925
+ gap: 11,
1926
+ padding: "9px 10px",
1927
+ borderRadius: "var(--dt-radius-md)",
1928
+ cursor: "pointer",
1929
+ background: isActive ? "var(--dt-tint-accent)" : "transparent",
1930
+ border: "none",
1931
+ outline: "none"
1932
+ },
1933
+ children: [
1934
+ it.icon ? /* @__PURE__ */ jsx("span", { style: { display: "inline-flex", flex: "0 0 auto", color: isActive ? "var(--dt-accent)" : "var(--dt-muted)" }, "aria-hidden": "true", children: it.icon }) : null,
1935
+ /* @__PURE__ */ jsxs("span", { style: { flex: 1, minWidth: 0, fontSize: 13.5, fontWeight: isActive ? 600 : 500, color: isActive ? "var(--dt-accent)" : "var(--dt-ink-strong)", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: [
1936
+ it.label,
1937
+ it.meta ? /* @__PURE__ */ jsx("span", { style: { fontFamily: "var(--dt-font-mono)", fontSize: 11, color: "var(--dt-muted)", fontWeight: 400, marginLeft: 8 }, children: it.meta }) : null
1938
+ ] }),
1939
+ it.shortcut ? /* @__PURE__ */ jsx("kbd", { style: { fontFamily: "var(--dt-font-mono)", fontSize: 11, color: "var(--dt-muted-strong)", border: "1px solid var(--dt-border-strong)", borderRadius: "var(--dt-radius-sm)", padding: "1px 6px" }, children: it.shortcut }) : null
1940
+ ]
1941
+ },
1942
+ ii
1943
+ );
1944
+ })
1945
+ ] }, gi)) }),
1946
+ footerHint ? /* @__PURE__ */ jsx("div", { style: { borderTop: "1px solid var(--dt-border)", padding: "8px 14px", fontFamily: "var(--dt-font-mono)", fontSize: 11, color: "var(--dt-muted)" }, children: footerHint }) : null
1947
+ ]
1948
+ }
1949
+ );
1950
+ }
1951
+ function Menu({ trigger, items = [], align = "left", width = 200, style, ...rest }) {
1952
+ const [open, setOpen] = useState(false);
1953
+ const ref = useRef(null);
1954
+ useEffect(() => {
1955
+ if (!open) return void 0;
1956
+ const onDoc = (e) => {
1957
+ if (ref.current && !ref.current.contains(e.target)) setOpen(false);
1958
+ };
1959
+ window.addEventListener("mousedown", onDoc);
1960
+ return () => window.removeEventListener("mousedown", onDoc);
1961
+ }, [open]);
1962
+ const handleTriggerKeyDown = (e) => {
1963
+ if (e.key === "Enter" || e.key === " ") {
1964
+ e.preventDefault();
1965
+ setOpen((v) => !v);
1966
+ } else if (e.key === "ArrowDown") {
1967
+ e.preventDefault();
1968
+ const firstItem = ref.current?.querySelector('button[role="menuitem"]');
1969
+ firstItem?.focus();
1970
+ }
1971
+ };
1972
+ const handleItemClick = (item) => {
1973
+ if (item.onClick) {
1974
+ item.onClick();
1975
+ setOpen(false);
1976
+ }
1977
+ };
1978
+ const handleTriggerClick = () => {
1979
+ setOpen((v) => !v);
1980
+ };
1981
+ return /* @__PURE__ */ jsxs("span", { ...rest, ref, style: { position: "relative", display: "inline-flex", ...style }, children: [
1982
+ /* @__PURE__ */ jsx(
1983
+ "button",
1984
+ {
1985
+ type: "button",
1986
+ onClick: handleTriggerClick,
1987
+ onKeyDown: handleTriggerKeyDown,
1988
+ "aria-expanded": open,
1989
+ "aria-haspopup": "menu",
1990
+ style: { display: "inline-flex", cursor: "pointer", border: "none", background: "transparent", padding: 0, fontSize: "inherit", fontFamily: "inherit" },
1991
+ children: trigger
1992
+ }
1993
+ ),
1994
+ open ? /* @__PURE__ */ jsxs("div", { role: "menu", "aria-orientation": "vertical", style: {
1995
+ position: "absolute",
1996
+ top: "100%",
1997
+ [align]: 0,
1998
+ marginTop: 6,
1999
+ zIndex: 80,
2000
+ width,
2001
+ padding: 5,
2002
+ background: "var(--dt-surface)",
2003
+ borderRadius: "var(--dt-radius-md)",
2004
+ boxShadow: "var(--dt-shadow-lg)",
2005
+ animation: "dt-menu 130ms var(--dt-ease)"
2006
+ }, children: [
2007
+ items.map((it, i) => it.divider ? /* @__PURE__ */ jsx("div", { style: { height: 1, background: "var(--dt-border)", margin: "5px 0" } }, `d${i}`) : /* @__PURE__ */ jsxs(
2008
+ "button",
2009
+ {
2010
+ role: "menuitem",
2011
+ onClick: () => handleItemClick(it),
2012
+ style: {
2013
+ display: "flex",
2014
+ alignItems: "center",
2015
+ gap: 9,
2016
+ width: "100%",
2017
+ textAlign: "left",
2018
+ padding: "8px 10px",
2019
+ border: "none",
2020
+ borderRadius: "var(--dt-radius-sm)",
2021
+ cursor: "pointer",
2022
+ background: "transparent",
2023
+ fontSize: 13.5,
2024
+ fontWeight: 500,
2025
+ fontFamily: "inherit",
2026
+ color: it.danger ? "var(--dt-danger)" : "var(--dt-ink)"
2027
+ },
2028
+ onMouseEnter: (e) => {
2029
+ e.currentTarget.style.background = it.danger ? "var(--dt-tint-danger)" : "var(--dt-surface-sunken)";
2030
+ },
2031
+ onMouseLeave: (e) => {
2032
+ e.currentTarget.style.background = "transparent";
2033
+ },
2034
+ children: [
2035
+ it.icon ? /* @__PURE__ */ jsx("span", { style: { display: "inline-flex", color: it.danger ? "var(--dt-danger)" : "var(--dt-muted-strong)" }, children: it.icon }) : null,
2036
+ it.label
2037
+ ]
2038
+ },
2039
+ i
2040
+ )),
2041
+ /* @__PURE__ */ jsx("style", { children: `@keyframes dt-menu{from{opacity:0;transform:translateY(-4px)}}` })
2042
+ ] }) : null
2043
+ ] });
2044
+ }
2045
+ function Sidebar({ brand, sections = [], footer, width = 232, style, ...rest }) {
2046
+ return /* @__PURE__ */ jsxs(
2047
+ "nav",
2048
+ {
2049
+ ...rest,
2050
+ style: {
2051
+ width,
2052
+ display: "flex",
2053
+ flexDirection: "column",
2054
+ background: "var(--dt-surface)",
2055
+ borderRight: "1px solid var(--dt-border-strong)",
2056
+ fontFamily: "var(--dt-font-sans)",
2057
+ ...style
2058
+ },
2059
+ children: [
2060
+ brand ? /* @__PURE__ */ jsx("div", { style: { padding: "16px 18px", borderBottom: "1px solid var(--dt-border)" }, children: brand }) : null,
2061
+ /* @__PURE__ */ jsx("div", { style: { flex: 1, overflowY: "auto", padding: "12px 10px", display: "grid", gap: 16, alignContent: "start" }, children: sections.map((sec, si) => /* @__PURE__ */ jsxs("div", { style: { display: "grid", gap: 2 }, children: [
2062
+ sec.heading ? /* @__PURE__ */ jsx("div", { style: { fontFamily: "var(--dt-font-mono)", fontSize: 10, letterSpacing: ".1em", textTransform: "uppercase", color: "var(--dt-muted)", padding: "4px 10px 6px" }, children: sec.heading }) : null,
2063
+ sec.items.map((it, ii) => /* @__PURE__ */ jsxs(
2064
+ "a",
2065
+ {
2066
+ href: it.href || "#",
2067
+ "aria-current": it.active ? "page" : void 0,
2068
+ style: {
2069
+ position: "relative",
2070
+ display: "flex",
2071
+ alignItems: "center",
2072
+ gap: 11,
2073
+ padding: "8px 10px 8px 12px",
2074
+ borderRadius: "var(--dt-radius-md)",
2075
+ textDecoration: "none",
2076
+ fontSize: 13.5,
2077
+ fontWeight: it.active ? 600 : 500,
2078
+ color: it.active ? "var(--dt-accent)" : "var(--dt-muted-strong)",
2079
+ background: it.active ? "var(--dt-tint-accent)" : "transparent"
2080
+ },
2081
+ children: [
2082
+ it.active ? /* @__PURE__ */ jsx("span", { style: { position: "absolute", left: 0, top: 7, bottom: 7, width: 3, borderRadius: 2, background: "var(--dt-accent)" } }) : null,
2083
+ it.icon ? /* @__PURE__ */ jsx("span", { style: { display: "inline-flex", flex: "0 0 auto", color: it.active ? "var(--dt-accent)" : "var(--dt-muted)" }, "aria-hidden": "true", children: it.icon }) : null,
2084
+ /* @__PURE__ */ jsx("span", { style: { flex: 1, minWidth: 0, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: it.label }),
2085
+ it.badge != null ? /* @__PURE__ */ jsx("span", { style: { fontFamily: "var(--dt-font-mono)", fontSize: 11, color: it.active ? "var(--dt-accent)" : "var(--dt-muted)", fontVariantNumeric: "tabular-nums" }, children: it.badge }) : null
2086
+ ]
2087
+ },
2088
+ ii
2089
+ ))
2090
+ ] }, si)) }),
2091
+ footer ? /* @__PURE__ */ jsx("div", { style: { padding: "12px 16px", borderTop: "1px solid var(--dt-border)" }, children: footer }) : null
2092
+ ]
2093
+ }
2094
+ );
2095
+ }
2096
+ function Stepper({ steps = [], current = 0, orientation = "horizontal", style, ...rest }) {
2097
+ const vertical = orientation === "vertical";
2098
+ return /* @__PURE__ */ jsx(
2099
+ "div",
2100
+ {
2101
+ ...rest,
2102
+ style: {
2103
+ display: "flex",
2104
+ flexDirection: vertical ? "column" : "row",
2105
+ alignItems: vertical ? "stretch" : "flex-start",
2106
+ gap: 0,
2107
+ ...style
2108
+ },
2109
+ children: steps.map((s, i) => {
2110
+ const done = i < current, active = i === current;
2111
+ const accent = done || active;
2112
+ return /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: vertical ? "row" : "column", alignItems: vertical ? "flex-start" : "stretch", flex: vertical ? "none" : 1, minWidth: 0, gap: vertical ? 12 : 0 }, children: [
2113
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: vertical ? "column" : "row", alignItems: "center", gap: vertical ? 6 : 10, ...vertical ? {} : { width: "100%" } }, children: [
2114
+ /* @__PURE__ */ jsx("span", { style: {
2115
+ flex: "0 0 auto",
2116
+ width: 26,
2117
+ height: 26,
2118
+ display: "grid",
2119
+ placeItems: "center",
2120
+ borderRadius: "var(--dt-radius-sm)",
2121
+ fontFamily: "var(--dt-font-mono)",
2122
+ fontSize: 12,
2123
+ fontWeight: 700,
2124
+ background: done ? "var(--dt-accent)" : active ? "var(--dt-tint-accent)" : "var(--dt-surface-sunken)",
2125
+ color: done ? "#fff" : active ? "var(--dt-accent)" : "var(--dt-muted)",
2126
+ boxShadow: active ? "inset 0 0 0 1.5px var(--dt-accent)" : done ? "none" : "inset 0 0 0 1px var(--dt-border-strong)"
2127
+ }, children: done ? /* @__PURE__ */ jsx("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx("path", { d: "M20 6L9 17l-5-5", stroke: "currentColor", strokeWidth: "2.6", strokeLinecap: "round", strokeLinejoin: "round" }) }) : i + 1 }),
2128
+ i < steps.length - 1 ? /* @__PURE__ */ jsx("span", { style: {
2129
+ background: done ? "var(--dt-accent)" : "var(--dt-border-strong)",
2130
+ ...vertical ? { width: 2, minHeight: 22, flex: 1, marginTop: 2 } : { height: 2, flex: 1 }
2131
+ } }) : null
2132
+ ] }),
2133
+ /* @__PURE__ */ jsxs("div", { style: { padding: vertical ? "2px 0 16px" : "10px 14px 0 0" }, children: [
2134
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 13.5, fontWeight: accent ? 650 : 500, color: accent ? "var(--dt-ink-strong)" : "var(--dt-muted)" }, children: s.label }),
2135
+ s.description ? /* @__PURE__ */ jsx("div", { style: { fontSize: 12, color: "var(--dt-muted)", marginTop: 3, lineHeight: 1.45 }, children: s.description }) : null
2136
+ ] })
2137
+ ] }, i);
2138
+ })
2139
+ }
2140
+ );
2141
+ }
2142
+ var BRAND_LOGO_LANGUAGE = {
2143
+ Korean: "ko",
2144
+ English: "en"
2145
+ };
2146
+ var BRAND_LOGO_SIZE = {
2147
+ sm: 20,
2148
+ md: 28,
2149
+ lg: 56,
2150
+ xl: 76
2151
+ };
2152
+ var BRAND_WORDMARK = "Bridger";
2153
+ var BRAND_LOGO_LABEL = {
2154
+ [BRAND_LOGO_LANGUAGE.Korean]: "\uBE0C\uB9BF\uC800",
2155
+ [BRAND_LOGO_LANGUAGE.English]: BRAND_WORDMARK
2156
+ };
2157
+ function playMark(setArmed) {
2158
+ const scheduleFrame = typeof requestAnimationFrame === "function" ? requestAnimationFrame : (callback) => setTimeout(callback, 0);
2159
+ setArmed(false);
2160
+ scheduleFrame(
2161
+ () => scheduleFrame(() => setArmed(true))
2162
+ );
2163
+ }
2164
+ var BrandLogo = forwardRef(function BrandLogo2({
2165
+ size = "md",
2166
+ autoplay = false,
2167
+ loop = false,
2168
+ lang = BRAND_LOGO_LANGUAGE.Korean,
2169
+ style
2170
+ }, ref) {
2171
+ const fontSize = typeof size === "number" ? size : BRAND_LOGO_SIZE[size] ?? BRAND_LOGO_SIZE.md;
2172
+ const [armed, setArmed] = useState(false);
2173
+ useImperativeHandle(
2174
+ ref,
2175
+ () => ({
2176
+ play() {
2177
+ playMark(setArmed);
2178
+ }
2179
+ }),
2180
+ []
2181
+ );
2182
+ useEffect(() => {
2183
+ if (!autoplay) return;
2184
+ const timeout = setTimeout(() => playMark(setArmed), 200);
2185
+ return () => clearTimeout(timeout);
2186
+ }, [autoplay]);
2187
+ useEffect(() => {
2188
+ if (!loop) return;
2189
+ let alive = true;
2190
+ const interval = setInterval(() => {
2191
+ if (!alive) return;
2192
+ playMark((value) => {
2193
+ if (alive) setArmed(value);
2194
+ });
2195
+ }, 7e3);
2196
+ return () => {
2197
+ alive = false;
2198
+ clearInterval(interval);
2199
+ };
2200
+ }, [loop]);
2201
+ return /* @__PURE__ */ jsxs(
2202
+ "span",
2203
+ {
2204
+ "aria-label": BRAND_LOGO_LABEL[lang],
2205
+ style: {
2206
+ display: "inline-flex",
2207
+ alignItems: "center",
2208
+ gap: "0.38em",
2209
+ fontFamily: "var(--dt-font-sans)",
2210
+ fontWeight: 760,
2211
+ fontSize,
2212
+ letterSpacing: 0,
2213
+ lineHeight: 1,
2214
+ color: "var(--dt-ink-strong)",
2215
+ userSelect: "none",
2216
+ ...style
2217
+ },
2218
+ children: [
2219
+ /* @__PURE__ */ jsxs(
2220
+ "svg",
2221
+ {
2222
+ width: "2.306em",
2223
+ height: "1.24em",
2224
+ viewBox: "0 0 44 24",
2225
+ "aria-hidden": "true",
2226
+ focusable: "false",
2227
+ style: { flex: "0 0 auto", overflow: "visible" },
2228
+ children: [
2229
+ /* @__PURE__ */ jsx(
2230
+ "path",
2231
+ {
2232
+ d: "M4 8H18C24 8 25 4 31 4H40",
2233
+ fill: "none",
2234
+ stroke: "color-mix(in srgb, var(--dt-ink-strong) 24%, transparent)",
2235
+ strokeLinecap: "round",
2236
+ strokeLinejoin: "round",
2237
+ strokeWidth: "3"
2238
+ }
2239
+ ),
2240
+ /* @__PURE__ */ jsx(
2241
+ "path",
2242
+ {
2243
+ d: "M4 16H18C24 16 25 20 31 20H40",
2244
+ fill: "none",
2245
+ stroke: "color-mix(in srgb, var(--dt-ink-strong) 24%, transparent)",
2246
+ strokeLinecap: "round",
2247
+ strokeLinejoin: "round",
2248
+ strokeWidth: "3"
2249
+ }
2250
+ ),
2251
+ /* @__PURE__ */ jsx(
2252
+ "path",
2253
+ {
2254
+ className: "dt-brand-logo-line",
2255
+ d: "M4 8H18C24 8 25 4 31 4H40",
2256
+ fill: "none",
2257
+ stroke: "var(--dt-accent)",
2258
+ strokeDasharray: "42",
2259
+ strokeDashoffset: armed ? 0 : 0,
2260
+ strokeLinecap: "round",
2261
+ strokeLinejoin: "round",
2262
+ strokeWidth: "3.2",
2263
+ style: armed ? { animation: "dt-brand-logo-line-draw 420ms cubic-bezier(.2, .7, .2, 1) both" } : void 0
2264
+ }
2265
+ ),
2266
+ /* @__PURE__ */ jsx(
2267
+ "path",
2268
+ {
2269
+ className: "dt-brand-logo-line",
2270
+ d: "M4 16H18C24 16 25 20 31 20H40",
2271
+ fill: "none",
2272
+ stroke: "var(--dt-accent)",
2273
+ strokeDasharray: "42",
2274
+ strokeDashoffset: armed ? 0 : 0,
2275
+ strokeLinecap: "round",
2276
+ strokeLinejoin: "round",
2277
+ strokeWidth: "3.2",
2278
+ style: armed ? { animation: "dt-brand-logo-line-draw 420ms cubic-bezier(.2, .7, .2, 1) both" } : void 0
2279
+ }
2280
+ )
2281
+ ]
2282
+ }
2283
+ ),
2284
+ /* @__PURE__ */ jsx("span", { children: BRAND_WORDMARK }),
2285
+ /* @__PURE__ */ jsx("style", { children: "@keyframes dt-brand-logo-line-draw{from{opacity:.45;stroke-dashoffset:42}to{opacity:1;stroke-dashoffset:0}}@media (prefers-reduced-motion: reduce){.dt-brand-logo-line{animation:none!important}}" })
2286
+ ]
2287
+ }
2288
+ );
2289
+ });
2290
+ var PRODUCT_ACTION_PILL_VARIANT = {
2291
+ Default: "default",
2292
+ Accent: "accent",
2293
+ Outline: "outline"
2294
+ };
2295
+ var PRODUCT_ACTION_PILL_SIZE = {
2296
+ Compact: "compact",
2297
+ Figma: "figma"
2298
+ };
2299
+ var VARIANT_CLASS2 = {
2300
+ [PRODUCT_ACTION_PILL_VARIANT.Default]: "dt-product-action-pill-default",
2301
+ [PRODUCT_ACTION_PILL_VARIANT.Accent]: "dt-product-action-pill-accent",
2302
+ [PRODUCT_ACTION_PILL_VARIANT.Outline]: "dt-product-action-pill-outline"
2303
+ };
2304
+ var SIZE_CLASS = {
2305
+ [PRODUCT_ACTION_PILL_SIZE.Compact]: "dt-product-action-pill-compact",
2306
+ [PRODUCT_ACTION_PILL_SIZE.Figma]: "dt-product-action-pill-figma"
2307
+ };
2308
+ function productActionPillClassName({
2309
+ variant = PRODUCT_ACTION_PILL_VARIANT.Default,
2310
+ size = PRODUCT_ACTION_PILL_SIZE.Compact,
2311
+ className
2312
+ } = {}) {
2313
+ return cx("dt-product-action-pill", VARIANT_CLASS2[variant], SIZE_CLASS[size], className);
2314
+ }
2315
+ function ProductActionPill({
2316
+ as,
2317
+ variant = PRODUCT_ACTION_PILL_VARIANT.Default,
2318
+ size = PRODUCT_ACTION_PILL_SIZE.Compact,
2319
+ leadingIcon,
2320
+ trailingIcon,
2321
+ children,
2322
+ className,
2323
+ ...rest
2324
+ }) {
2325
+ const Component = as ?? "a";
2326
+ return /* @__PURE__ */ jsxs(Component, { className: productActionPillClassName({ variant, size, className }), ...rest, children: [
2327
+ leadingIcon ? /* @__PURE__ */ jsx("span", { className: "dt-product-action-pill-icon", children: leadingIcon }) : null,
2328
+ children ? /* @__PURE__ */ jsx("span", { className: "dt-product-action-pill-label", children }) : null,
2329
+ trailingIcon ? /* @__PURE__ */ jsx("span", { className: "dt-product-action-pill-icon", children: trailingIcon }) : null
2330
+ ] });
2331
+ }
2332
+ var PRODUCT_SHELL_TONE = {
2333
+ Cinematic: "cinematic",
2334
+ Console: "console"
2335
+ };
2336
+ var SHELL_TONE_CLASS = {
2337
+ [PRODUCT_SHELL_TONE.Cinematic]: "dt-product-shell-cinematic",
2338
+ [PRODUCT_SHELL_TONE.Console]: "dt-product-shell-console"
2339
+ };
2340
+ function ProductShell({ tone = PRODUCT_SHELL_TONE.Cinematic, className, children, ...rest }) {
2341
+ return /* @__PURE__ */ jsx("div", { className: cx("dt-product-shell", SHELL_TONE_CLASS[tone], className), ...rest, children });
2342
+ }
2343
+ function ProductCinematicBackdrop({
2344
+ animated = true,
2345
+ className,
2346
+ ...rest
2347
+ }) {
2348
+ return /* @__PURE__ */ jsxs(
2349
+ "div",
2350
+ {
2351
+ className: cx("dt-product-cinematic-backdrop", animated && "dt-product-cinematic-backdrop-animated", className),
2352
+ "aria-hidden": "true",
2353
+ ...rest,
2354
+ children: [
2355
+ /* @__PURE__ */ jsx("div", { className: "dt-product-cinematic-wash" }),
2356
+ /* @__PURE__ */ jsxs("svg", { className: "dt-product-cinematic-lines", viewBox: "0 0 1440 720", preserveAspectRatio: "xMidYMid slice", children: [
2357
+ /* @__PURE__ */ jsx("path", { className: "dt-product-cinematic-track", d: "M-60 248 H520 C690 248 710 168 884 168 H1500" }),
2358
+ /* @__PURE__ */ jsx("path", { className: "dt-product-cinematic-track", d: "M-60 430 H510 C660 430 692 542 872 542 H1500" }),
2359
+ /* @__PURE__ */ jsx("path", { className: "dt-product-cinematic-track", d: "M-60 338 H610 C748 338 770 326 930 326 H1500" }),
2360
+ /* @__PURE__ */ jsx("path", { className: "dt-product-cinematic-flow dt-product-cinematic-flow-a", d: "M-60 248 H520 C690 248 710 168 884 168 H1500" }),
2361
+ /* @__PURE__ */ jsx("path", { className: "dt-product-cinematic-flow dt-product-cinematic-flow-b", d: "M-60 430 H510 C660 430 692 542 872 542 H1500" }),
2362
+ /* @__PURE__ */ jsx("path", { className: "dt-product-cinematic-flow dt-product-cinematic-flow-c", d: "M-60 338 H610 C748 338 770 326 930 326 H1500" })
2363
+ ] })
2364
+ ]
2365
+ }
2366
+ );
2367
+ }
2368
+ function ProductMotionField({
2369
+ gridSrc,
2370
+ label = "Live API routing motion",
2371
+ className,
2372
+ ...rest
2373
+ }) {
2374
+ return /* @__PURE__ */ jsxs("div", { className: cx("dt-product-motion-field", className), "aria-label": label, ...rest, children: [
2375
+ gridSrc ? /* @__PURE__ */ jsx("img", { className: "dt-product-motion-grid", src: gridSrc, alt: "", "aria-hidden": "true", loading: "lazy" }) : null,
2376
+ /* @__PURE__ */ jsx("span", { className: "dt-product-motion-orbit dt-product-motion-orbit-a", "aria-hidden": "true", children: /* @__PURE__ */ jsx("span", { className: "dt-product-motion-node" }) }),
2377
+ /* @__PURE__ */ jsx("span", { className: "dt-product-motion-orbit dt-product-motion-orbit-b", "aria-hidden": "true", children: /* @__PURE__ */ jsx("span", { className: "dt-product-motion-node" }) }),
2378
+ /* @__PURE__ */ jsx("span", { className: "dt-product-motion-axis", "aria-hidden": "true" }),
2379
+ /* @__PURE__ */ jsx("span", { className: "dt-product-motion-copy", children: "API" })
2380
+ ] });
2381
+ }
2382
+ function ProductSideRail({ items, label, className, ...rest }) {
2383
+ return /* @__PURE__ */ jsx("aside", { className: cx("dt-product-side-rail", className), "aria-label": label, ...rest, children: items.map((item) => /* @__PURE__ */ jsx("a", { href: item.href, children: item.label }, item.key)) });
2384
+ }
2385
+ function ProductPageHeader({
2386
+ eyebrow,
2387
+ title,
2388
+ description,
2389
+ actions,
2390
+ children,
2391
+ className,
2392
+ ...rest
2393
+ }) {
2394
+ return /* @__PURE__ */ jsxs("header", { className: cx("dt-product-page-header", className), ...rest, children: [
2395
+ /* @__PURE__ */ jsxs("div", { className: "dt-product-page-header-row", children: [
2396
+ /* @__PURE__ */ jsxs("div", { className: "dt-product-page-header-copy", children: [
2397
+ eyebrow ? /* @__PURE__ */ jsx("span", { className: "dt-product-page-header-eyebrow", children: eyebrow }) : null,
2398
+ /* @__PURE__ */ jsxs("div", { className: "dt-product-page-header-text", children: [
2399
+ /* @__PURE__ */ jsx("h1", { children: title }),
2400
+ description ? /* @__PURE__ */ jsx("p", { children: description }) : null
2401
+ ] })
2402
+ ] }),
2403
+ actions ? /* @__PURE__ */ jsx("div", { className: "dt-product-page-header-actions", children: actions }) : null
2404
+ ] }),
2405
+ children ? /* @__PURE__ */ jsx("div", { className: "dt-product-page-header-content", children }) : null
2406
+ ] });
2407
+ }
2408
+ function SectionCard({
2409
+ eyebrow,
2410
+ title,
2411
+ description,
2412
+ action,
2413
+ children,
2414
+ contentClassName,
2415
+ style,
2416
+ ...rest
2417
+ }) {
2418
+ const hasHeader = Boolean(eyebrow || title || description || action);
2419
+ return /* @__PURE__ */ jsxs(
2420
+ "section",
2421
+ {
2422
+ ...rest,
2423
+ style: {
2424
+ borderRadius: "var(--dt-radius-lg)",
2425
+ background: "var(--dt-surface)",
2426
+ boxShadow: "var(--dt-ring), var(--dt-shadow-xs)",
2427
+ padding: "var(--dt-space-4)",
2428
+ ...style
2429
+ },
2430
+ children: [
2431
+ hasHeader ? /* @__PURE__ */ jsxs(
2432
+ "header",
2433
+ {
2434
+ style: {
2435
+ display: "flex",
2436
+ alignItems: "flex-start",
2437
+ justifyContent: "space-between",
2438
+ gap: "var(--dt-space-3)",
2439
+ marginBottom: children ? "var(--dt-space-3)" : 0
2440
+ },
2441
+ children: [
2442
+ /* @__PURE__ */ jsxs("div", { style: { minWidth: 0 }, children: [
2443
+ eyebrow ? /* @__PURE__ */ jsx(
2444
+ "p",
2445
+ {
2446
+ style: {
2447
+ marginBottom: 6,
2448
+ fontSize: 12,
2449
+ fontWeight: 650,
2450
+ textTransform: "uppercase",
2451
+ color: "var(--dt-muted)"
2452
+ },
2453
+ children: eyebrow
2454
+ }
2455
+ ) : null,
2456
+ title ? /* @__PURE__ */ jsx("h3", { style: { fontSize: 18, fontWeight: 650, letterSpacing: "-0.01em", color: "var(--dt-ink-strong)" }, children: title }) : null,
2457
+ description ? /* @__PURE__ */ jsx("p", { style: { marginTop: 6, fontSize: 13, lineHeight: 1.55, color: "var(--dt-muted-strong)", maxWidth: 560 }, children: description }) : null
2458
+ ] }),
2459
+ action ? /* @__PURE__ */ jsx("div", { style: { flex: "0 0 auto" }, children: action }) : null
2460
+ ]
2461
+ }
2462
+ ) : null,
2463
+ /* @__PURE__ */ jsx("div", { className: cx(contentClassName), children })
2464
+ ]
2465
+ }
2466
+ );
2467
+ }
2468
+ var STATE_COLOR = {
2469
+ available: "var(--dt-success)",
2470
+ managed: "var(--dt-success)",
2471
+ locked: "var(--dt-warning)"
2472
+ };
2473
+ function ToolCard({
2474
+ name,
2475
+ method = "GET",
2476
+ category,
2477
+ description = "\uC124\uBA85 \uC5C6\uC74C",
2478
+ path = "/",
2479
+ state = "available",
2480
+ stateLabel,
2481
+ style,
2482
+ ...rest
2483
+ }) {
2484
+ const cat = category ?? (name ? name.split("_")[0] : "etc");
2485
+ const labels = { available: "\uC0AC\uC6A9 \uAC00\uB2A5", managed: "\uAD00\uB9AC\uD615 \uD0A4", locked: "\uD0A4 \uB4F1\uB85D" };
2486
+ return /* @__PURE__ */ jsxs(
2487
+ "article",
2488
+ {
2489
+ className: "dt-tool-card",
2490
+ ...rest,
2491
+ style: {
2492
+ borderRadius: "var(--dt-radius-md)",
2493
+ background: "var(--dt-surface)",
2494
+ boxShadow: "var(--dt-ring), var(--dt-shadow-xs)",
2495
+ padding: "16px 18px",
2496
+ transition: "box-shadow var(--dt-motion), background-color var(--dt-motion)",
2497
+ ...style
2498
+ },
2499
+ children: [
2500
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "flex-start", justifyContent: "space-between", gap: 12 }, children: [
2501
+ /* @__PURE__ */ jsxs("div", { style: { minWidth: 0 }, children: [
2502
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexWrap: "wrap", gap: 8 }, children: [
2503
+ /* @__PURE__ */ jsx("span", { className: "dt-chip dt-chip-muted", children: cat }),
2504
+ /* @__PURE__ */ jsx("span", { className: "dt-chip dt-chip-accent", children: method })
2505
+ ] }),
2506
+ /* @__PURE__ */ jsx("h4", { style: { marginTop: 11, fontSize: 15, fontWeight: 650, letterSpacing: "-0.01em", color: "var(--dt-ink-strong)", wordBreak: "break-all" }, children: name })
2507
+ ] }),
2508
+ /* @__PURE__ */ jsxs("span", { style: { display: "inline-flex", alignItems: "center", gap: 6, flex: "0 0 auto", fontSize: 12, fontWeight: 600, color: STATE_COLOR[state] }, children: [
2509
+ /* @__PURE__ */ jsx("span", { style: { width: 6, height: 6, borderRadius: "9999px", background: STATE_COLOR[state] } }),
2510
+ stateLabel ?? labels[state]
2511
+ ] })
2512
+ ] }),
2513
+ /* @__PURE__ */ jsx("p", { style: {
2514
+ marginTop: 12,
2515
+ fontSize: 13,
2516
+ lineHeight: 1.5,
2517
+ color: "var(--dt-muted-strong)",
2518
+ display: "-webkit-box",
2519
+ WebkitLineClamp: 2,
2520
+ WebkitBoxOrient: "vertical",
2521
+ overflow: "hidden"
2522
+ }, children: description }),
2523
+ /* @__PURE__ */ jsx("div", { style: { marginTop: 14, paddingTop: 13, borderTop: "1px solid var(--dt-divider)", display: "flex", alignItems: "center", justifyContent: "space-between", gap: 12 }, children: /* @__PURE__ */ jsx("code", { style: { fontFamily: "var(--dt-font-mono)", fontSize: 12, color: "var(--dt-muted)", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, children: path }) }),
2524
+ /* @__PURE__ */ jsx("style", { children: ".dt-tool-card:hover{box-shadow:var(--dt-ring), var(--dt-shadow-md)}.dt-chip{font-family:var(--dt-font-mono);font-size:11px;font-weight:600;letter-spacing:.02em;padding:3px 8px;border-radius:var(--dt-radius-sm);background:var(--dt-surface-sunken)}.dt-chip-muted{color:var(--dt-muted-strong)}.dt-chip-accent{color:var(--dt-accent)" })
2525
+ ]
2526
+ }
2527
+ );
2528
+ }
2529
+
2530
+ export { Alert, AlertMotion, AlertTone, Avatar, BRAND_LOGO_LANGUAGE, Badge, BrandLogo, Breadcrumb, Button, Card, CardTone, Checkbox, CodeBlock, Combobox, CommandPalette, Dialog, Drawer, EmptyState, FileUpload, FilterChip, Input, KeyValue, LogRow, Menu, MetricAccent, PRODUCT_ACTION_PILL_SIZE, PRODUCT_ACTION_PILL_VARIANT, PRODUCT_SHELL_TONE, Pagination, Panel, ProductActionPill, ProductCinematicBackdrop, ProductMotionField, ProductPageHeader, ProductShell, ProductSideRail, RadioGroup, SectionCard, SegmentedControl, Select, Sidebar, Skeleton, Slider, Spinner, StatTile, StatusPill, Stepper, SurfaceTone, Switch, Table, Tabs, Textarea, Toast, ToggleSwitch, ToolCard, Tooltip, UsageMeter, cx, metricAccentColor, productActionPillClassName };
2531
+ //# sourceMappingURL=index.mjs.map
2532
+ //# sourceMappingURL=index.mjs.map