@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/README.md ADDED
@@ -0,0 +1,62 @@
1
+ # @bridger-kr/react
2
+
3
+ React component library for the Bridger Design System.
4
+
5
+ Exports 40 components across six categories (core, forms, feedback, data, navigation, product) plus the `cx` class-name helper, all consumable from the package root.
6
+
7
+ ## Install
8
+
9
+ ```sh
10
+ pnpm add @bridger-kr/react @bridger-kr/tokens react react-dom
11
+ ```
12
+
13
+ ## Peer Dependencies
14
+
15
+ `@bridger-kr/react` expects React, React DOM 18 or newer, and `@bridger-kr/tokens`:
16
+
17
+ ```json
18
+ {
19
+ "react": ">=18",
20
+ "react-dom": ">=18"
21
+ }
22
+ ```
23
+
24
+ ## Usage
25
+
26
+ Components are exported from the package root by category:
27
+
28
+ ```tsx
29
+ import { Button, Card, CardTone, Badge, Input } from '@bridger-kr/react';
30
+ ```
31
+
32
+ Per-component subpath imports are reserved for tree-shaking-friendly usage:
33
+
34
+ ```tsx
35
+ import { Button } from '@bridger-kr/react/components/core/Button';
36
+ ```
37
+
38
+ ## CSS Setup
39
+
40
+ Import the token contract once before React component styles:
41
+
42
+ ```ts
43
+ import '@bridger-kr/tokens/css';
44
+ import '@bridger-kr/react/styles.css';
45
+ ```
46
+
47
+ The React stylesheet currently imports `@bridger-kr/tokens/css` too, so bundlers that preserve package CSS imports can load a single stylesheet:
48
+
49
+ ```ts
50
+ import '@bridger-kr/react/styles.css';
51
+ ```
52
+
53
+ If your bundler does not resolve package `@import` statements in CSS, import both `@bridger-kr/tokens/css` and `@bridger-kr/react/styles.css` in that order.
54
+
55
+ ## Component Categories
56
+
57
+ - `core` — Badge, Button, Card, FilterChip, Input, Panel/Surface, StatusPill, Tabs
58
+ - `forms` — Checkbox, Combobox, FileUpload, RadioGroup, SegmentedControl, Select, Slider, Switch/ToggleSwitch, Textarea
59
+ - `feedback` — Alert, Dialog, Drawer, EmptyState, Skeleton, Spinner, Toast, Tooltip
60
+ - `data` — Avatar, CodeBlock, KeyValue, LogRow, Pagination, StatTile, Table, UsageMeter
61
+ - `navigation` — Breadcrumb, CommandPalette, Menu, Sidebar, Stepper
62
+ - `product` — BrandLogo, SectionCard, ToolCard
@@ -0,0 +1,36 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+
5
+ // src/components/core/Badge.tsx
6
+ var TONE_CLASS = {
7
+ neutral: "badge",
8
+ accent: "badge badge-accent",
9
+ info: "badge badge-info",
10
+ success: "badge badge-success",
11
+ warning: "badge badge-warning",
12
+ danger: "badge badge-danger"
13
+ };
14
+ function Badge({ children, tone = "neutral", dot = false, style, ...rest }) {
15
+ const cls = TONE_CLASS[tone] ?? TONE_CLASS.neutral;
16
+ return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: cls, style, ...rest, children: [
17
+ dot ? /* @__PURE__ */ jsxRuntime.jsx(
18
+ "span",
19
+ {
20
+ "aria-hidden": "true",
21
+ style: {
22
+ width: 6,
23
+ height: 6,
24
+ borderRadius: "9999px",
25
+ background: "currentColor",
26
+ display: "inline-block"
27
+ }
28
+ }
29
+ ) : null,
30
+ children
31
+ ] });
32
+ }
33
+
34
+ exports.Badge = Badge;
35
+ //# sourceMappingURL=Badge.cjs.map
36
+ //# sourceMappingURL=Badge.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/core/Badge.tsx"],"names":["jsx"],"mappings":";;;;;AAEA,IAAM,UAAA,GAAa;AAAA,EACjB,OAAA,EAAS,OAAA;AAAA,EACT,MAAA,EAAQ,oBAAA;AAAA,EACR,IAAA,EAAM,kBAAA;AAAA,EACN,OAAA,EAAS,qBAAA;AAAA,EACT,OAAA,EAAS,qBAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA;AAeO,SAAS,KAAA,CAAM,EAAE,QAAA,EAAU,IAAA,GAAO,SAAA,EAAW,MAAM,KAAA,EAAO,KAAA,EAAO,GAAG,IAAA,EAAK,EAAe;AAC7F,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,IAAI,CAAA,IAAK,UAAA,CAAW,OAAA;AAC3C,EAAA,uCACG,MAAA,EAAA,EAAK,SAAA,EAAW,GAAA,EAAK,KAAA,EAAe,GAAG,IAAA,EACrC,QAAA,EAAA;AAAA,IAAA,GAAA,mBACCA,cAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAY,MAAA;AAAA,QACZ,KAAA,EAAO;AAAA,UACL,KAAA,EAAO,CAAA;AAAA,UACP,MAAA,EAAQ,CAAA;AAAA,UACR,YAAA,EAAc,QAAA;AAAA,UACd,UAAA,EAAY,cAAA;AAAA,UACZ,OAAA,EAAS;AAAA;AACX;AAAA,KACF,GACE,IAAA;AAAA,IACH;AAAA,GAAA,EACH,CAAA;AAEJ","file":"Badge.cjs","sourcesContent":["import type { CSSProperties, HTMLAttributes, ReactNode } from 'react';\n\nconst TONE_CLASS = {\n neutral: 'badge',\n accent: 'badge badge-accent',\n info: 'badge badge-info',\n success: 'badge badge-success',\n warning: 'badge badge-warning',\n danger: 'badge badge-danger',\n};\n\nexport interface BadgeProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'style'> {\n children?: ReactNode;\n /** Semantic tone. info/success/warning/danger are status-only. */\n tone?: 'neutral' | 'accent' | 'info' | 'success' | 'warning' | 'danger';\n /** Show a leading status dot in the current tone color. */\n dot?: boolean;\n style?: CSSProperties;\n}\n\n/**\n * Status / classification badge. Pill-shaped, tinted. Status or\n * classification only — never decorative.\n */\nexport function Badge({ children, tone = 'neutral', dot = false, style, ...rest }: BadgeProps) {\n const cls = TONE_CLASS[tone] ?? TONE_CLASS.neutral;\n return (\n <span className={cls} style={style} {...rest}>\n {dot ? (\n <span\n aria-hidden=\"true\"\n style={{\n width: 6,\n height: 6,\n borderRadius: '9999px',\n background: 'currentColor',\n display: 'inline-block',\n }}\n />\n ) : null}\n {children}\n </span>\n );\n}\n"]}
@@ -0,0 +1,18 @@
1
+ import * as react from 'react';
2
+ import { HTMLAttributes, ReactNode, CSSProperties } from 'react';
3
+
4
+ interface BadgeProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'style'> {
5
+ children?: ReactNode;
6
+ /** Semantic tone. info/success/warning/danger are status-only. */
7
+ tone?: 'neutral' | 'accent' | 'info' | 'success' | 'warning' | 'danger';
8
+ /** Show a leading status dot in the current tone color. */
9
+ dot?: boolean;
10
+ style?: CSSProperties;
11
+ }
12
+ /**
13
+ * Status / classification badge. Pill-shaped, tinted. Status or
14
+ * classification only — never decorative.
15
+ */
16
+ declare function Badge({ children, tone, dot, style, ...rest }: BadgeProps): react.JSX.Element;
17
+
18
+ export { Badge, type BadgeProps };
@@ -0,0 +1,18 @@
1
+ import * as react from 'react';
2
+ import { HTMLAttributes, ReactNode, CSSProperties } from 'react';
3
+
4
+ interface BadgeProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'style'> {
5
+ children?: ReactNode;
6
+ /** Semantic tone. info/success/warning/danger are status-only. */
7
+ tone?: 'neutral' | 'accent' | 'info' | 'success' | 'warning' | 'danger';
8
+ /** Show a leading status dot in the current tone color. */
9
+ dot?: boolean;
10
+ style?: CSSProperties;
11
+ }
12
+ /**
13
+ * Status / classification badge. Pill-shaped, tinted. Status or
14
+ * classification only — never decorative.
15
+ */
16
+ declare function Badge({ children, tone, dot, style, ...rest }: BadgeProps): react.JSX.Element;
17
+
18
+ export { Badge, type BadgeProps };
@@ -0,0 +1,34 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+
3
+ // src/components/core/Badge.tsx
4
+ var TONE_CLASS = {
5
+ neutral: "badge",
6
+ accent: "badge badge-accent",
7
+ info: "badge badge-info",
8
+ success: "badge badge-success",
9
+ warning: "badge badge-warning",
10
+ danger: "badge badge-danger"
11
+ };
12
+ function Badge({ children, tone = "neutral", dot = false, style, ...rest }) {
13
+ const cls = TONE_CLASS[tone] ?? TONE_CLASS.neutral;
14
+ return /* @__PURE__ */ jsxs("span", { className: cls, style, ...rest, children: [
15
+ dot ? /* @__PURE__ */ jsx(
16
+ "span",
17
+ {
18
+ "aria-hidden": "true",
19
+ style: {
20
+ width: 6,
21
+ height: 6,
22
+ borderRadius: "9999px",
23
+ background: "currentColor",
24
+ display: "inline-block"
25
+ }
26
+ }
27
+ ) : null,
28
+ children
29
+ ] });
30
+ }
31
+
32
+ export { Badge };
33
+ //# sourceMappingURL=Badge.mjs.map
34
+ //# sourceMappingURL=Badge.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/core/Badge.tsx"],"names":[],"mappings":";;;AAEA,IAAM,UAAA,GAAa;AAAA,EACjB,OAAA,EAAS,OAAA;AAAA,EACT,MAAA,EAAQ,oBAAA;AAAA,EACR,IAAA,EAAM,kBAAA;AAAA,EACN,OAAA,EAAS,qBAAA;AAAA,EACT,OAAA,EAAS,qBAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA;AAeO,SAAS,KAAA,CAAM,EAAE,QAAA,EAAU,IAAA,GAAO,SAAA,EAAW,MAAM,KAAA,EAAO,KAAA,EAAO,GAAG,IAAA,EAAK,EAAe;AAC7F,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,IAAI,CAAA,IAAK,UAAA,CAAW,OAAA;AAC3C,EAAA,4BACG,MAAA,EAAA,EAAK,SAAA,EAAW,GAAA,EAAK,KAAA,EAAe,GAAG,IAAA,EACrC,QAAA,EAAA;AAAA,IAAA,GAAA,mBACC,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAY,MAAA;AAAA,QACZ,KAAA,EAAO;AAAA,UACL,KAAA,EAAO,CAAA;AAAA,UACP,MAAA,EAAQ,CAAA;AAAA,UACR,YAAA,EAAc,QAAA;AAAA,UACd,UAAA,EAAY,cAAA;AAAA,UACZ,OAAA,EAAS;AAAA;AACX;AAAA,KACF,GACE,IAAA;AAAA,IACH;AAAA,GAAA,EACH,CAAA;AAEJ","file":"Badge.mjs","sourcesContent":["import type { CSSProperties, HTMLAttributes, ReactNode } from 'react';\n\nconst TONE_CLASS = {\n neutral: 'badge',\n accent: 'badge badge-accent',\n info: 'badge badge-info',\n success: 'badge badge-success',\n warning: 'badge badge-warning',\n danger: 'badge badge-danger',\n};\n\nexport interface BadgeProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'style'> {\n children?: ReactNode;\n /** Semantic tone. info/success/warning/danger are status-only. */\n tone?: 'neutral' | 'accent' | 'info' | 'success' | 'warning' | 'danger';\n /** Show a leading status dot in the current tone color. */\n dot?: boolean;\n style?: CSSProperties;\n}\n\n/**\n * Status / classification badge. Pill-shaped, tinted. Status or\n * classification only — never decorative.\n */\nexport function Badge({ children, tone = 'neutral', dot = false, style, ...rest }: BadgeProps) {\n const cls = TONE_CLASS[tone] ?? TONE_CLASS.neutral;\n return (\n <span className={cls} style={style} {...rest}>\n {dot ? (\n <span\n aria-hidden=\"true\"\n style={{\n width: 6,\n height: 6,\n borderRadius: '9999px',\n background: 'currentColor',\n display: 'inline-block',\n }}\n />\n ) : null}\n {children}\n </span>\n );\n}\n"]}
@@ -0,0 +1,57 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+
5
+ // src/components/core/Button.tsx
6
+ var SIZE = {
7
+ sm: { height: 36, padding: "0 14px", fontSize: 13 },
8
+ md: { height: 40, padding: "0 16px", fontSize: 14 },
9
+ lg: { height: 48, padding: "0 20px", fontSize: 15 }
10
+ };
11
+ var VARIANT_CLASS = {
12
+ primary: "btn-primary",
13
+ secondary: "btn-secondary",
14
+ ghost: "btn-ghost"
15
+ };
16
+ function Button({
17
+ children,
18
+ variant = "primary",
19
+ size = "md",
20
+ icon = null,
21
+ iconRight = null,
22
+ disabled = false,
23
+ type = "button",
24
+ onClick,
25
+ style,
26
+ ...rest
27
+ }) {
28
+ const cls = VARIANT_CLASS[variant] ?? VARIANT_CLASS.primary;
29
+ const s = SIZE[size] ?? SIZE.md;
30
+ return /* @__PURE__ */ jsxRuntime.jsxs(
31
+ "button",
32
+ {
33
+ type,
34
+ className: cls,
35
+ disabled,
36
+ onClick,
37
+ style: {
38
+ height: s.height,
39
+ padding: s.padding,
40
+ fontSize: s.fontSize,
41
+ opacity: disabled ? 0.55 : 1,
42
+ cursor: disabled ? "not-allowed" : "pointer",
43
+ ...style
44
+ },
45
+ ...rest,
46
+ children: [
47
+ icon ? /* @__PURE__ */ jsxRuntime.jsx("span", { style: { display: "inline-flex" }, "aria-hidden": "true", children: icon }) : null,
48
+ children,
49
+ iconRight ? /* @__PURE__ */ jsxRuntime.jsx("span", { style: { display: "inline-flex" }, "aria-hidden": "true", children: iconRight }) : null
50
+ ]
51
+ }
52
+ );
53
+ }
54
+
55
+ exports.Button = Button;
56
+ //# sourceMappingURL=Button.cjs.map
57
+ //# sourceMappingURL=Button.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/core/Button.tsx"],"names":["jsxs","jsx"],"mappings":";;;;;AAIA,IAAM,IAAA,GAAO;AAAA,EACX,IAAI,EAAE,MAAA,EAAQ,IAAI,OAAA,EAAS,QAAA,EAAU,UAAU,EAAA,EAAG;AAAA,EAClD,IAAI,EAAE,MAAA,EAAQ,IAAI,OAAA,EAAS,QAAA,EAAU,UAAU,EAAA,EAAG;AAAA,EAClD,IAAI,EAAE,MAAA,EAAQ,IAAI,OAAA,EAAS,QAAA,EAAU,UAAU,EAAA;AACjD,CAAA;AAEA,IAAM,aAAA,GAAgB;AAAA,EACpB,OAAA,EAAS,aAAA;AAAA,EACT,SAAA,EAAW,eAAA;AAAA,EACX,KAAA,EAAO;AACT,CAAA;AAuBO,SAAS,MAAA,CAAO;AAAA,EACrB,QAAA;AAAA,EACA,OAAA,GAAU,SAAA;AAAA,EACV,IAAA,GAAO,IAAA;AAAA,EACP,IAAA,GAAO,IAAA;AAAA,EACP,SAAA,GAAY,IAAA;AAAA,EACZ,QAAA,GAAW,KAAA;AAAA,EACX,IAAA,GAAO,QAAA;AAAA,EACP,OAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAgB;AACd,EAAA,MAAM,GAAA,GAAM,aAAA,CAAc,OAAO,CAAA,IAAK,aAAA,CAAc,OAAA;AACpD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA,IAAK,IAAA,CAAK,EAAA;AAC7B,EAAA,uBACEA,eAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,SAAA,EAAW,GAAA;AAAA,MACX,QAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACL,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,SAAS,CAAA,CAAE,OAAA;AAAA,QACX,UAAU,CAAA,CAAE,QAAA;AAAA,QACZ,OAAA,EAAS,WAAW,IAAA,GAAO,CAAA;AAAA,QAC3B,MAAA,EAAQ,WAAW,aAAA,GAAgB,SAAA;AAAA,QACnC,GAAG;AAAA,OACL;AAAA,MACC,GAAG,IAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,IAAA,mBAAOC,cAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,OAAA,EAAS,eAAc,EAAG,aAAA,EAAY,MAAA,EAAQ,QAAA,EAAA,IAAA,EAAK,CAAA,GAAU,IAAA;AAAA,QACnF,QAAA;AAAA,QACA,SAAA,mBAAYA,cAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,OAAA,EAAS,aAAA,EAAc,EAAG,aAAA,EAAY,MAAA,EAAQ,QAAA,EAAA,SAAA,EAAU,CAAA,GAAU;AAAA;AAAA;AAAA,GAChG;AAEJ","file":"Button.cjs","sourcesContent":["import type { ButtonHTMLAttributes, CSSProperties, ReactNode } from 'react';\n\n/* Height grid (px) per size — matches the fill-based button recipe in base.css.\n Horizontal padding only; vertical centering comes from the fixed height. */\nconst SIZE = {\n sm: { height: 36, padding: '0 14px', fontSize: 13 },\n md: { height: 40, padding: '0 16px', fontSize: 14 },\n lg: { height: 48, padding: '0 20px', fontSize: 15 },\n};\n\nconst VARIANT_CLASS = {\n primary: 'btn-primary',\n secondary: 'btn-secondary',\n ghost: 'btn-ghost',\n};\n\nexport interface ButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'type'> {\n children?: ReactNode;\n /** primary = the one strongest action; secondary = regular; ghost = low-emphasis. */\n variant?: 'primary' | 'secondary' | 'ghost';\n size?: 'sm' | 'md' | 'lg';\n /** Lucide icon element placed before the label. */\n icon?: ReactNode;\n /** Lucide icon element placed after the label. */\n iconRight?: ReactNode;\n disabled?: boolean;\n type?: 'button' | 'submit' | 'reset';\n style?: CSSProperties;\n}\n\n/**\n * Bridger button. Primary is the single strongest action per screen;\n * secondary for regular actions; ghost for low-emphasis commands.\n *\n * The one strongest action per screen uses variant=\"primary\" (persimmon).\n * @startingPoint section=\"Core\" subtitle=\"Primary / secondary / ghost actions\" viewport=\"700x140\"\n */\nexport function Button({\n children,\n variant = 'primary',\n size = 'md',\n icon = null,\n iconRight = null,\n disabled = false,\n type = 'button',\n onClick,\n style,\n ...rest\n}: ButtonProps) {\n const cls = VARIANT_CLASS[variant] ?? VARIANT_CLASS.primary;\n const s = SIZE[size] ?? SIZE.md;\n return (\n <button\n type={type}\n className={cls}\n disabled={disabled}\n onClick={onClick}\n style={{\n height: s.height,\n padding: s.padding,\n fontSize: s.fontSize,\n opacity: disabled ? 0.55 : 1,\n cursor: disabled ? 'not-allowed' : 'pointer',\n ...style,\n }}\n {...rest}\n >\n {icon ? <span style={{ display: 'inline-flex' }} aria-hidden=\"true\">{icon}</span> : null}\n {children}\n {iconRight ? <span style={{ display: 'inline-flex' }} aria-hidden=\"true\">{iconRight}</span> : null}\n </button>\n );\n}\n"]}
@@ -0,0 +1,26 @@
1
+ import * as react from 'react';
2
+ import { ButtonHTMLAttributes, ReactNode, CSSProperties } from 'react';
3
+
4
+ interface ButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'type'> {
5
+ children?: ReactNode;
6
+ /** primary = the one strongest action; secondary = regular; ghost = low-emphasis. */
7
+ variant?: 'primary' | 'secondary' | 'ghost';
8
+ size?: 'sm' | 'md' | 'lg';
9
+ /** Lucide icon element placed before the label. */
10
+ icon?: ReactNode;
11
+ /** Lucide icon element placed after the label. */
12
+ iconRight?: ReactNode;
13
+ disabled?: boolean;
14
+ type?: 'button' | 'submit' | 'reset';
15
+ style?: CSSProperties;
16
+ }
17
+ /**
18
+ * Bridger button. Primary is the single strongest action per screen;
19
+ * secondary for regular actions; ghost for low-emphasis commands.
20
+ *
21
+ * The one strongest action per screen uses variant="primary" (persimmon).
22
+ * @startingPoint section="Core" subtitle="Primary / secondary / ghost actions" viewport="700x140"
23
+ */
24
+ declare function Button({ children, variant, size, icon, iconRight, disabled, type, onClick, style, ...rest }: ButtonProps): react.JSX.Element;
25
+
26
+ export { Button, type ButtonProps };
@@ -0,0 +1,26 @@
1
+ import * as react from 'react';
2
+ import { ButtonHTMLAttributes, ReactNode, CSSProperties } from 'react';
3
+
4
+ interface ButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'type'> {
5
+ children?: ReactNode;
6
+ /** primary = the one strongest action; secondary = regular; ghost = low-emphasis. */
7
+ variant?: 'primary' | 'secondary' | 'ghost';
8
+ size?: 'sm' | 'md' | 'lg';
9
+ /** Lucide icon element placed before the label. */
10
+ icon?: ReactNode;
11
+ /** Lucide icon element placed after the label. */
12
+ iconRight?: ReactNode;
13
+ disabled?: boolean;
14
+ type?: 'button' | 'submit' | 'reset';
15
+ style?: CSSProperties;
16
+ }
17
+ /**
18
+ * Bridger button. Primary is the single strongest action per screen;
19
+ * secondary for regular actions; ghost for low-emphasis commands.
20
+ *
21
+ * The one strongest action per screen uses variant="primary" (persimmon).
22
+ * @startingPoint section="Core" subtitle="Primary / secondary / ghost actions" viewport="700x140"
23
+ */
24
+ declare function Button({ children, variant, size, icon, iconRight, disabled, type, onClick, style, ...rest }: ButtonProps): react.JSX.Element;
25
+
26
+ export { Button, type ButtonProps };
@@ -0,0 +1,55 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+
3
+ // src/components/core/Button.tsx
4
+ var SIZE = {
5
+ sm: { height: 36, padding: "0 14px", fontSize: 13 },
6
+ md: { height: 40, padding: "0 16px", fontSize: 14 },
7
+ lg: { height: 48, padding: "0 20px", fontSize: 15 }
8
+ };
9
+ var VARIANT_CLASS = {
10
+ primary: "btn-primary",
11
+ secondary: "btn-secondary",
12
+ ghost: "btn-ghost"
13
+ };
14
+ function Button({
15
+ children,
16
+ variant = "primary",
17
+ size = "md",
18
+ icon = null,
19
+ iconRight = null,
20
+ disabled = false,
21
+ type = "button",
22
+ onClick,
23
+ style,
24
+ ...rest
25
+ }) {
26
+ const cls = VARIANT_CLASS[variant] ?? VARIANT_CLASS.primary;
27
+ const s = SIZE[size] ?? SIZE.md;
28
+ return /* @__PURE__ */ jsxs(
29
+ "button",
30
+ {
31
+ type,
32
+ className: cls,
33
+ disabled,
34
+ onClick,
35
+ style: {
36
+ height: s.height,
37
+ padding: s.padding,
38
+ fontSize: s.fontSize,
39
+ opacity: disabled ? 0.55 : 1,
40
+ cursor: disabled ? "not-allowed" : "pointer",
41
+ ...style
42
+ },
43
+ ...rest,
44
+ children: [
45
+ icon ? /* @__PURE__ */ jsx("span", { style: { display: "inline-flex" }, "aria-hidden": "true", children: icon }) : null,
46
+ children,
47
+ iconRight ? /* @__PURE__ */ jsx("span", { style: { display: "inline-flex" }, "aria-hidden": "true", children: iconRight }) : null
48
+ ]
49
+ }
50
+ );
51
+ }
52
+
53
+ export { Button };
54
+ //# sourceMappingURL=Button.mjs.map
55
+ //# sourceMappingURL=Button.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/core/Button.tsx"],"names":[],"mappings":";;;AAIA,IAAM,IAAA,GAAO;AAAA,EACX,IAAI,EAAE,MAAA,EAAQ,IAAI,OAAA,EAAS,QAAA,EAAU,UAAU,EAAA,EAAG;AAAA,EAClD,IAAI,EAAE,MAAA,EAAQ,IAAI,OAAA,EAAS,QAAA,EAAU,UAAU,EAAA,EAAG;AAAA,EAClD,IAAI,EAAE,MAAA,EAAQ,IAAI,OAAA,EAAS,QAAA,EAAU,UAAU,EAAA;AACjD,CAAA;AAEA,IAAM,aAAA,GAAgB;AAAA,EACpB,OAAA,EAAS,aAAA;AAAA,EACT,SAAA,EAAW,eAAA;AAAA,EACX,KAAA,EAAO;AACT,CAAA;AAuBO,SAAS,MAAA,CAAO;AAAA,EACrB,QAAA;AAAA,EACA,OAAA,GAAU,SAAA;AAAA,EACV,IAAA,GAAO,IAAA;AAAA,EACP,IAAA,GAAO,IAAA;AAAA,EACP,SAAA,GAAY,IAAA;AAAA,EACZ,QAAA,GAAW,KAAA;AAAA,EACX,IAAA,GAAO,QAAA;AAAA,EACP,OAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAgB;AACd,EAAA,MAAM,GAAA,GAAM,aAAA,CAAc,OAAO,CAAA,IAAK,aAAA,CAAc,OAAA;AACpD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA,IAAK,IAAA,CAAK,EAAA;AAC7B,EAAA,uBACE,IAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,SAAA,EAAW,GAAA;AAAA,MACX,QAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACL,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,SAAS,CAAA,CAAE,OAAA;AAAA,QACX,UAAU,CAAA,CAAE,QAAA;AAAA,QACZ,OAAA,EAAS,WAAW,IAAA,GAAO,CAAA;AAAA,QAC3B,MAAA,EAAQ,WAAW,aAAA,GAAgB,SAAA;AAAA,QACnC,GAAG;AAAA,OACL;AAAA,MACC,GAAG,IAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,IAAA,mBAAO,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,OAAA,EAAS,eAAc,EAAG,aAAA,EAAY,MAAA,EAAQ,QAAA,EAAA,IAAA,EAAK,CAAA,GAAU,IAAA;AAAA,QACnF,QAAA;AAAA,QACA,SAAA,mBAAY,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,OAAA,EAAS,aAAA,EAAc,EAAG,aAAA,EAAY,MAAA,EAAQ,QAAA,EAAA,SAAA,EAAU,CAAA,GAAU;AAAA;AAAA;AAAA,GAChG;AAEJ","file":"Button.mjs","sourcesContent":["import type { ButtonHTMLAttributes, CSSProperties, ReactNode } from 'react';\n\n/* Height grid (px) per size — matches the fill-based button recipe in base.css.\n Horizontal padding only; vertical centering comes from the fixed height. */\nconst SIZE = {\n sm: { height: 36, padding: '0 14px', fontSize: 13 },\n md: { height: 40, padding: '0 16px', fontSize: 14 },\n lg: { height: 48, padding: '0 20px', fontSize: 15 },\n};\n\nconst VARIANT_CLASS = {\n primary: 'btn-primary',\n secondary: 'btn-secondary',\n ghost: 'btn-ghost',\n};\n\nexport interface ButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'type'> {\n children?: ReactNode;\n /** primary = the one strongest action; secondary = regular; ghost = low-emphasis. */\n variant?: 'primary' | 'secondary' | 'ghost';\n size?: 'sm' | 'md' | 'lg';\n /** Lucide icon element placed before the label. */\n icon?: ReactNode;\n /** Lucide icon element placed after the label. */\n iconRight?: ReactNode;\n disabled?: boolean;\n type?: 'button' | 'submit' | 'reset';\n style?: CSSProperties;\n}\n\n/**\n * Bridger button. Primary is the single strongest action per screen;\n * secondary for regular actions; ghost for low-emphasis commands.\n *\n * The one strongest action per screen uses variant=\"primary\" (persimmon).\n * @startingPoint section=\"Core\" subtitle=\"Primary / secondary / ghost actions\" viewport=\"700x140\"\n */\nexport function Button({\n children,\n variant = 'primary',\n size = 'md',\n icon = null,\n iconRight = null,\n disabled = false,\n type = 'button',\n onClick,\n style,\n ...rest\n}: ButtonProps) {\n const cls = VARIANT_CLASS[variant] ?? VARIANT_CLASS.primary;\n const s = SIZE[size] ?? SIZE.md;\n return (\n <button\n type={type}\n className={cls}\n disabled={disabled}\n onClick={onClick}\n style={{\n height: s.height,\n padding: s.padding,\n fontSize: s.fontSize,\n opacity: disabled ? 0.55 : 1,\n cursor: disabled ? 'not-allowed' : 'pointer',\n ...style,\n }}\n {...rest}\n >\n {icon ? <span style={{ display: 'inline-flex' }} aria-hidden=\"true\">{icon}</span> : null}\n {children}\n {iconRight ? <span style={{ display: 'inline-flex' }} aria-hidden=\"true\">{iconRight}</span> : null}\n </button>\n );\n}\n"]}
@@ -0,0 +1,57 @@
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 CardTone = {
10
+ Default: "default",
11
+ Muted: "muted",
12
+ Raised: "raised",
13
+ Panel: "panel"
14
+ };
15
+ var VARIANT_STYLE = {
16
+ default: { background: "var(--dt-surface)", boxShadow: "var(--dt-card-rest)" },
17
+ muted: { background: "var(--dt-surface-sunken)" },
18
+ raised: { background: "var(--dt-surface-raised)", boxShadow: "var(--dt-card-float)" },
19
+ panel: { background: "var(--dt-surface)", boxShadow: "var(--dt-shadow-xs)" }
20
+ };
21
+ function Card({
22
+ children,
23
+ variant,
24
+ tone,
25
+ interactive = false,
26
+ padding = 20,
27
+ className,
28
+ style,
29
+ ...rest
30
+ }) {
31
+ const selectedTone = tone ?? variant ?? CardTone.Default;
32
+ const v = VARIANT_STYLE[selectedTone] ?? VARIANT_STYLE[CardTone.Default];
33
+ return /* @__PURE__ */ jsxRuntime.jsxs(
34
+ "div",
35
+ {
36
+ className: cx(interactive && "dt-card-interactive", className),
37
+ style: {
38
+ borderRadius: "var(--dt-radius-lg)",
39
+ color: "var(--dt-ink)",
40
+ padding,
41
+ transition: "box-shadow var(--dt-motion), background-color var(--dt-motion)",
42
+ ...v,
43
+ ...style
44
+ },
45
+ ...rest,
46
+ children: [
47
+ children,
48
+ interactive ? /* @__PURE__ */ jsxRuntime.jsx("style", { children: ".dt-card-interactive:hover{box-shadow:var(--dt-card-hover)}" }) : null
49
+ ]
50
+ }
51
+ );
52
+ }
53
+
54
+ exports.Card = Card;
55
+ exports.CardTone = CardTone;
56
+ //# sourceMappingURL=Card.cjs.map
57
+ //# sourceMappingURL=Card.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/cx.ts","../../../src/components/core/Card.tsx"],"names":["jsxs","jsx"],"mappings":";;;;;AAAO,SAAS,MAAM,OAAA,EAA2D;AAC/E,EAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AACzC;ACCO,IAAM,QAAA,GAAW;AAAA,EACtB,OAAA,EAAS,SAAA;AAAA,EACT,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,KAAA,EAAO;AACT;AAIA,IAAM,aAAA,GAAgB;AAAA,EACpB,OAAA,EAAS,EAAE,UAAA,EAAY,mBAAA,EAAqB,WAAW,qBAAA,EAAsB;AAAA,EAC7E,KAAA,EAAO,EAAE,UAAA,EAAY,0BAAA,EAA2B;AAAA,EAChD,MAAA,EAAQ,EAAE,UAAA,EAAY,0BAAA,EAA4B,WAAW,sBAAA,EAAuB;AAAA,EACpF,KAAA,EAAO,EAAE,UAAA,EAAY,mBAAA,EAAqB,WAAW,qBAAA;AACvD,CAAA;AAiBO,SAAS,IAAA,CAAK;AAAA,EACnB,QAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd,OAAA,GAAU,EAAA;AAAA,EACV,SAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAc;AACZ,EAAA,MAAM,YAAA,GAAe,IAAA,IAAQ,OAAA,IAAW,QAAA,CAAS,OAAA;AACjD,EAAA,MAAM,IAAI,aAAA,CAAc,YAAY,CAAA,IAAK,aAAA,CAAc,SAAS,OAAO,CAAA;AACvE,EAAA,uBACEA,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA,CAAG,WAAA,IAAe,qBAAA,EAAuB,SAAS,CAAA;AAAA,MAC7D,KAAA,EAAO;AAAA,QACL,YAAA,EAAc,qBAAA;AAAA,QACd,KAAA,EAAO,eAAA;AAAA,QACP,OAAA;AAAA,QACA,UAAA,EAAY,gEAAA;AAAA,QACZ,GAAG,CAAA;AAAA,QACH,GAAG;AAAA,OACL;AAAA,MACC,GAAG,IAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,QACA,WAAA,mBACCC,cAAA,CAAC,OAAA,EAAA,EAAO,QAAA,EAAA,6DAAA,EAA8D,CAAA,GACpE;AAAA;AAAA;AAAA,GACN;AAEJ","file":"Card.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 CardTone = {\n Default: 'default',\n Muted: 'muted',\n Raised: 'raised',\n Panel: 'panel',\n} as const;\n\nexport type CardTone = (typeof CardTone)[keyof typeof CardTone];\n\nconst VARIANT_STYLE = {\n default: { background: 'var(--dt-surface)', boxShadow: 'var(--dt-card-rest)' },\n muted: { background: 'var(--dt-surface-sunken)' },\n raised: { background: 'var(--dt-surface-raised)', boxShadow: 'var(--dt-card-float)' },\n panel: { background: 'var(--dt-surface)', boxShadow: 'var(--dt-shadow-xs)' },\n} satisfies Record<CardTone, CSSProperties>;\n\nexport interface CardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'style'> {\n children?: ReactNode;\n /** default = surface + subtle shadow; muted = sunken well; raised = elevated; panel = flat console panel. */\n variant?: CardTone;\n tone?: CardTone;\n /** Strengthen border + lift surface on hover (for clickable rows/cards). */\n interactive?: boolean;\n padding?: number;\n style?: CSSProperties;\n}\n\n/**\n * Surface container. Use for repeated items, modals, and genuinely framed\n * tools — not as a decorative wrapper. `panel` is the flatter console variant.\n */\nexport function Card({\n children,\n variant,\n tone,\n interactive = false,\n padding = 20,\n className,\n style,\n ...rest\n}: CardProps) {\n const selectedTone = tone ?? variant ?? CardTone.Default;\n const v = VARIANT_STYLE[selectedTone] ?? VARIANT_STYLE[CardTone.Default];\n return (\n <div\n className={cx(interactive && 'dt-card-interactive', className)}\n style={{\n borderRadius: 'var(--dt-radius-lg)',\n color: 'var(--dt-ink)',\n padding,\n transition: 'box-shadow var(--dt-motion), background-color var(--dt-motion)',\n ...v,\n ...style,\n }}\n {...rest}\n >\n {children}\n {interactive ? (\n <style>{'.dt-card-interactive:hover{box-shadow:var(--dt-card-hover)}'}</style>\n ) : null}\n </div>\n );\n}\n"]}
@@ -0,0 +1,27 @@
1
+ import * as react from 'react';
2
+ import { HTMLAttributes, ReactNode, CSSProperties } from 'react';
3
+
4
+ declare const CardTone: {
5
+ readonly Default: "default";
6
+ readonly Muted: "muted";
7
+ readonly Raised: "raised";
8
+ readonly Panel: "panel";
9
+ };
10
+ type CardTone = (typeof CardTone)[keyof typeof CardTone];
11
+ interface CardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'style'> {
12
+ children?: ReactNode;
13
+ /** default = surface + subtle shadow; muted = sunken well; raised = elevated; panel = flat console panel. */
14
+ variant?: CardTone;
15
+ tone?: CardTone;
16
+ /** Strengthen border + lift surface on hover (for clickable rows/cards). */
17
+ interactive?: boolean;
18
+ padding?: number;
19
+ style?: CSSProperties;
20
+ }
21
+ /**
22
+ * Surface container. Use for repeated items, modals, and genuinely framed
23
+ * tools — not as a decorative wrapper. `panel` is the flatter console variant.
24
+ */
25
+ declare function Card({ children, variant, tone, interactive, padding, className, style, ...rest }: CardProps): react.JSX.Element;
26
+
27
+ export { Card, type CardProps, CardTone };
@@ -0,0 +1,27 @@
1
+ import * as react from 'react';
2
+ import { HTMLAttributes, ReactNode, CSSProperties } from 'react';
3
+
4
+ declare const CardTone: {
5
+ readonly Default: "default";
6
+ readonly Muted: "muted";
7
+ readonly Raised: "raised";
8
+ readonly Panel: "panel";
9
+ };
10
+ type CardTone = (typeof CardTone)[keyof typeof CardTone];
11
+ interface CardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'style'> {
12
+ children?: ReactNode;
13
+ /** default = surface + subtle shadow; muted = sunken well; raised = elevated; panel = flat console panel. */
14
+ variant?: CardTone;
15
+ tone?: CardTone;
16
+ /** Strengthen border + lift surface on hover (for clickable rows/cards). */
17
+ interactive?: boolean;
18
+ padding?: number;
19
+ style?: CSSProperties;
20
+ }
21
+ /**
22
+ * Surface container. Use for repeated items, modals, and genuinely framed
23
+ * tools — not as a decorative wrapper. `panel` is the flatter console variant.
24
+ */
25
+ declare function Card({ children, variant, tone, interactive, padding, className, style, ...rest }: CardProps): react.JSX.Element;
26
+
27
+ export { Card, type CardProps, CardTone };
@@ -0,0 +1,54 @@
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 CardTone = {
8
+ Default: "default",
9
+ Muted: "muted",
10
+ Raised: "raised",
11
+ Panel: "panel"
12
+ };
13
+ var VARIANT_STYLE = {
14
+ default: { background: "var(--dt-surface)", boxShadow: "var(--dt-card-rest)" },
15
+ muted: { background: "var(--dt-surface-sunken)" },
16
+ raised: { background: "var(--dt-surface-raised)", boxShadow: "var(--dt-card-float)" },
17
+ panel: { background: "var(--dt-surface)", boxShadow: "var(--dt-shadow-xs)" }
18
+ };
19
+ function Card({
20
+ children,
21
+ variant,
22
+ tone,
23
+ interactive = false,
24
+ padding = 20,
25
+ className,
26
+ style,
27
+ ...rest
28
+ }) {
29
+ const selectedTone = tone ?? variant ?? CardTone.Default;
30
+ const v = VARIANT_STYLE[selectedTone] ?? VARIANT_STYLE[CardTone.Default];
31
+ return /* @__PURE__ */ jsxs(
32
+ "div",
33
+ {
34
+ className: cx(interactive && "dt-card-interactive", className),
35
+ style: {
36
+ borderRadius: "var(--dt-radius-lg)",
37
+ color: "var(--dt-ink)",
38
+ padding,
39
+ transition: "box-shadow var(--dt-motion), background-color var(--dt-motion)",
40
+ ...v,
41
+ ...style
42
+ },
43
+ ...rest,
44
+ children: [
45
+ children,
46
+ interactive ? /* @__PURE__ */ jsx("style", { children: ".dt-card-interactive:hover{box-shadow:var(--dt-card-hover)}" }) : null
47
+ ]
48
+ }
49
+ );
50
+ }
51
+
52
+ export { Card, CardTone };
53
+ //# sourceMappingURL=Card.mjs.map
54
+ //# sourceMappingURL=Card.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/cx.ts","../../../src/components/core/Card.tsx"],"names":[],"mappings":";;;AAAO,SAAS,MAAM,OAAA,EAA2D;AAC/E,EAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AACzC;ACCO,IAAM,QAAA,GAAW;AAAA,EACtB,OAAA,EAAS,SAAA;AAAA,EACT,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,KAAA,EAAO;AACT;AAIA,IAAM,aAAA,GAAgB;AAAA,EACpB,OAAA,EAAS,EAAE,UAAA,EAAY,mBAAA,EAAqB,WAAW,qBAAA,EAAsB;AAAA,EAC7E,KAAA,EAAO,EAAE,UAAA,EAAY,0BAAA,EAA2B;AAAA,EAChD,MAAA,EAAQ,EAAE,UAAA,EAAY,0BAAA,EAA4B,WAAW,sBAAA,EAAuB;AAAA,EACpF,KAAA,EAAO,EAAE,UAAA,EAAY,mBAAA,EAAqB,WAAW,qBAAA;AACvD,CAAA;AAiBO,SAAS,IAAA,CAAK;AAAA,EACnB,QAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd,OAAA,GAAU,EAAA;AAAA,EACV,SAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAc;AACZ,EAAA,MAAM,YAAA,GAAe,IAAA,IAAQ,OAAA,IAAW,QAAA,CAAS,OAAA;AACjD,EAAA,MAAM,IAAI,aAAA,CAAc,YAAY,CAAA,IAAK,aAAA,CAAc,SAAS,OAAO,CAAA;AACvE,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA,CAAG,WAAA,IAAe,qBAAA,EAAuB,SAAS,CAAA;AAAA,MAC7D,KAAA,EAAO;AAAA,QACL,YAAA,EAAc,qBAAA;AAAA,QACd,KAAA,EAAO,eAAA;AAAA,QACP,OAAA;AAAA,QACA,UAAA,EAAY,gEAAA;AAAA,QACZ,GAAG,CAAA;AAAA,QACH,GAAG;AAAA,OACL;AAAA,MACC,GAAG,IAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,QACA,WAAA,mBACC,GAAA,CAAC,OAAA,EAAA,EAAO,QAAA,EAAA,6DAAA,EAA8D,CAAA,GACpE;AAAA;AAAA;AAAA,GACN;AAEJ","file":"Card.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 CardTone = {\n Default: 'default',\n Muted: 'muted',\n Raised: 'raised',\n Panel: 'panel',\n} as const;\n\nexport type CardTone = (typeof CardTone)[keyof typeof CardTone];\n\nconst VARIANT_STYLE = {\n default: { background: 'var(--dt-surface)', boxShadow: 'var(--dt-card-rest)' },\n muted: { background: 'var(--dt-surface-sunken)' },\n raised: { background: 'var(--dt-surface-raised)', boxShadow: 'var(--dt-card-float)' },\n panel: { background: 'var(--dt-surface)', boxShadow: 'var(--dt-shadow-xs)' },\n} satisfies Record<CardTone, CSSProperties>;\n\nexport interface CardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'style'> {\n children?: ReactNode;\n /** default = surface + subtle shadow; muted = sunken well; raised = elevated; panel = flat console panel. */\n variant?: CardTone;\n tone?: CardTone;\n /** Strengthen border + lift surface on hover (for clickable rows/cards). */\n interactive?: boolean;\n padding?: number;\n style?: CSSProperties;\n}\n\n/**\n * Surface container. Use for repeated items, modals, and genuinely framed\n * tools — not as a decorative wrapper. `panel` is the flatter console variant.\n */\nexport function Card({\n children,\n variant,\n tone,\n interactive = false,\n padding = 20,\n className,\n style,\n ...rest\n}: CardProps) {\n const selectedTone = tone ?? variant ?? CardTone.Default;\n const v = VARIANT_STYLE[selectedTone] ?? VARIANT_STYLE[CardTone.Default];\n return (\n <div\n className={cx(interactive && 'dt-card-interactive', className)}\n style={{\n borderRadius: 'var(--dt-radius-lg)',\n color: 'var(--dt-ink)',\n padding,\n transition: 'box-shadow var(--dt-motion), background-color var(--dt-motion)',\n ...v,\n ...style,\n }}\n {...rest}\n >\n {children}\n {interactive ? (\n <style>{'.dt-card-interactive:hover{box-shadow:var(--dt-card-hover)}'}</style>\n ) : null}\n </div>\n );\n}\n"]}
@@ -0,0 +1,54 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+
5
+ // src/components/core/FilterChip.tsx
6
+ function FilterChip({ label, count, active = false, removable = false, onToggle, onRemove, icon, style }) {
7
+ return /* @__PURE__ */ jsxRuntime.jsxs(
8
+ "button",
9
+ {
10
+ type: "button",
11
+ onClick: onToggle,
12
+ "aria-pressed": active,
13
+ style: {
14
+ display: "inline-flex",
15
+ alignItems: "center",
16
+ gap: 7,
17
+ height: 30,
18
+ padding: "0 10px",
19
+ borderRadius: "var(--dt-radius-sm)",
20
+ cursor: "pointer",
21
+ fontFamily: "var(--dt-font-sans)",
22
+ fontSize: 13,
23
+ fontWeight: active ? 650 : 500,
24
+ background: active ? "var(--dt-tint-accent)" : "var(--dt-surface)",
25
+ color: active ? "var(--dt-accent)" : "var(--dt-muted-strong)",
26
+ boxShadow: `inset 0 0 0 1px ${active ? "color-mix(in srgb, var(--dt-accent) 40%, transparent)" : "var(--dt-border-strong)"}`,
27
+ transition: "background-color var(--dt-motion-fast), box-shadow var(--dt-motion-fast)",
28
+ ...style
29
+ },
30
+ children: [
31
+ icon ? /* @__PURE__ */ jsxRuntime.jsx("span", { style: { display: "inline-flex", color: active ? "var(--dt-accent)" : "var(--dt-muted)" }, "aria-hidden": "true", children: icon }) : null,
32
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: label }),
33
+ count != null ? /* @__PURE__ */ jsxRuntime.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,
34
+ removable ? /* @__PURE__ */ jsxRuntime.jsx(
35
+ "span",
36
+ {
37
+ role: "button",
38
+ "aria-label": "\uC81C\uAC70",
39
+ onClick: (e) => {
40
+ e.stopPropagation();
41
+ onRemove?.();
42
+ },
43
+ style: { display: "inline-flex", marginRight: -2, color: active ? "var(--dt-accent)" : "var(--dt-muted)" },
44
+ children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M18 6L6 18M6 6l12 12", stroke: "currentColor", strokeWidth: "2.2", strokeLinecap: "round" }) })
45
+ }
46
+ ) : null
47
+ ]
48
+ }
49
+ );
50
+ }
51
+
52
+ exports.FilterChip = FilterChip;
53
+ //# sourceMappingURL=FilterChip.cjs.map
54
+ //# sourceMappingURL=FilterChip.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/core/FilterChip.tsx"],"names":["jsxs","jsx"],"mappings":";;;;;AAoBO,SAAS,UAAA,CAAW,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,GAAS,KAAA,EAAO,SAAA,GAAY,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,IAAA,EAAM,KAAA,EAAM,EAAoB;AAChI,EAAA,uBACEA,eAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,QAAA;AAAA,MACT,cAAA,EAAc,MAAA;AAAA,MACd,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,aAAA;AAAA,QAAe,UAAA,EAAY,QAAA;AAAA,QAAU,GAAA,EAAK,CAAA;AAAA,QAAG,MAAA,EAAQ,EAAA;AAAA,QAAI,OAAA,EAAS,QAAA;AAAA,QAC3E,YAAA,EAAc,qBAAA;AAAA,QAAuB,MAAA,EAAQ,SAAA;AAAA,QAC7C,UAAA,EAAY,qBAAA;AAAA,QAAuB,QAAA,EAAU,EAAA;AAAA,QAAI,UAAA,EAAY,SAAS,GAAA,GAAM,GAAA;AAAA,QAC5E,UAAA,EAAY,SAAS,uBAAA,GAA0B,mBAAA;AAAA,QAC/C,KAAA,EAAO,SAAS,kBAAA,GAAqB,wBAAA;AAAA,QACrC,SAAA,EAAW,CAAA,gBAAA,EAAmB,MAAA,GAAS,uDAAA,GAA0D,yBAAyB,CAAA,CAAA;AAAA,QAC1H,UAAA,EAAY,0EAAA;AAAA,QACZ,GAAG;AAAA,OACL;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,IAAA,mBAAOC,cAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,SAAS,aAAA,EAAe,KAAA,EAAO,MAAA,GAAS,kBAAA,GAAqB,iBAAA,EAAkB,EAAG,aAAA,EAAY,MAAA,EAAQ,gBAAK,CAAA,GAAU,IAAA;AAAA,wBAC5IA,cAAA,CAAC,UAAM,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,QACZ,KAAA,IAAS,uBACRA,cAAA,CAAC,MAAA,EAAA,EAAK,OAAO,EAAE,UAAA,EAAY,uBAAuB,QAAA,EAAU,EAAA,EAAI,YAAY,GAAA,EAAK,KAAA,EAAO,SAAS,kBAAA,GAAqB,iBAAA,EAAmB,oBAAoB,cAAA,EAAe,EAAI,iBAAM,CAAA,GACpL,IAAA;AAAA,QACH,SAAA,mBACCA,cAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YAAS,YAAA,EAAW,cAAA;AAAA,YACzB,OAAA,EAAS,CAAC,CAAA,KAAM;AAAE,cAAA,CAAA,CAAE,eAAA,EAAgB;AAAG,cAAA,QAAA,IAAW;AAAA,YAAG,CAAA;AAAA,YACrD,KAAA,EAAO,EAAE,OAAA,EAAS,aAAA,EAAe,aAAa,EAAA,EAAI,KAAA,EAAO,MAAA,GAAS,kBAAA,GAAqB,iBAAA,EAAkB;AAAA,YAEzG,QAAA,kBAAAA,cAAA,CAAC,SAAI,KAAA,EAAM,IAAA,EAAK,QAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,aAAA,EAAY,QAAO,QAAA,kBAAAA,cAAA,CAAC,MAAA,EAAA,EAAK,GAAE,sBAAA,EAAuB,MAAA,EAAO,gBAAe,WAAA,EAAY,KAAA,EAAM,aAAA,EAAc,OAAA,EAAQ,CAAA,EAAE;AAAA;AAAA,SAChL,GACE;AAAA;AAAA;AAAA,GACN;AAEJ","file":"FilterChip.cjs","sourcesContent":["import type { CSSProperties, ReactNode } from 'react';\n\nexport interface FilterChipProps {\n label: string;\n /** Trailing count, rendered tabular-mono. */\n count?: number;\n active?: boolean;\n removable?: boolean;\n onToggle?: () => void;\n onRemove?: () => void;\n icon?: ReactNode;\n style?: CSSProperties;\n}\n\n/**\n * FilterChip — a toggleable filter / tag for catalog facets (분야, 프로토콜, 상태).\n * Crisp small-radius tag with a hairline, NOT a rounded-full cushion. Active =\n * persimmon tint + border + bold. Optional count (mono) and a removable ✕.\n * @startingPoint section=\"Core\" subtitle=\"Toggleable catalog filter\" viewport=\"520x80\"\n */\nexport function FilterChip({ label, count, active = false, removable = false, onToggle, onRemove, icon, style }: FilterChipProps) {\n return (\n <button\n type=\"button\"\n onClick={onToggle}\n aria-pressed={active}\n style={{\n display: 'inline-flex', alignItems: 'center', gap: 7, height: 30, padding: '0 10px',\n borderRadius: 'var(--dt-radius-sm)', cursor: 'pointer',\n fontFamily: 'var(--dt-font-sans)', fontSize: 13, fontWeight: active ? 650 : 500,\n background: active ? 'var(--dt-tint-accent)' : 'var(--dt-surface)',\n color: active ? 'var(--dt-accent)' : 'var(--dt-muted-strong)',\n boxShadow: `inset 0 0 0 1px ${active ? 'color-mix(in srgb, var(--dt-accent) 40%, transparent)' : 'var(--dt-border-strong)'}`,\n transition: 'background-color var(--dt-motion-fast), box-shadow var(--dt-motion-fast)',\n ...style,\n }}\n >\n {icon ? <span style={{ display: 'inline-flex', color: active ? 'var(--dt-accent)' : 'var(--dt-muted)' }} aria-hidden=\"true\">{icon}</span> : null}\n <span>{label}</span>\n {count != null ? (\n <span style={{ fontFamily: 'var(--dt-font-mono)', fontSize: 11, fontWeight: 600, color: active ? 'var(--dt-accent)' : 'var(--dt-muted)', fontVariantNumeric: 'tabular-nums' }}>{count}</span>\n ) : null}\n {removable ? (\n <span\n role=\"button\" aria-label=\"제거\"\n onClick={(e) => { e.stopPropagation(); onRemove?.(); }}\n style={{ display: 'inline-flex', marginRight: -2, color: active ? 'var(--dt-accent)' : 'var(--dt-muted)' }}\n >\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\"><path d=\"M18 6L6 18M6 6l12 12\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" /></svg>\n </span>\n ) : null}\n </button>\n );\n}\n"]}