@bridger-kr/react 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. package/README.md +62 -0
  2. package/dist/components/core/Badge.cjs +36 -0
  3. package/dist/components/core/Badge.cjs.map +1 -0
  4. package/dist/components/core/Badge.d.cts +18 -0
  5. package/dist/components/core/Badge.d.ts +18 -0
  6. package/dist/components/core/Badge.mjs +34 -0
  7. package/dist/components/core/Badge.mjs.map +1 -0
  8. package/dist/components/core/Button.cjs +57 -0
  9. package/dist/components/core/Button.cjs.map +1 -0
  10. package/dist/components/core/Button.d.cts +26 -0
  11. package/dist/components/core/Button.d.ts +26 -0
  12. package/dist/components/core/Button.mjs +55 -0
  13. package/dist/components/core/Button.mjs.map +1 -0
  14. package/dist/components/core/Card.cjs +57 -0
  15. package/dist/components/core/Card.cjs.map +1 -0
  16. package/dist/components/core/Card.d.cts +27 -0
  17. package/dist/components/core/Card.d.ts +27 -0
  18. package/dist/components/core/Card.mjs +54 -0
  19. package/dist/components/core/Card.mjs.map +1 -0
  20. package/dist/components/core/FilterChip.cjs +54 -0
  21. package/dist/components/core/FilterChip.cjs.map +1 -0
  22. package/dist/components/core/FilterChip.d.cts +23 -0
  23. package/dist/components/core/FilterChip.d.ts +23 -0
  24. package/dist/components/core/FilterChip.mjs +52 -0
  25. package/dist/components/core/FilterChip.mjs.map +1 -0
  26. package/dist/components/core/Input.cjs +67 -0
  27. package/dist/components/core/Input.cjs.map +1 -0
  28. package/dist/components/core/Input.d.cts +20 -0
  29. package/dist/components/core/Input.d.ts +20 -0
  30. package/dist/components/core/Input.mjs +65 -0
  31. package/dist/components/core/Input.mjs.map +1 -0
  32. package/dist/components/core/StatusPill.cjs +57 -0
  33. package/dist/components/core/StatusPill.cjs.map +1 -0
  34. package/dist/components/core/StatusPill.d.cts +19 -0
  35. package/dist/components/core/StatusPill.d.ts +19 -0
  36. package/dist/components/core/StatusPill.mjs +55 -0
  37. package/dist/components/core/StatusPill.mjs.map +1 -0
  38. package/dist/components/core/Surface.cjs +52 -0
  39. package/dist/components/core/Surface.cjs.map +1 -0
  40. package/dist/components/core/Surface.d.cts +24 -0
  41. package/dist/components/core/Surface.d.ts +24 -0
  42. package/dist/components/core/Surface.mjs +47 -0
  43. package/dist/components/core/Surface.mjs.map +1 -0
  44. package/dist/components/core/Tabs.cjs +64 -0
  45. package/dist/components/core/Tabs.cjs.map +1 -0
  46. package/dist/components/core/Tabs.d.cts +24 -0
  47. package/dist/components/core/Tabs.d.ts +24 -0
  48. package/dist/components/core/Tabs.mjs +62 -0
  49. package/dist/components/core/Tabs.mjs.map +1 -0
  50. package/dist/components/data/Avatar.cjs +40 -0
  51. package/dist/components/data/Avatar.cjs.map +1 -0
  52. package/dist/components/data/Avatar.d.cts +24 -0
  53. package/dist/components/data/Avatar.d.ts +24 -0
  54. package/dist/components/data/Avatar.mjs +38 -0
  55. package/dist/components/data/Avatar.mjs.map +1 -0
  56. package/dist/components/data/CodeBlock.cjs +92 -0
  57. package/dist/components/data/CodeBlock.cjs.map +1 -0
  58. package/dist/components/data/CodeBlock.d.cts +20 -0
  59. package/dist/components/data/CodeBlock.d.ts +20 -0
  60. package/dist/components/data/CodeBlock.mjs +90 -0
  61. package/dist/components/data/CodeBlock.mjs.map +1 -0
  62. package/dist/components/data/KeyValue.cjs +55 -0
  63. package/dist/components/data/KeyValue.cjs.map +1 -0
  64. package/dist/components/data/KeyValue.d.cts +24 -0
  65. package/dist/components/data/KeyValue.d.ts +24 -0
  66. package/dist/components/data/KeyValue.mjs +53 -0
  67. package/dist/components/data/KeyValue.mjs.map +1 -0
  68. package/dist/components/data/LogRow.cjs +55 -0
  69. package/dist/components/data/LogRow.cjs.map +1 -0
  70. package/dist/components/data/LogRow.d.cts +23 -0
  71. package/dist/components/data/LogRow.d.ts +23 -0
  72. package/dist/components/data/LogRow.mjs +53 -0
  73. package/dist/components/data/LogRow.mjs.map +1 -0
  74. package/dist/components/data/Pagination.cjs +44 -0
  75. package/dist/components/data/Pagination.cjs.map +1 -0
  76. package/dist/components/data/Pagination.d.cts +13 -0
  77. package/dist/components/data/Pagination.d.ts +13 -0
  78. package/dist/components/data/Pagination.mjs +42 -0
  79. package/dist/components/data/Pagination.mjs.map +1 -0
  80. package/dist/components/data/StatTile.cjs +20 -0
  81. package/dist/components/data/StatTile.cjs.map +1 -0
  82. package/dist/components/data/StatTile.d.cts +19 -0
  83. package/dist/components/data/StatTile.d.ts +19 -0
  84. package/dist/components/data/StatTile.mjs +18 -0
  85. package/dist/components/data/StatTile.mjs.map +1 -0
  86. package/dist/components/data/Table.cjs +45 -0
  87. package/dist/components/data/Table.cjs.map +1 -0
  88. package/dist/components/data/Table.d.cts +27 -0
  89. package/dist/components/data/Table.d.ts +27 -0
  90. package/dist/components/data/Table.mjs +43 -0
  91. package/dist/components/data/Table.mjs.map +1 -0
  92. package/dist/components/data/UsageMeter.cjs +28 -0
  93. package/dist/components/data/UsageMeter.cjs.map +1 -0
  94. package/dist/components/data/UsageMeter.d.cts +19 -0
  95. package/dist/components/data/UsageMeter.d.ts +19 -0
  96. package/dist/components/data/UsageMeter.mjs +26 -0
  97. package/dist/components/data/UsageMeter.mjs.map +1 -0
  98. package/dist/components/feedback/Alert.cjs +78 -0
  99. package/dist/components/feedback/Alert.cjs.map +1 -0
  100. package/dist/components/feedback/Alert.d.cts +29 -0
  101. package/dist/components/feedback/Alert.d.ts +29 -0
  102. package/dist/components/feedback/Alert.mjs +74 -0
  103. package/dist/components/feedback/Alert.mjs.map +1 -0
  104. package/dist/components/feedback/Dialog.cjs +62 -0
  105. package/dist/components/feedback/Dialog.cjs.map +1 -0
  106. package/dist/components/feedback/Dialog.d.cts +17 -0
  107. package/dist/components/feedback/Dialog.d.ts +17 -0
  108. package/dist/components/feedback/Dialog.mjs +60 -0
  109. package/dist/components/feedback/Dialog.mjs.map +1 -0
  110. package/dist/components/feedback/Drawer.cjs +58 -0
  111. package/dist/components/feedback/Drawer.cjs.map +1 -0
  112. package/dist/components/feedback/Drawer.d.cts +22 -0
  113. package/dist/components/feedback/Drawer.d.ts +22 -0
  114. package/dist/components/feedback/Drawer.mjs +56 -0
  115. package/dist/components/feedback/Drawer.mjs.map +1 -0
  116. package/dist/components/feedback/EmptyState.cjs +36 -0
  117. package/dist/components/feedback/EmptyState.cjs.map +1 -0
  118. package/dist/components/feedback/EmptyState.d.cts +14 -0
  119. package/dist/components/feedback/EmptyState.d.ts +14 -0
  120. package/dist/components/feedback/EmptyState.mjs +34 -0
  121. package/dist/components/feedback/EmptyState.mjs.map +1 -0
  122. package/dist/components/feedback/Skeleton.cjs +19 -0
  123. package/dist/components/feedback/Skeleton.cjs.map +1 -0
  124. package/dist/components/feedback/Skeleton.d.cts +12 -0
  125. package/dist/components/feedback/Skeleton.d.ts +12 -0
  126. package/dist/components/feedback/Skeleton.mjs +17 -0
  127. package/dist/components/feedback/Skeleton.mjs.map +1 -0
  128. package/dist/components/feedback/Spinner.cjs +17 -0
  129. package/dist/components/feedback/Spinner.cjs.map +1 -0
  130. package/dist/components/feedback/Spinner.d.cts +12 -0
  131. package/dist/components/feedback/Spinner.d.ts +12 -0
  132. package/dist/components/feedback/Spinner.mjs +15 -0
  133. package/dist/components/feedback/Spinner.mjs.map +1 -0
  134. package/dist/components/feedback/Toast.cjs +32 -0
  135. package/dist/components/feedback/Toast.cjs.map +1 -0
  136. package/dist/components/feedback/Toast.d.cts +20 -0
  137. package/dist/components/feedback/Toast.d.ts +20 -0
  138. package/dist/components/feedback/Toast.mjs +30 -0
  139. package/dist/components/feedback/Toast.mjs.map +1 -0
  140. package/dist/components/feedback/Tooltip.cjs +51 -0
  141. package/dist/components/feedback/Tooltip.cjs.map +1 -0
  142. package/dist/components/feedback/Tooltip.d.cts +11 -0
  143. package/dist/components/feedback/Tooltip.d.ts +11 -0
  144. package/dist/components/feedback/Tooltip.mjs +49 -0
  145. package/dist/components/feedback/Tooltip.mjs.map +1 -0
  146. package/dist/components/forms/Checkbox.cjs +74 -0
  147. package/dist/components/forms/Checkbox.cjs.map +1 -0
  148. package/dist/components/forms/Checkbox.d.cts +16 -0
  149. package/dist/components/forms/Checkbox.d.ts +16 -0
  150. package/dist/components/forms/Checkbox.mjs +72 -0
  151. package/dist/components/forms/Checkbox.mjs.map +1 -0
  152. package/dist/components/forms/Combobox.cjs +217 -0
  153. package/dist/components/forms/Combobox.cjs.map +1 -0
  154. package/dist/components/forms/Combobox.d.cts +27 -0
  155. package/dist/components/forms/Combobox.d.ts +27 -0
  156. package/dist/components/forms/Combobox.mjs +215 -0
  157. package/dist/components/forms/Combobox.mjs.map +1 -0
  158. package/dist/components/forms/FileUpload.cjs +187 -0
  159. package/dist/components/forms/FileUpload.cjs.map +1 -0
  160. package/dist/components/forms/FileUpload.d.cts +26 -0
  161. package/dist/components/forms/FileUpload.d.ts +26 -0
  162. package/dist/components/forms/FileUpload.mjs +185 -0
  163. package/dist/components/forms/FileUpload.mjs.map +1 -0
  164. package/dist/components/forms/RadioGroup.cjs +73 -0
  165. package/dist/components/forms/RadioGroup.cjs.map +1 -0
  166. package/dist/components/forms/RadioGroup.d.cts +21 -0
  167. package/dist/components/forms/RadioGroup.d.ts +21 -0
  168. package/dist/components/forms/RadioGroup.mjs +71 -0
  169. package/dist/components/forms/RadioGroup.mjs.map +1 -0
  170. package/dist/components/forms/SegmentedControl.cjs +67 -0
  171. package/dist/components/forms/SegmentedControl.cjs.map +1 -0
  172. package/dist/components/forms/SegmentedControl.d.cts +19 -0
  173. package/dist/components/forms/SegmentedControl.d.ts +19 -0
  174. package/dist/components/forms/SegmentedControl.mjs +65 -0
  175. package/dist/components/forms/SegmentedControl.mjs.map +1 -0
  176. package/dist/components/forms/Select.cjs +67 -0
  177. package/dist/components/forms/Select.cjs.map +1 -0
  178. package/dist/components/forms/Select.d.cts +23 -0
  179. package/dist/components/forms/Select.d.ts +23 -0
  180. package/dist/components/forms/Select.mjs +65 -0
  181. package/dist/components/forms/Select.mjs.map +1 -0
  182. package/dist/components/forms/Slider.cjs +129 -0
  183. package/dist/components/forms/Slider.cjs.map +1 -0
  184. package/dist/components/forms/Slider.d.cts +24 -0
  185. package/dist/components/forms/Slider.d.ts +24 -0
  186. package/dist/components/forms/Slider.mjs +127 -0
  187. package/dist/components/forms/Slider.mjs.map +1 -0
  188. package/dist/components/forms/Switch.cjs +101 -0
  189. package/dist/components/forms/Switch.cjs.map +1 -0
  190. package/dist/components/forms/Switch.d.cts +24 -0
  191. package/dist/components/forms/Switch.d.ts +24 -0
  192. package/dist/components/forms/Switch.mjs +98 -0
  193. package/dist/components/forms/Switch.mjs.map +1 -0
  194. package/dist/components/forms/Textarea.cjs +35 -0
  195. package/dist/components/forms/Textarea.cjs.map +1 -0
  196. package/dist/components/forms/Textarea.d.cts +15 -0
  197. package/dist/components/forms/Textarea.d.ts +15 -0
  198. package/dist/components/forms/Textarea.mjs +33 -0
  199. package/dist/components/forms/Textarea.mjs.map +1 -0
  200. package/dist/components/navigation/Breadcrumb.cjs +27 -0
  201. package/dist/components/navigation/Breadcrumb.cjs.map +1 -0
  202. package/dist/components/navigation/Breadcrumb.d.cts +15 -0
  203. package/dist/components/navigation/Breadcrumb.d.ts +15 -0
  204. package/dist/components/navigation/Breadcrumb.mjs +25 -0
  205. package/dist/components/navigation/Breadcrumb.mjs.map +1 -0
  206. package/dist/components/navigation/CommandPalette.cjs +136 -0
  207. package/dist/components/navigation/CommandPalette.cjs.map +1 -0
  208. package/dist/components/navigation/CommandPalette.d.cts +26 -0
  209. package/dist/components/navigation/CommandPalette.d.ts +26 -0
  210. package/dist/components/navigation/CommandPalette.mjs +134 -0
  211. package/dist/components/navigation/CommandPalette.mjs.map +1 -0
  212. package/dist/components/navigation/Menu.cjs +104 -0
  213. package/dist/components/navigation/Menu.cjs.map +1 -0
  214. package/dist/components/navigation/Menu.d.cts +20 -0
  215. package/dist/components/navigation/Menu.d.ts +20 -0
  216. package/dist/components/navigation/Menu.mjs +102 -0
  217. package/dist/components/navigation/Menu.mjs.map +1 -0
  218. package/dist/components/navigation/Sidebar.cjs +60 -0
  219. package/dist/components/navigation/Sidebar.cjs.map +1 -0
  220. package/dist/components/navigation/Sidebar.d.cts +30 -0
  221. package/dist/components/navigation/Sidebar.d.ts +30 -0
  222. package/dist/components/navigation/Sidebar.mjs +58 -0
  223. package/dist/components/navigation/Sidebar.mjs.map +1 -0
  224. package/dist/components/navigation/Stepper.cjs +55 -0
  225. package/dist/components/navigation/Stepper.cjs.map +1 -0
  226. package/dist/components/navigation/Stepper.d.cts +21 -0
  227. package/dist/components/navigation/Stepper.d.ts +21 -0
  228. package/dist/components/navigation/Stepper.mjs +53 -0
  229. package/dist/components/navigation/Stepper.mjs.map +1 -0
  230. package/dist/components/product/BrandLogo.cjs +159 -0
  231. package/dist/components/product/BrandLogo.cjs.map +1 -0
  232. package/dist/components/product/BrandLogo.d.cts +28 -0
  233. package/dist/components/product/BrandLogo.d.ts +28 -0
  234. package/dist/components/product/BrandLogo.mjs +156 -0
  235. package/dist/components/product/BrandLogo.mjs.map +1 -0
  236. package/dist/components/product/ProductActionPill.cjs +57 -0
  237. package/dist/components/product/ProductActionPill.cjs.map +1 -0
  238. package/dist/components/product/ProductActionPill.d.cts +31 -0
  239. package/dist/components/product/ProductActionPill.d.ts +31 -0
  240. package/dist/components/product/ProductActionPill.mjs +52 -0
  241. package/dist/components/product/ProductActionPill.mjs.map +1 -0
  242. package/dist/components/product/ProductCinematic.cjs +69 -0
  243. package/dist/components/product/ProductCinematic.cjs.map +1 -0
  244. package/dist/components/product/ProductCinematic.d.cts +33 -0
  245. package/dist/components/product/ProductCinematic.d.ts +33 -0
  246. package/dist/components/product/ProductCinematic.mjs +63 -0
  247. package/dist/components/product/ProductCinematic.mjs.map +1 -0
  248. package/dist/components/product/ProductPageHeader.cjs +35 -0
  249. package/dist/components/product/ProductPageHeader.cjs.map +1 -0
  250. package/dist/components/product/ProductPageHeader.d.cts +13 -0
  251. package/dist/components/product/ProductPageHeader.d.ts +13 -0
  252. package/dist/components/product/ProductPageHeader.mjs +33 -0
  253. package/dist/components/product/ProductPageHeader.mjs.map +1 -0
  254. package/dist/components/product/SectionCard.cjs +72 -0
  255. package/dist/components/product/SectionCard.cjs.map +1 -0
  256. package/dist/components/product/SectionCard.d.cts +20 -0
  257. package/dist/components/product/SectionCard.d.ts +20 -0
  258. package/dist/components/product/SectionCard.mjs +70 -0
  259. package/dist/components/product/SectionCard.mjs.map +1 -0
  260. package/dist/components/product/ToolCard.cjs +70 -0
  261. package/dist/components/product/ToolCard.cjs.map +1 -0
  262. package/dist/components/product/ToolCard.d.cts +22 -0
  263. package/dist/components/product/ToolCard.d.ts +22 -0
  264. package/dist/components/product/ToolCard.mjs +68 -0
  265. package/dist/components/product/ToolCard.mjs.map +1 -0
  266. package/dist/index.cjs +2593 -0
  267. package/dist/index.cjs.map +1 -0
  268. package/dist/index.d.cts +49 -0
  269. package/dist/index.d.ts +49 -0
  270. package/dist/index.mjs +2532 -0
  271. package/dist/index.mjs.map +1 -0
  272. package/dist/styles.css +463 -0
  273. package/package.json +50 -0
@@ -0,0 +1,18 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+
3
+ // src/components/data/StatTile.tsx
4
+ function StatTile({ label, value, delta, deltaTone = "neutral", hint, style, ...rest }) {
5
+ const tone = { up: "var(--dt-success)", down: "var(--dt-danger)", neutral: "var(--dt-muted)" }[deltaTone];
6
+ return /* @__PURE__ */ jsxs("div", { ...rest, style: { padding: 18, minWidth: 0, ...style }, children: [
7
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 11, fontWeight: 650, letterSpacing: "0.04em", textTransform: "uppercase", color: "var(--dt-muted)" }, children: label }),
8
+ /* @__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 }),
9
+ delta || hint ? /* @__PURE__ */ jsxs("div", { style: { marginTop: 6, display: "flex", alignItems: "center", gap: 6, fontSize: 12, color: "var(--dt-muted)" }, children: [
10
+ delta ? /* @__PURE__ */ jsx("span", { style: { color: tone, fontWeight: 600, fontVariantNumeric: "tabular-nums" }, children: delta }) : null,
11
+ hint ? /* @__PURE__ */ jsx("span", { children: hint }) : null
12
+ ] }) : null
13
+ ] });
14
+ }
15
+
16
+ export { StatTile };
17
+ //# sourceMappingURL=StatTile.mjs.map
18
+ //# sourceMappingURL=StatTile.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/data/StatTile.tsx"],"names":[],"mappings":";;;AAgBO,SAAS,QAAA,CAAS,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,SAAA,GAAY,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,GAAG,IAAA,EAAK,EAAkB;AAC5G,EAAA,MAAM,IAAA,GAAO,EAAE,EAAA,EAAI,mBAAA,EAAqB,MAAM,kBAAA,EAAoB,OAAA,EAAS,iBAAA,EAAkB,CAAE,SAAS,CAAA;AAExG,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAK,GAAG,IAAA,EAAM,KAAA,EAAO,EAAE,OAAA,EAAS,EAAA,EAAI,QAAA,EAAU,CAAA,EAAG,GAAG,KAAA,EAAM,EACzD,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,IAAI,UAAA,EAAY,GAAA,EAAK,aAAA,EAAe,QAAA,EAAU,aAAA,EAAe,WAAA,EAAa,KAAA,EAAO,iBAAA,IAAsB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,wBACpI,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAA,EAAW,CAAA,EAAG,UAAU,EAAA,EAAI,UAAA,EAAY,KAAK,UAAA,EAAY,GAAA,EAAK,eAAe,SAAA,EAAW,KAAA,EAAO,wBAAwB,kBAAA,EAAoB,cAAA,IAAmB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IAChL,SAAS,IAAA,mBACT,IAAA,CAAC,SAAI,KAAA,EAAO,EAAE,WAAW,CAAA,EAAG,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,UAAU,GAAA,EAAK,CAAA,EAAG,UAAU,EAAA,EAAI,KAAA,EAAO,mBAAkB,EAC/G,QAAA,EAAA;AAAA,MAAA,KAAA,mBAAQ,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,IAAA,EAAM,UAAA,EAAY,GAAA,EAAK,kBAAA,EAAoB,cAAA,EAAe,EAAI,QAAA,EAAA,KAAA,EAAM,CAAA,GAAU,IAAA;AAAA,MAC5G,IAAA,mBAAO,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,IAAA,EAAK,CAAA,GAAU;AAAA,KAAA,EAChC,CAAA,GACE;AAAA,GAAA,EACN,CAAA;AAEJ","file":"StatTile.mjs","sourcesContent":["import type { CSSProperties, HTMLAttributes, ReactNode } from 'react';\n\nexport interface StatTileProps extends Omit<HTMLAttributes<HTMLDivElement>, 'style'> {\n label: ReactNode;\n value: ReactNode;\n /** e.g. \"+8.4%\". */\n delta?: ReactNode;\n deltaTone?: 'up' | 'down' | 'neutral';\n hint?: ReactNode;\n style?: CSSProperties;\n}\n\n/**\n * Metric tile — uppercase label, large tabular value, optional delta.\n * The console's KPI unit. Compose several inside a bordered stat row.\n */\nexport function StatTile({ label, value, delta, deltaTone = 'neutral', hint, style, ...rest }: StatTileProps) {\n const tone = { up: 'var(--dt-success)', down: 'var(--dt-danger)', neutral: 'var(--dt-muted)' }[deltaTone];\n\n return (\n <div {...rest} style={{ padding: 18, minWidth: 0, ...style }}>\n <div style={{ fontSize: 11, fontWeight: 650, letterSpacing: '0.04em', textTransform: 'uppercase', color: 'var(--dt-muted)' }}>{label}</div>\n <div style={{ marginTop: 8, fontSize: 25, fontWeight: 700, lineHeight: 1.1, letterSpacing: '-0.02em', color: 'var(--dt-ink-strong)', fontVariantNumeric: 'tabular-nums' }}>{value}</div>\n {(delta || hint) ? (\n <div style={{ marginTop: 6, display: 'flex', alignItems: 'center', gap: 6, fontSize: 12, color: 'var(--dt-muted)' }}>\n {delta ? <span style={{ color: tone, fontWeight: 600, fontVariantNumeric: 'tabular-nums' }}>{delta}</span> : null}\n {hint ? <span>{hint}</span> : null}\n </div>\n ) : null}\n </div>\n );\n}\n"]}
@@ -0,0 +1,45 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+
5
+ // src/components/data/Table.tsx
6
+ function Table({ columns = [], rows = [], rowKey, onRowClick, empty, style, ...rest }) {
7
+ if (!rows.length && empty) return empty;
8
+ return /* @__PURE__ */ jsxRuntime.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: [
9
+ /* @__PURE__ */ jsxRuntime.jsxs("table", { style: { width: "100%", borderCollapse: "collapse", color: "var(--dt-ink)" }, children: [
10
+ /* @__PURE__ */ jsxRuntime.jsx("thead", { children: /* @__PURE__ */ jsxRuntime.jsx("tr", { style: { background: "var(--dt-surface-muted)" }, children: columns.map((column) => /* @__PURE__ */ jsxRuntime.jsx("th", { style: {
11
+ textAlign: column.align || "left",
12
+ padding: "11px 18px",
13
+ fontFamily: "var(--dt-font-mono)",
14
+ fontSize: 11,
15
+ fontWeight: 600,
16
+ letterSpacing: "0.04em",
17
+ textTransform: "uppercase",
18
+ color: "var(--dt-muted)",
19
+ borderBottom: "1px solid var(--dt-divider)",
20
+ whiteSpace: "nowrap"
21
+ }, children: column.header }, column.key)) }) }),
22
+ /* @__PURE__ */ jsxRuntime.jsx("tbody", { children: rows.map((row, rowIndex) => /* @__PURE__ */ jsxRuntime.jsx(
23
+ "tr",
24
+ {
25
+ onClick: onRowClick ? () => onRowClick(row) : void 0,
26
+ className: "dt-tr",
27
+ style: { cursor: onRowClick ? "pointer" : "default" },
28
+ children: columns.map((column) => /* @__PURE__ */ jsxRuntime.jsx("td", { style: {
29
+ textAlign: column.align || "left",
30
+ padding: "13px 18px",
31
+ fontSize: 13,
32
+ borderBottom: "1px solid var(--dt-divider)",
33
+ whiteSpace: column.nowrap ? "nowrap" : "normal"
34
+ }, children: column.render ? column.render(row[column.key], row) : row[column.key] }, column.key))
35
+ },
36
+ rowKey ? rowKey(row, rowIndex) : rowIndex
37
+ )) })
38
+ ] }),
39
+ /* @__PURE__ */ jsxRuntime.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}` })
40
+ ] });
41
+ }
42
+
43
+ exports.Table = Table;
44
+ //# sourceMappingURL=Table.cjs.map
45
+ //# sourceMappingURL=Table.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/data/Table.tsx"],"names":["jsxs","jsx"],"mappings":";;;;;AA0BO,SAAS,KAAA,CAAuC,EAAE,OAAA,GAAU,IAAI,IAAA,GAAO,EAAC,EAAG,MAAA,EAAQ,UAAA,EAAY,KAAA,EAAO,KAAA,EAAO,GAAG,MAAK,EAAoB;AAC9I,EAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,KAAA,EAAO,OAAO,KAAA;AAElC,EAAA,uCACG,KAAA,EAAA,EAAK,GAAG,IAAA,EAAM,KAAA,EAAO,EAAE,SAAA,EAAW,MAAA,EAAQ,YAAA,EAAc,qBAAA,EAAuB,YAAY,mBAAA,EAAqB,SAAA,EAAW,qCAAA,EAAuC,GAAG,OAAM,EAC1K,QAAA,EAAA;AAAA,oBAAAA,eAAA,CAAC,OAAA,EAAA,EAAM,OAAO,EAAE,KAAA,EAAO,QAAQ,cAAA,EAAgB,UAAA,EAAY,KAAA,EAAO,eAAA,EAAgB,EAChF,QAAA,EAAA;AAAA,sBAAAC,cAAA,CAAC,OAAA,EAAA,EACC,QAAA,kBAAAA,cAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,UAAA,EAAY,yBAAA,EAA0B,EAChD,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZA,cAAA,CAAC,QAAoB,KAAA,EAAO;AAAA,QAC1B,SAAA,EAAW,OAAO,KAAA,IAAS,MAAA;AAAA,QAAQ,OAAA,EAAS,WAAA;AAAA,QAC5C,UAAA,EAAY,qBAAA;AAAA,QAAuB,QAAA,EAAU,EAAA;AAAA,QAAI,UAAA,EAAY,GAAA;AAAA,QAC7D,aAAA,EAAe,QAAA;AAAA,QAAU,aAAA,EAAe,WAAA;AAAA,QAAa,KAAA,EAAO,iBAAA;AAAA,QAC5D,YAAA,EAAc,6BAAA;AAAA,QAA+B,UAAA,EAAY;AAAA,SACvD,QAAA,EAAA,MAAA,CAAO,MAAA,EAAA,EALF,OAAO,GAKE,CACnB,GACH,CAAA,EACF,CAAA;AAAA,qCACC,OAAA,EAAA,EACE,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,KAAK,QAAA,qBACdA,cAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,UAAA,GAAa,MAAM,UAAA,CAAW,GAAG,CAAA,GAAI,MAAA;AAAA,UAC9C,SAAA,EAAU,OAAA;AAAA,UACV,KAAA,EAAO,EAAE,MAAA,EAAQ,UAAA,GAAa,YAAY,SAAA,EAAU;AAAA,UACnD,kBAAQ,GAAA,CAAI,CAAC,MAAA,qBACZA,cAAA,CAAC,QAAoB,KAAA,EAAO;AAAA,YAC1B,SAAA,EAAW,OAAO,KAAA,IAAS,MAAA;AAAA,YAAQ,OAAA,EAAS,WAAA;AAAA,YAAa,QAAA,EAAU,EAAA;AAAA,YACnE,YAAA,EAAc,6BAAA;AAAA,YAA+B,UAAA,EAAY,MAAA,CAAO,MAAA,GAAS,QAAA,GAAW;AAAA,aAClF,QAAA,EAAA,MAAA,CAAO,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,IAAI,MAAA,CAAO,GAAG,CAAA,EAAG,GAAG,IAAI,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,EAAA,EAH/D,MAAA,CAAO,GAG0D,CAC3E;AAAA,SAAA;AAAA,QATM,MAAA,GAAS,MAAA,CAAO,GAAA,EAAK,QAAQ,CAAA,GAAI;AAAA,OAW3C,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,oBACAA,cAAA,CAAC,WAAO,QAAA,EAAA,CAAA,gIAAA,CAAA,EAAmI;AAAA,GAAA,EAC7I,CAAA;AAEJ","file":"Table.cjs","sourcesContent":["import type { CSSProperties, HTMLAttributes, ReactNode } from 'react';\n\nexport type TableAlign = 'left' | 'center' | 'right';\nexport type TableRow = Record<string, ReactNode>;\n\nexport interface TableColumn<Row extends TableRow = TableRow> {\n key: Extract<keyof Row, string>;\n header: ReactNode;\n align?: TableAlign;\n nowrap?: boolean;\n render?: (value: Row[Extract<keyof Row, string>], row: Row) => ReactNode;\n}\n\nexport interface TableProps<Row extends TableRow = TableRow> extends Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'style'> {\n columns?: Array<TableColumn<Row>>;\n rows?: Row[];\n rowKey?: (row: Row, index: number) => string | number;\n onRowClick?: (row: Row) => void;\n empty?: ReactNode;\n style?: CSSProperties;\n}\n\n/**\n * Data table — scannable, dense, hairline-divided. Columns define header,\n * alignment, and an optional cell renderer. Built for comparison, not decoration.\n */\nexport function Table<Row extends TableRow = TableRow>({ columns = [], rows = [], rowKey, onRowClick, empty, style, ...rest }: TableProps<Row>) {\n if (!rows.length && empty) return empty;\n\n return (\n <div {...rest} style={{ overflowX: 'auto', borderRadius: 'var(--dt-radius-lg)', background: 'var(--dt-surface)', boxShadow: 'var(--dt-ring), var(--dt-shadow-xs)', ...style }}>\n <table style={{ width: '100%', borderCollapse: 'collapse', color: 'var(--dt-ink)' }}>\n <thead>\n <tr style={{ background: 'var(--dt-surface-muted)' }}>\n {columns.map((column) => (\n <th key={column.key} style={{\n textAlign: column.align || 'left', padding: '11px 18px',\n fontFamily: 'var(--dt-font-mono)', fontSize: 11, fontWeight: 600,\n letterSpacing: '0.04em', textTransform: 'uppercase', color: 'var(--dt-muted)',\n borderBottom: '1px solid var(--dt-divider)', whiteSpace: 'nowrap',\n }}>{column.header}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, rowIndex) => (\n <tr key={rowKey ? rowKey(row, rowIndex) : rowIndex}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n className=\"dt-tr\"\n style={{ cursor: onRowClick ? 'pointer' : 'default' }}>\n {columns.map((column) => (\n <td key={column.key} style={{\n textAlign: column.align || 'left', padding: '13px 18px', fontSize: 13,\n borderBottom: '1px solid var(--dt-divider)', whiteSpace: column.nowrap ? 'nowrap' : 'normal',\n }}>{column.render ? column.render(row[column.key], row) : row[column.key]}</td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n <style>{`.dt-tr{transition:background-color 130ms}.dt-tr:hover{background:var(--dt-surface-muted)}tbody tr:last-child td{border-bottom:0}`}</style>\n </div>\n );\n}\n"]}
@@ -0,0 +1,27 @@
1
+ import * as react from 'react';
2
+ import { ReactNode, HTMLAttributes, CSSProperties } from 'react';
3
+
4
+ type TableAlign = 'left' | 'center' | 'right';
5
+ type TableRow = Record<string, ReactNode>;
6
+ interface TableColumn<Row extends TableRow = TableRow> {
7
+ key: Extract<keyof Row, string>;
8
+ header: ReactNode;
9
+ align?: TableAlign;
10
+ nowrap?: boolean;
11
+ render?: (value: Row[Extract<keyof Row, string>], row: Row) => ReactNode;
12
+ }
13
+ interface TableProps<Row extends TableRow = TableRow> extends Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'style'> {
14
+ columns?: Array<TableColumn<Row>>;
15
+ rows?: Row[];
16
+ rowKey?: (row: Row, index: number) => string | number;
17
+ onRowClick?: (row: Row) => void;
18
+ empty?: ReactNode;
19
+ style?: CSSProperties;
20
+ }
21
+ /**
22
+ * Data table — scannable, dense, hairline-divided. Columns define header,
23
+ * alignment, and an optional cell renderer. Built for comparison, not decoration.
24
+ */
25
+ declare function Table<Row extends TableRow = TableRow>({ columns, rows, rowKey, onRowClick, empty, style, ...rest }: TableProps<Row>): string | number | bigint | true | Iterable<ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | react.JSX.Element;
26
+
27
+ export { Table, type TableAlign, type TableColumn, type TableProps, type TableRow };
@@ -0,0 +1,27 @@
1
+ import * as react from 'react';
2
+ import { ReactNode, HTMLAttributes, CSSProperties } from 'react';
3
+
4
+ type TableAlign = 'left' | 'center' | 'right';
5
+ type TableRow = Record<string, ReactNode>;
6
+ interface TableColumn<Row extends TableRow = TableRow> {
7
+ key: Extract<keyof Row, string>;
8
+ header: ReactNode;
9
+ align?: TableAlign;
10
+ nowrap?: boolean;
11
+ render?: (value: Row[Extract<keyof Row, string>], row: Row) => ReactNode;
12
+ }
13
+ interface TableProps<Row extends TableRow = TableRow> extends Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'style'> {
14
+ columns?: Array<TableColumn<Row>>;
15
+ rows?: Row[];
16
+ rowKey?: (row: Row, index: number) => string | number;
17
+ onRowClick?: (row: Row) => void;
18
+ empty?: ReactNode;
19
+ style?: CSSProperties;
20
+ }
21
+ /**
22
+ * Data table — scannable, dense, hairline-divided. Columns define header,
23
+ * alignment, and an optional cell renderer. Built for comparison, not decoration.
24
+ */
25
+ declare function Table<Row extends TableRow = TableRow>({ columns, rows, rowKey, onRowClick, empty, style, ...rest }: TableProps<Row>): string | number | bigint | true | Iterable<ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | react.JSX.Element;
26
+
27
+ export { Table, type TableAlign, type TableColumn, type TableProps, type TableRow };
@@ -0,0 +1,43 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+
3
+ // src/components/data/Table.tsx
4
+ function Table({ columns = [], rows = [], rowKey, onRowClick, empty, style, ...rest }) {
5
+ if (!rows.length && empty) return empty;
6
+ 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: [
7
+ /* @__PURE__ */ jsxs("table", { style: { width: "100%", borderCollapse: "collapse", color: "var(--dt-ink)" }, children: [
8
+ /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsx("tr", { style: { background: "var(--dt-surface-muted)" }, children: columns.map((column) => /* @__PURE__ */ jsx("th", { style: {
9
+ textAlign: column.align || "left",
10
+ padding: "11px 18px",
11
+ fontFamily: "var(--dt-font-mono)",
12
+ fontSize: 11,
13
+ fontWeight: 600,
14
+ letterSpacing: "0.04em",
15
+ textTransform: "uppercase",
16
+ color: "var(--dt-muted)",
17
+ borderBottom: "1px solid var(--dt-divider)",
18
+ whiteSpace: "nowrap"
19
+ }, children: column.header }, column.key)) }) }),
20
+ /* @__PURE__ */ jsx("tbody", { children: rows.map((row, rowIndex) => /* @__PURE__ */ jsx(
21
+ "tr",
22
+ {
23
+ onClick: onRowClick ? () => onRowClick(row) : void 0,
24
+ className: "dt-tr",
25
+ style: { cursor: onRowClick ? "pointer" : "default" },
26
+ children: columns.map((column) => /* @__PURE__ */ jsx("td", { style: {
27
+ textAlign: column.align || "left",
28
+ padding: "13px 18px",
29
+ fontSize: 13,
30
+ borderBottom: "1px solid var(--dt-divider)",
31
+ whiteSpace: column.nowrap ? "nowrap" : "normal"
32
+ }, children: column.render ? column.render(row[column.key], row) : row[column.key] }, column.key))
33
+ },
34
+ rowKey ? rowKey(row, rowIndex) : rowIndex
35
+ )) })
36
+ ] }),
37
+ /* @__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}` })
38
+ ] });
39
+ }
40
+
41
+ export { Table };
42
+ //# sourceMappingURL=Table.mjs.map
43
+ //# sourceMappingURL=Table.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/data/Table.tsx"],"names":[],"mappings":";;;AA0BO,SAAS,KAAA,CAAuC,EAAE,OAAA,GAAU,IAAI,IAAA,GAAO,EAAC,EAAG,MAAA,EAAQ,UAAA,EAAY,KAAA,EAAO,KAAA,EAAO,GAAG,MAAK,EAAoB;AAC9I,EAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,KAAA,EAAO,OAAO,KAAA;AAElC,EAAA,4BACG,KAAA,EAAA,EAAK,GAAG,IAAA,EAAM,KAAA,EAAO,EAAE,SAAA,EAAW,MAAA,EAAQ,YAAA,EAAc,qBAAA,EAAuB,YAAY,mBAAA,EAAqB,SAAA,EAAW,qCAAA,EAAuC,GAAG,OAAM,EAC1K,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,OAAA,EAAA,EAAM,OAAO,EAAE,KAAA,EAAO,QAAQ,cAAA,EAAgB,UAAA,EAAY,KAAA,EAAO,eAAA,EAAgB,EAChF,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,OAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,UAAA,EAAY,yBAAA,EAA0B,EAChD,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZ,GAAA,CAAC,QAAoB,KAAA,EAAO;AAAA,QAC1B,SAAA,EAAW,OAAO,KAAA,IAAS,MAAA;AAAA,QAAQ,OAAA,EAAS,WAAA;AAAA,QAC5C,UAAA,EAAY,qBAAA;AAAA,QAAuB,QAAA,EAAU,EAAA;AAAA,QAAI,UAAA,EAAY,GAAA;AAAA,QAC7D,aAAA,EAAe,QAAA;AAAA,QAAU,aAAA,EAAe,WAAA;AAAA,QAAa,KAAA,EAAO,iBAAA;AAAA,QAC5D,YAAA,EAAc,6BAAA;AAAA,QAA+B,UAAA,EAAY;AAAA,SACvD,QAAA,EAAA,MAAA,CAAO,MAAA,EAAA,EALF,OAAO,GAKE,CACnB,GACH,CAAA,EACF,CAAA;AAAA,0BACC,OAAA,EAAA,EACE,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,KAAK,QAAA,qBACd,GAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,UAAA,GAAa,MAAM,UAAA,CAAW,GAAG,CAAA,GAAI,MAAA;AAAA,UAC9C,SAAA,EAAU,OAAA;AAAA,UACV,KAAA,EAAO,EAAE,MAAA,EAAQ,UAAA,GAAa,YAAY,SAAA,EAAU;AAAA,UACnD,kBAAQ,GAAA,CAAI,CAAC,MAAA,qBACZ,GAAA,CAAC,QAAoB,KAAA,EAAO;AAAA,YAC1B,SAAA,EAAW,OAAO,KAAA,IAAS,MAAA;AAAA,YAAQ,OAAA,EAAS,WAAA;AAAA,YAAa,QAAA,EAAU,EAAA;AAAA,YACnE,YAAA,EAAc,6BAAA;AAAA,YAA+B,UAAA,EAAY,MAAA,CAAO,MAAA,GAAS,QAAA,GAAW;AAAA,aAClF,QAAA,EAAA,MAAA,CAAO,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,IAAI,MAAA,CAAO,GAAG,CAAA,EAAG,GAAG,IAAI,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,EAAA,EAH/D,MAAA,CAAO,GAG0D,CAC3E;AAAA,SAAA;AAAA,QATM,MAAA,GAAS,MAAA,CAAO,GAAA,EAAK,QAAQ,CAAA,GAAI;AAAA,OAW3C,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,oBACA,GAAA,CAAC,WAAO,QAAA,EAAA,CAAA,gIAAA,CAAA,EAAmI;AAAA,GAAA,EAC7I,CAAA;AAEJ","file":"Table.mjs","sourcesContent":["import type { CSSProperties, HTMLAttributes, ReactNode } from 'react';\n\nexport type TableAlign = 'left' | 'center' | 'right';\nexport type TableRow = Record<string, ReactNode>;\n\nexport interface TableColumn<Row extends TableRow = TableRow> {\n key: Extract<keyof Row, string>;\n header: ReactNode;\n align?: TableAlign;\n nowrap?: boolean;\n render?: (value: Row[Extract<keyof Row, string>], row: Row) => ReactNode;\n}\n\nexport interface TableProps<Row extends TableRow = TableRow> extends Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'style'> {\n columns?: Array<TableColumn<Row>>;\n rows?: Row[];\n rowKey?: (row: Row, index: number) => string | number;\n onRowClick?: (row: Row) => void;\n empty?: ReactNode;\n style?: CSSProperties;\n}\n\n/**\n * Data table — scannable, dense, hairline-divided. Columns define header,\n * alignment, and an optional cell renderer. Built for comparison, not decoration.\n */\nexport function Table<Row extends TableRow = TableRow>({ columns = [], rows = [], rowKey, onRowClick, empty, style, ...rest }: TableProps<Row>) {\n if (!rows.length && empty) return empty;\n\n return (\n <div {...rest} style={{ overflowX: 'auto', borderRadius: 'var(--dt-radius-lg)', background: 'var(--dt-surface)', boxShadow: 'var(--dt-ring), var(--dt-shadow-xs)', ...style }}>\n <table style={{ width: '100%', borderCollapse: 'collapse', color: 'var(--dt-ink)' }}>\n <thead>\n <tr style={{ background: 'var(--dt-surface-muted)' }}>\n {columns.map((column) => (\n <th key={column.key} style={{\n textAlign: column.align || 'left', padding: '11px 18px',\n fontFamily: 'var(--dt-font-mono)', fontSize: 11, fontWeight: 600,\n letterSpacing: '0.04em', textTransform: 'uppercase', color: 'var(--dt-muted)',\n borderBottom: '1px solid var(--dt-divider)', whiteSpace: 'nowrap',\n }}>{column.header}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, rowIndex) => (\n <tr key={rowKey ? rowKey(row, rowIndex) : rowIndex}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n className=\"dt-tr\"\n style={{ cursor: onRowClick ? 'pointer' : 'default' }}>\n {columns.map((column) => (\n <td key={column.key} style={{\n textAlign: column.align || 'left', padding: '13px 18px', fontSize: 13,\n borderBottom: '1px solid var(--dt-divider)', whiteSpace: column.nowrap ? 'nowrap' : 'normal',\n }}>{column.render ? column.render(row[column.key], row) : row[column.key]}</td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n <style>{`.dt-tr{transition:background-color 130ms}.dt-tr:hover{background:var(--dt-surface-muted)}tbody tr:last-child td{border-bottom:0}`}</style>\n </div>\n );\n}\n"]}
@@ -0,0 +1,28 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+
5
+ // src/components/data/UsageMeter.tsx
6
+ function UsageMeter({ label, value = 0, max = 100, unit = "", hint, style, ...rest }) {
7
+ const pct = Math.min(100, Math.max(0, value / max * 100));
8
+ const fill = pct >= 90 ? "var(--dt-danger)" : pct >= 75 ? "var(--dt-warning)" : "var(--dt-accent)";
9
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { ...rest, style: { display: "grid", gap: 8, ...style }, children: [
10
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "baseline", justifyContent: "space-between", gap: 12 }, children: [
11
+ label ? /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 13, fontWeight: 600, color: "var(--dt-muted-strong)" }, children: label }) : /* @__PURE__ */ jsxRuntime.jsx("span", {}),
12
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { fontFamily: "var(--dt-font-mono)", fontSize: 12.5, color: "var(--dt-ink-strong)", fontVariantNumeric: "tabular-nums" }, children: [
13
+ /* @__PURE__ */ jsxRuntime.jsx("b", { style: { fontWeight: 700 }, children: value.toLocaleString() }),
14
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { color: "var(--dt-muted)" }, children: [
15
+ " / ",
16
+ max.toLocaleString(),
17
+ unit
18
+ ] })
19
+ ] })
20
+ ] }),
21
+ /* @__PURE__ */ jsxRuntime.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__ */ jsxRuntime.jsx("div", { style: { position: "absolute", inset: 0, width: `${pct}%`, background: fill, borderRadius: "var(--dt-radius-sm)", transition: "width var(--dt-motion)" } }) }),
22
+ hint ? /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 12, color: "var(--dt-muted)" }, children: hint }) : null
23
+ ] });
24
+ }
25
+
26
+ exports.UsageMeter = UsageMeter;
27
+ //# sourceMappingURL=UsageMeter.cjs.map
28
+ //# sourceMappingURL=UsageMeter.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/data/UsageMeter.tsx"],"names":["jsxs","jsx"],"mappings":";;;;;AAgBO,SAAS,UAAA,CAAW,EAAE,KAAA,EAAO,KAAA,GAAQ,CAAA,EAAG,GAAA,GAAM,GAAA,EAAK,IAAA,GAAO,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,GAAG,MAAK,EAAoB;AAC5G,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,IAAI,CAAA,EAAI,KAAA,GAAQ,GAAA,GAAO,GAAG,CAAC,CAAA;AAC1D,EAAA,MAAM,OAAO,GAAA,IAAO,EAAA,GAAK,kBAAA,GAAqB,GAAA,IAAO,KAAK,mBAAA,GAAsB,kBAAA;AAEhF,EAAA,uBACEA,eAAA,CAAC,KAAA,EAAA,EAAK,GAAG,IAAA,EAAM,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,CAAA,EAAG,GAAG,KAAA,EAAM,EACxD,QAAA,EAAA;AAAA,oBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,UAAA,EAAY,cAAA,EAAgB,eAAA,EAAiB,GAAA,EAAK,EAAA,EAAG,EAC7F,QAAA,EAAA;AAAA,MAAA,KAAA,mBAAQC,cAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,UAAU,EAAA,EAAI,UAAA,EAAY,GAAA,EAAK,KAAA,EAAO,wBAAA,EAAyB,EAAI,QAAA,EAAA,KAAA,EAAM,CAAA,kCAAW,MAAA,EAAA,EAAK,CAAA;AAAA,sBACjHD,eAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,UAAA,EAAY,qBAAA,EAAuB,QAAA,EAAU,IAAA,EAAM,KAAA,EAAO,sBAAA,EAAwB,kBAAA,EAAoB,cAAA,EAAe,EAClI,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,GAAA,EAAA,EAAE,OAAO,EAAE,UAAA,EAAY,KAAI,EAAI,QAAA,EAAA,KAAA,CAAM,gBAAe,EAAE,CAAA;AAAA,wCACtD,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,mBAAkB,EAAG,QAAA,EAAA;AAAA,UAAA,KAAA;AAAA,UAAI,IAAI,cAAA,EAAe;AAAA,UAAG;AAAA,SAAA,EAAK;AAAA,OAAA,EAC5E;AAAA,KAAA,EACF,CAAA;AAAA,mCACC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,YAAY,MAAA,EAAQ,CAAA,EAAG,YAAA,EAAc,qBAAA,EAAuB,YAAY,0BAAA,EAA4B,SAAA,EAAW,yCAAA,EAA2C,QAAA,EAAU,UAAS,EACnM,QAAA,kBAAAA,cAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,KAAA,EAAO,CAAA,EAAG,OAAO,CAAA,EAAG,GAAG,CAAA,CAAA,CAAA,EAAK,UAAA,EAAY,MAAM,YAAA,EAAc,qBAAA,EAAuB,UAAA,EAAY,wBAAA,IAA4B,CAAA,EACjK,CAAA;AAAA,IACC,IAAA,mBAAOA,cAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,KAAA,EAAO,iBAAA,EAAkB,EAAI,QAAA,EAAA,IAAA,EAAK,CAAA,GAAU;AAAA,GAAA,EACnF,CAAA;AAEJ","file":"UsageMeter.cjs","sourcesContent":["import type { CSSProperties, HTMLAttributes, ReactNode } from 'react';\n\nexport interface UsageMeterProps extends Omit<HTMLAttributes<HTMLDivElement>, 'style'> {\n label?: ReactNode;\n value?: number;\n max?: number;\n /** Suffix after max, e.g. \"회/일\". */\n unit?: string;\n hint?: ReactNode;\n style?: CSSProperties;\n}\n\n/**\n * Quota / usage bar — hairline track, persimmon fill escalating to warning/danger.\n * @startingPoint section=\"Data\" subtitle=\"Quota usage with tabular readout\" viewport=\"420x80\"\n */\nexport function UsageMeter({ label, value = 0, max = 100, unit = '', hint, style, ...rest }: UsageMeterProps) {\n const pct = Math.min(100, Math.max(0, (value / max) * 100));\n const fill = pct >= 90 ? 'var(--dt-danger)' : pct >= 75 ? 'var(--dt-warning)' : 'var(--dt-accent)';\n\n return (\n <div {...rest} style={{ display: 'grid', gap: 8, ...style }}>\n <div style={{ display: 'flex', alignItems: 'baseline', justifyContent: 'space-between', gap: 12 }}>\n {label ? <span style={{ fontSize: 13, fontWeight: 600, color: 'var(--dt-muted-strong)' }}>{label}</span> : <span />}\n <span style={{ fontFamily: 'var(--dt-font-mono)', fontSize: 12.5, color: 'var(--dt-ink-strong)', fontVariantNumeric: 'tabular-nums' }}>\n <b style={{ fontWeight: 700 }}>{value.toLocaleString()}</b>\n <span style={{ color: 'var(--dt-muted)' }}> / {max.toLocaleString()}{unit}</span>\n </span>\n </div>\n <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' }}>\n <div style={{ position: 'absolute', inset: 0, width: `${pct}%`, background: fill, borderRadius: 'var(--dt-radius-sm)', transition: 'width var(--dt-motion)' }} />\n </div>\n {hint ? <span style={{ fontSize: 12, color: 'var(--dt-muted)' }}>{hint}</span> : null}\n </div>\n );\n}\n"]}
@@ -0,0 +1,19 @@
1
+ import * as react from 'react';
2
+ import { HTMLAttributes, ReactNode, CSSProperties } from 'react';
3
+
4
+ interface UsageMeterProps extends Omit<HTMLAttributes<HTMLDivElement>, 'style'> {
5
+ label?: ReactNode;
6
+ value?: number;
7
+ max?: number;
8
+ /** Suffix after max, e.g. "회/일". */
9
+ unit?: string;
10
+ hint?: ReactNode;
11
+ style?: CSSProperties;
12
+ }
13
+ /**
14
+ * Quota / usage bar — hairline track, persimmon fill escalating to warning/danger.
15
+ * @startingPoint section="Data" subtitle="Quota usage with tabular readout" viewport="420x80"
16
+ */
17
+ declare function UsageMeter({ label, value, max, unit, hint, style, ...rest }: UsageMeterProps): react.JSX.Element;
18
+
19
+ export { UsageMeter, type UsageMeterProps };
@@ -0,0 +1,19 @@
1
+ import * as react from 'react';
2
+ import { HTMLAttributes, ReactNode, CSSProperties } from 'react';
3
+
4
+ interface UsageMeterProps extends Omit<HTMLAttributes<HTMLDivElement>, 'style'> {
5
+ label?: ReactNode;
6
+ value?: number;
7
+ max?: number;
8
+ /** Suffix after max, e.g. "회/일". */
9
+ unit?: string;
10
+ hint?: ReactNode;
11
+ style?: CSSProperties;
12
+ }
13
+ /**
14
+ * Quota / usage bar — hairline track, persimmon fill escalating to warning/danger.
15
+ * @startingPoint section="Data" subtitle="Quota usage with tabular readout" viewport="420x80"
16
+ */
17
+ declare function UsageMeter({ label, value, max, unit, hint, style, ...rest }: UsageMeterProps): react.JSX.Element;
18
+
19
+ export { UsageMeter, type UsageMeterProps };
@@ -0,0 +1,26 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+
3
+ // src/components/data/UsageMeter.tsx
4
+ function UsageMeter({ label, value = 0, max = 100, unit = "", hint, style, ...rest }) {
5
+ const pct = Math.min(100, Math.max(0, value / max * 100));
6
+ const fill = pct >= 90 ? "var(--dt-danger)" : pct >= 75 ? "var(--dt-warning)" : "var(--dt-accent)";
7
+ return /* @__PURE__ */ jsxs("div", { ...rest, style: { display: "grid", gap: 8, ...style }, children: [
8
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "baseline", justifyContent: "space-between", gap: 12 }, children: [
9
+ label ? /* @__PURE__ */ jsx("span", { style: { fontSize: 13, fontWeight: 600, color: "var(--dt-muted-strong)" }, children: label }) : /* @__PURE__ */ jsx("span", {}),
10
+ /* @__PURE__ */ jsxs("span", { style: { fontFamily: "var(--dt-font-mono)", fontSize: 12.5, color: "var(--dt-ink-strong)", fontVariantNumeric: "tabular-nums" }, children: [
11
+ /* @__PURE__ */ jsx("b", { style: { fontWeight: 700 }, children: value.toLocaleString() }),
12
+ /* @__PURE__ */ jsxs("span", { style: { color: "var(--dt-muted)" }, children: [
13
+ " / ",
14
+ max.toLocaleString(),
15
+ unit
16
+ ] })
17
+ ] })
18
+ ] }),
19
+ /* @__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)" } }) }),
20
+ hint ? /* @__PURE__ */ jsx("span", { style: { fontSize: 12, color: "var(--dt-muted)" }, children: hint }) : null
21
+ ] });
22
+ }
23
+
24
+ export { UsageMeter };
25
+ //# sourceMappingURL=UsageMeter.mjs.map
26
+ //# sourceMappingURL=UsageMeter.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/data/UsageMeter.tsx"],"names":[],"mappings":";;;AAgBO,SAAS,UAAA,CAAW,EAAE,KAAA,EAAO,KAAA,GAAQ,CAAA,EAAG,GAAA,GAAM,GAAA,EAAK,IAAA,GAAO,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,GAAG,MAAK,EAAoB;AAC5G,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,IAAI,CAAA,EAAI,KAAA,GAAQ,GAAA,GAAO,GAAG,CAAC,CAAA;AAC1D,EAAA,MAAM,OAAO,GAAA,IAAO,EAAA,GAAK,kBAAA,GAAqB,GAAA,IAAO,KAAK,mBAAA,GAAsB,kBAAA;AAEhF,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAK,GAAG,IAAA,EAAM,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,CAAA,EAAG,GAAG,KAAA,EAAM,EACxD,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,UAAA,EAAY,cAAA,EAAgB,eAAA,EAAiB,GAAA,EAAK,EAAA,EAAG,EAC7F,QAAA,EAAA;AAAA,MAAA,KAAA,mBAAQ,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,UAAU,EAAA,EAAI,UAAA,EAAY,GAAA,EAAK,KAAA,EAAO,wBAAA,EAAyB,EAAI,QAAA,EAAA,KAAA,EAAM,CAAA,uBAAW,MAAA,EAAA,EAAK,CAAA;AAAA,sBACjH,IAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,UAAA,EAAY,qBAAA,EAAuB,QAAA,EAAU,IAAA,EAAM,KAAA,EAAO,sBAAA,EAAwB,kBAAA,EAAoB,cAAA,EAAe,EAClI,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,GAAA,EAAA,EAAE,OAAO,EAAE,UAAA,EAAY,KAAI,EAAI,QAAA,EAAA,KAAA,CAAM,gBAAe,EAAE,CAAA;AAAA,6BACtD,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,mBAAkB,EAAG,QAAA,EAAA;AAAA,UAAA,KAAA;AAAA,UAAI,IAAI,cAAA,EAAe;AAAA,UAAG;AAAA,SAAA,EAAK;AAAA,OAAA,EAC5E;AAAA,KAAA,EACF,CAAA;AAAA,wBACC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,YAAY,MAAA,EAAQ,CAAA,EAAG,YAAA,EAAc,qBAAA,EAAuB,YAAY,0BAAA,EAA4B,SAAA,EAAW,yCAAA,EAA2C,QAAA,EAAU,UAAS,EACnM,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,KAAA,EAAO,CAAA,EAAG,OAAO,CAAA,EAAG,GAAG,CAAA,CAAA,CAAA,EAAK,UAAA,EAAY,MAAM,YAAA,EAAc,qBAAA,EAAuB,UAAA,EAAY,wBAAA,IAA4B,CAAA,EACjK,CAAA;AAAA,IACC,IAAA,mBAAO,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,KAAA,EAAO,iBAAA,EAAkB,EAAI,QAAA,EAAA,IAAA,EAAK,CAAA,GAAU;AAAA,GAAA,EACnF,CAAA;AAEJ","file":"UsageMeter.mjs","sourcesContent":["import type { CSSProperties, HTMLAttributes, ReactNode } from 'react';\n\nexport interface UsageMeterProps extends Omit<HTMLAttributes<HTMLDivElement>, 'style'> {\n label?: ReactNode;\n value?: number;\n max?: number;\n /** Suffix after max, e.g. \"회/일\". */\n unit?: string;\n hint?: ReactNode;\n style?: CSSProperties;\n}\n\n/**\n * Quota / usage bar — hairline track, persimmon fill escalating to warning/danger.\n * @startingPoint section=\"Data\" subtitle=\"Quota usage with tabular readout\" viewport=\"420x80\"\n */\nexport function UsageMeter({ label, value = 0, max = 100, unit = '', hint, style, ...rest }: UsageMeterProps) {\n const pct = Math.min(100, Math.max(0, (value / max) * 100));\n const fill = pct >= 90 ? 'var(--dt-danger)' : pct >= 75 ? 'var(--dt-warning)' : 'var(--dt-accent)';\n\n return (\n <div {...rest} style={{ display: 'grid', gap: 8, ...style }}>\n <div style={{ display: 'flex', alignItems: 'baseline', justifyContent: 'space-between', gap: 12 }}>\n {label ? <span style={{ fontSize: 13, fontWeight: 600, color: 'var(--dt-muted-strong)' }}>{label}</span> : <span />}\n <span style={{ fontFamily: 'var(--dt-font-mono)', fontSize: 12.5, color: 'var(--dt-ink-strong)', fontVariantNumeric: 'tabular-nums' }}>\n <b style={{ fontWeight: 700 }}>{value.toLocaleString()}</b>\n <span style={{ color: 'var(--dt-muted)' }}> / {max.toLocaleString()}{unit}</span>\n </span>\n </div>\n <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' }}>\n <div style={{ position: 'absolute', inset: 0, width: `${pct}%`, background: fill, borderRadius: 'var(--dt-radius-sm)', transition: 'width var(--dt-motion)' }} />\n </div>\n {hint ? <span style={{ fontSize: 12, color: 'var(--dt-muted)' }}>{hint}</span> : null}\n </div>\n );\n}\n"]}
@@ -0,0 +1,78 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+
5
+ // src/lib/cx.ts
6
+ function cx(...classes) {
7
+ return classes.filter(Boolean).join(" ");
8
+ }
9
+ var AlertTone = {
10
+ Info: "info",
11
+ Success: "success",
12
+ Warning: "warning",
13
+ Danger: "danger"
14
+ };
15
+ var AlertMotion = {
16
+ None: "none",
17
+ Subtle: "subtle",
18
+ Pulse: "pulse"
19
+ };
20
+ var TONE_BACKGROUND = {
21
+ info: "var(--dt-status-cobalt)",
22
+ success: "var(--dt-status-success)",
23
+ warning: "var(--dt-status-warning)",
24
+ danger: "var(--dt-status-danger)"
25
+ };
26
+ function Alert({
27
+ tone = AlertTone.Info,
28
+ title,
29
+ children,
30
+ icon,
31
+ action,
32
+ motion = AlertMotion.None,
33
+ onDismiss,
34
+ className,
35
+ style,
36
+ ...rest
37
+ }) {
38
+ const background = TONE_BACKGROUND[tone] ?? TONE_BACKGROUND[AlertTone.Info];
39
+ const motionClass = motion === AlertMotion.None ? void 0 : `dt-alert-motion-${motion}`;
40
+ return /* @__PURE__ */ jsxRuntime.jsxs(
41
+ "div",
42
+ {
43
+ role: "status",
44
+ className: cx("dt-alert", motionClass, className),
45
+ style: {
46
+ alignItems: "flex-start",
47
+ background,
48
+ borderRadius: "20px",
49
+ color: "var(--dt-alert-ink)",
50
+ display: "flex",
51
+ gap: 12,
52
+ minHeight: 62,
53
+ overflow: "clip",
54
+ padding: "13px 15px",
55
+ position: "relative",
56
+ transition: "filter var(--dt-motion-fast), transform var(--dt-motion-fast)",
57
+ width: "min(100%, 380px)",
58
+ ...style
59
+ },
60
+ ...rest,
61
+ children: [
62
+ icon ? /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: "currentColor", display: "inline-flex", flex: "0 0 auto", marginTop: 1 }, children: icon }) : null,
63
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { flex: "1 0 0", minWidth: 1, overflow: "clip", wordBreak: "break-word" }, children: [
64
+ title ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 14, fontWeight: 600, lineHeight: "normal" }, children: title }) : null,
65
+ children ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: title ? 3 : 0, fontSize: 13, fontWeight: 400, lineHeight: "normal" }, children }) : null,
66
+ action ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 10 }, children: action }) : null
67
+ ] }),
68
+ onDismiss ? /* @__PURE__ */ jsxRuntime.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__ */ jsxRuntime.jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M6 6l12 12M18 6L6 18", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round" }) }) }) : null
69
+ ]
70
+ }
71
+ );
72
+ }
73
+
74
+ exports.Alert = Alert;
75
+ exports.AlertMotion = AlertMotion;
76
+ exports.AlertTone = AlertTone;
77
+ //# sourceMappingURL=Alert.cjs.map
78
+ //# sourceMappingURL=Alert.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/cx.ts","../../../src/components/feedback/Alert.tsx"],"names":["jsxs","jsx"],"mappings":"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","file":"Alert.cjs","sourcesContent":["export function cx(...classes: Array<string | false | null | undefined>): string {\n return classes.filter(Boolean).join(' ');\n}\n","import type { CSSProperties, HTMLAttributes, ReactNode } from 'react';\nimport { cx } from '../../lib/cx';\n\nexport const AlertTone = {\n Info: 'info',\n Success: 'success',\n Warning: 'warning',\n Danger: 'danger',\n} as const;\n\nexport type AlertTone = (typeof AlertTone)[keyof typeof AlertTone];\n\nexport const AlertMotion = {\n None: 'none',\n Subtle: 'subtle',\n Pulse: 'pulse',\n} as const;\n\nexport type AlertMotion = (typeof AlertMotion)[keyof typeof AlertMotion];\n\nconst TONE_BACKGROUND = {\n info: 'var(--dt-status-cobalt)',\n success: 'var(--dt-status-success)',\n warning: 'var(--dt-status-warning)',\n danger: 'var(--dt-status-danger)',\n} satisfies Record<AlertTone, string>;\n\nexport interface AlertProps extends Omit<HTMLAttributes<HTMLDivElement>, 'style' | 'title'> {\n tone?: AlertTone;\n title?: ReactNode;\n children?: ReactNode;\n icon?: ReactNode;\n action?: ReactNode;\n motion?: AlertMotion;\n onDismiss?: () => void;\n style?: CSSProperties;\n}\n\nexport function Alert({\n tone = AlertTone.Info,\n title,\n children,\n icon,\n action,\n motion = AlertMotion.None,\n onDismiss,\n className,\n style,\n ...rest\n}: AlertProps) {\n const background = TONE_BACKGROUND[tone] ?? TONE_BACKGROUND[AlertTone.Info];\n const motionClass = motion === AlertMotion.None ? undefined : `dt-alert-motion-${motion}`;\n return (\n <div\n role=\"status\"\n className={cx('dt-alert', motionClass, className)}\n style={{\n alignItems: 'flex-start',\n background,\n borderRadius: '20px',\n color: 'var(--dt-alert-ink)',\n display: 'flex',\n gap: 12,\n minHeight: 62,\n overflow: 'clip',\n padding: '13px 15px',\n position: 'relative',\n transition: 'filter var(--dt-motion-fast), transform var(--dt-motion-fast)',\n width: 'min(100%, 380px)',\n ...style,\n }}\n {...rest}\n >\n {icon ? <span style={{ color: 'currentColor', display: 'inline-flex', flex: '0 0 auto', marginTop: 1 }}>{icon}</span> : null}\n <div style={{ flex: '1 0 0', minWidth: 1, overflow: 'clip', wordBreak: 'break-word' }}>\n {title ? <div style={{ fontSize: 14, fontWeight: 600, lineHeight: 'normal' }}>{title}</div> : null}\n {children ? <div style={{ marginTop: title ? 3 : 0, fontSize: 13, fontWeight: 400, lineHeight: 'normal' }}>{children}</div> : null}\n {action ? <div style={{ marginTop: 10 }}>{action}</div> : null}\n </div>\n {onDismiss ? (\n <button onClick={onDismiss} aria-label=\"닫기\" style={{ flex: '0 0 auto', border: 'none', background: 'transparent', cursor: 'pointer', color: 'currentColor', padding: 2, lineHeight: 0 }}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\"><path d=\"M6 6l12 12M18 6L6 18\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" /></svg>\n </button>\n ) : null}\n </div>\n );\n}\n"]}
@@ -0,0 +1,29 @@
1
+ import * as react from 'react';
2
+ import { HTMLAttributes, ReactNode, CSSProperties } from 'react';
3
+
4
+ declare const AlertTone: {
5
+ readonly Info: "info";
6
+ readonly Success: "success";
7
+ readonly Warning: "warning";
8
+ readonly Danger: "danger";
9
+ };
10
+ type AlertTone = (typeof AlertTone)[keyof typeof AlertTone];
11
+ declare const AlertMotion: {
12
+ readonly None: "none";
13
+ readonly Subtle: "subtle";
14
+ readonly Pulse: "pulse";
15
+ };
16
+ type AlertMotion = (typeof AlertMotion)[keyof typeof AlertMotion];
17
+ interface AlertProps extends Omit<HTMLAttributes<HTMLDivElement>, 'style' | 'title'> {
18
+ tone?: AlertTone;
19
+ title?: ReactNode;
20
+ children?: ReactNode;
21
+ icon?: ReactNode;
22
+ action?: ReactNode;
23
+ motion?: AlertMotion;
24
+ onDismiss?: () => void;
25
+ style?: CSSProperties;
26
+ }
27
+ declare function Alert({ tone, title, children, icon, action, motion, onDismiss, className, style, ...rest }: AlertProps): react.JSX.Element;
28
+
29
+ export { Alert, AlertMotion, type AlertProps, AlertTone };
@@ -0,0 +1,29 @@
1
+ import * as react from 'react';
2
+ import { HTMLAttributes, ReactNode, CSSProperties } from 'react';
3
+
4
+ declare const AlertTone: {
5
+ readonly Info: "info";
6
+ readonly Success: "success";
7
+ readonly Warning: "warning";
8
+ readonly Danger: "danger";
9
+ };
10
+ type AlertTone = (typeof AlertTone)[keyof typeof AlertTone];
11
+ declare const AlertMotion: {
12
+ readonly None: "none";
13
+ readonly Subtle: "subtle";
14
+ readonly Pulse: "pulse";
15
+ };
16
+ type AlertMotion = (typeof AlertMotion)[keyof typeof AlertMotion];
17
+ interface AlertProps extends Omit<HTMLAttributes<HTMLDivElement>, 'style' | 'title'> {
18
+ tone?: AlertTone;
19
+ title?: ReactNode;
20
+ children?: ReactNode;
21
+ icon?: ReactNode;
22
+ action?: ReactNode;
23
+ motion?: AlertMotion;
24
+ onDismiss?: () => void;
25
+ style?: CSSProperties;
26
+ }
27
+ declare function Alert({ tone, title, children, icon, action, motion, onDismiss, className, style, ...rest }: AlertProps): react.JSX.Element;
28
+
29
+ export { Alert, AlertMotion, type AlertProps, AlertTone };
@@ -0,0 +1,74 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+
3
+ // src/lib/cx.ts
4
+ function cx(...classes) {
5
+ return classes.filter(Boolean).join(" ");
6
+ }
7
+ var AlertTone = {
8
+ Info: "info",
9
+ Success: "success",
10
+ Warning: "warning",
11
+ Danger: "danger"
12
+ };
13
+ var AlertMotion = {
14
+ None: "none",
15
+ Subtle: "subtle",
16
+ Pulse: "pulse"
17
+ };
18
+ var TONE_BACKGROUND = {
19
+ info: "var(--dt-status-cobalt)",
20
+ success: "var(--dt-status-success)",
21
+ warning: "var(--dt-status-warning)",
22
+ danger: "var(--dt-status-danger)"
23
+ };
24
+ function Alert({
25
+ tone = AlertTone.Info,
26
+ title,
27
+ children,
28
+ icon,
29
+ action,
30
+ motion = AlertMotion.None,
31
+ onDismiss,
32
+ className,
33
+ style,
34
+ ...rest
35
+ }) {
36
+ const background = TONE_BACKGROUND[tone] ?? TONE_BACKGROUND[AlertTone.Info];
37
+ const motionClass = motion === AlertMotion.None ? void 0 : `dt-alert-motion-${motion}`;
38
+ return /* @__PURE__ */ jsxs(
39
+ "div",
40
+ {
41
+ role: "status",
42
+ className: cx("dt-alert", motionClass, className),
43
+ style: {
44
+ alignItems: "flex-start",
45
+ background,
46
+ borderRadius: "20px",
47
+ color: "var(--dt-alert-ink)",
48
+ display: "flex",
49
+ gap: 12,
50
+ minHeight: 62,
51
+ overflow: "clip",
52
+ padding: "13px 15px",
53
+ position: "relative",
54
+ transition: "filter var(--dt-motion-fast), transform var(--dt-motion-fast)",
55
+ width: "min(100%, 380px)",
56
+ ...style
57
+ },
58
+ ...rest,
59
+ children: [
60
+ icon ? /* @__PURE__ */ jsx("span", { style: { color: "currentColor", display: "inline-flex", flex: "0 0 auto", marginTop: 1 }, children: icon }) : null,
61
+ /* @__PURE__ */ jsxs("div", { style: { flex: "1 0 0", minWidth: 1, overflow: "clip", wordBreak: "break-word" }, children: [
62
+ title ? /* @__PURE__ */ jsx("div", { style: { fontSize: 14, fontWeight: 600, lineHeight: "normal" }, children: title }) : null,
63
+ children ? /* @__PURE__ */ jsx("div", { style: { marginTop: title ? 3 : 0, fontSize: 13, fontWeight: 400, lineHeight: "normal" }, children }) : null,
64
+ action ? /* @__PURE__ */ jsx("div", { style: { marginTop: 10 }, children: action }) : null
65
+ ] }),
66
+ 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
67
+ ]
68
+ }
69
+ );
70
+ }
71
+
72
+ export { Alert, AlertMotion, AlertTone };
73
+ //# sourceMappingURL=Alert.mjs.map
74
+ //# sourceMappingURL=Alert.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/cx.ts","../../../src/components/feedback/Alert.tsx"],"names":[],"mappings":"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","file":"Alert.mjs","sourcesContent":["export function cx(...classes: Array<string | false | null | undefined>): string {\n return classes.filter(Boolean).join(' ');\n}\n","import type { CSSProperties, HTMLAttributes, ReactNode } from 'react';\nimport { cx } from '../../lib/cx';\n\nexport const AlertTone = {\n Info: 'info',\n Success: 'success',\n Warning: 'warning',\n Danger: 'danger',\n} as const;\n\nexport type AlertTone = (typeof AlertTone)[keyof typeof AlertTone];\n\nexport const AlertMotion = {\n None: 'none',\n Subtle: 'subtle',\n Pulse: 'pulse',\n} as const;\n\nexport type AlertMotion = (typeof AlertMotion)[keyof typeof AlertMotion];\n\nconst TONE_BACKGROUND = {\n info: 'var(--dt-status-cobalt)',\n success: 'var(--dt-status-success)',\n warning: 'var(--dt-status-warning)',\n danger: 'var(--dt-status-danger)',\n} satisfies Record<AlertTone, string>;\n\nexport interface AlertProps extends Omit<HTMLAttributes<HTMLDivElement>, 'style' | 'title'> {\n tone?: AlertTone;\n title?: ReactNode;\n children?: ReactNode;\n icon?: ReactNode;\n action?: ReactNode;\n motion?: AlertMotion;\n onDismiss?: () => void;\n style?: CSSProperties;\n}\n\nexport function Alert({\n tone = AlertTone.Info,\n title,\n children,\n icon,\n action,\n motion = AlertMotion.None,\n onDismiss,\n className,\n style,\n ...rest\n}: AlertProps) {\n const background = TONE_BACKGROUND[tone] ?? TONE_BACKGROUND[AlertTone.Info];\n const motionClass = motion === AlertMotion.None ? undefined : `dt-alert-motion-${motion}`;\n return (\n <div\n role=\"status\"\n className={cx('dt-alert', motionClass, className)}\n style={{\n alignItems: 'flex-start',\n background,\n borderRadius: '20px',\n color: 'var(--dt-alert-ink)',\n display: 'flex',\n gap: 12,\n minHeight: 62,\n overflow: 'clip',\n padding: '13px 15px',\n position: 'relative',\n transition: 'filter var(--dt-motion-fast), transform var(--dt-motion-fast)',\n width: 'min(100%, 380px)',\n ...style,\n }}\n {...rest}\n >\n {icon ? <span style={{ color: 'currentColor', display: 'inline-flex', flex: '0 0 auto', marginTop: 1 }}>{icon}</span> : null}\n <div style={{ flex: '1 0 0', minWidth: 1, overflow: 'clip', wordBreak: 'break-word' }}>\n {title ? <div style={{ fontSize: 14, fontWeight: 600, lineHeight: 'normal' }}>{title}</div> : null}\n {children ? <div style={{ marginTop: title ? 3 : 0, fontSize: 13, fontWeight: 400, lineHeight: 'normal' }}>{children}</div> : null}\n {action ? <div style={{ marginTop: 10 }}>{action}</div> : null}\n </div>\n {onDismiss ? (\n <button onClick={onDismiss} aria-label=\"닫기\" style={{ flex: '0 0 auto', border: 'none', background: 'transparent', cursor: 'pointer', color: 'currentColor', padding: 2, lineHeight: 0 }}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\"><path d=\"M6 6l12 12M18 6L6 18\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" /></svg>\n </button>\n ) : null}\n </div>\n );\n}\n"]}