@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.
- package/README.md +62 -0
- package/dist/components/core/Badge.cjs +36 -0
- package/dist/components/core/Badge.cjs.map +1 -0
- package/dist/components/core/Badge.d.cts +18 -0
- package/dist/components/core/Badge.d.ts +18 -0
- package/dist/components/core/Badge.mjs +34 -0
- package/dist/components/core/Badge.mjs.map +1 -0
- package/dist/components/core/Button.cjs +57 -0
- package/dist/components/core/Button.cjs.map +1 -0
- package/dist/components/core/Button.d.cts +26 -0
- package/dist/components/core/Button.d.ts +26 -0
- package/dist/components/core/Button.mjs +55 -0
- package/dist/components/core/Button.mjs.map +1 -0
- package/dist/components/core/Card.cjs +57 -0
- package/dist/components/core/Card.cjs.map +1 -0
- package/dist/components/core/Card.d.cts +27 -0
- package/dist/components/core/Card.d.ts +27 -0
- package/dist/components/core/Card.mjs +54 -0
- package/dist/components/core/Card.mjs.map +1 -0
- package/dist/components/core/FilterChip.cjs +54 -0
- package/dist/components/core/FilterChip.cjs.map +1 -0
- package/dist/components/core/FilterChip.d.cts +23 -0
- package/dist/components/core/FilterChip.d.ts +23 -0
- package/dist/components/core/FilterChip.mjs +52 -0
- package/dist/components/core/FilterChip.mjs.map +1 -0
- package/dist/components/core/Input.cjs +67 -0
- package/dist/components/core/Input.cjs.map +1 -0
- package/dist/components/core/Input.d.cts +20 -0
- package/dist/components/core/Input.d.ts +20 -0
- package/dist/components/core/Input.mjs +65 -0
- package/dist/components/core/Input.mjs.map +1 -0
- package/dist/components/core/StatusPill.cjs +57 -0
- package/dist/components/core/StatusPill.cjs.map +1 -0
- package/dist/components/core/StatusPill.d.cts +19 -0
- package/dist/components/core/StatusPill.d.ts +19 -0
- package/dist/components/core/StatusPill.mjs +55 -0
- package/dist/components/core/StatusPill.mjs.map +1 -0
- package/dist/components/core/Surface.cjs +52 -0
- package/dist/components/core/Surface.cjs.map +1 -0
- package/dist/components/core/Surface.d.cts +24 -0
- package/dist/components/core/Surface.d.ts +24 -0
- package/dist/components/core/Surface.mjs +47 -0
- package/dist/components/core/Surface.mjs.map +1 -0
- package/dist/components/core/Tabs.cjs +64 -0
- package/dist/components/core/Tabs.cjs.map +1 -0
- package/dist/components/core/Tabs.d.cts +24 -0
- package/dist/components/core/Tabs.d.ts +24 -0
- package/dist/components/core/Tabs.mjs +62 -0
- package/dist/components/core/Tabs.mjs.map +1 -0
- package/dist/components/data/Avatar.cjs +40 -0
- package/dist/components/data/Avatar.cjs.map +1 -0
- package/dist/components/data/Avatar.d.cts +24 -0
- package/dist/components/data/Avatar.d.ts +24 -0
- package/dist/components/data/Avatar.mjs +38 -0
- package/dist/components/data/Avatar.mjs.map +1 -0
- package/dist/components/data/CodeBlock.cjs +92 -0
- package/dist/components/data/CodeBlock.cjs.map +1 -0
- package/dist/components/data/CodeBlock.d.cts +20 -0
- package/dist/components/data/CodeBlock.d.ts +20 -0
- package/dist/components/data/CodeBlock.mjs +90 -0
- package/dist/components/data/CodeBlock.mjs.map +1 -0
- package/dist/components/data/KeyValue.cjs +55 -0
- package/dist/components/data/KeyValue.cjs.map +1 -0
- package/dist/components/data/KeyValue.d.cts +24 -0
- package/dist/components/data/KeyValue.d.ts +24 -0
- package/dist/components/data/KeyValue.mjs +53 -0
- package/dist/components/data/KeyValue.mjs.map +1 -0
- package/dist/components/data/LogRow.cjs +55 -0
- package/dist/components/data/LogRow.cjs.map +1 -0
- package/dist/components/data/LogRow.d.cts +23 -0
- package/dist/components/data/LogRow.d.ts +23 -0
- package/dist/components/data/LogRow.mjs +53 -0
- package/dist/components/data/LogRow.mjs.map +1 -0
- package/dist/components/data/Pagination.cjs +44 -0
- package/dist/components/data/Pagination.cjs.map +1 -0
- package/dist/components/data/Pagination.d.cts +13 -0
- package/dist/components/data/Pagination.d.ts +13 -0
- package/dist/components/data/Pagination.mjs +42 -0
- package/dist/components/data/Pagination.mjs.map +1 -0
- package/dist/components/data/StatTile.cjs +20 -0
- package/dist/components/data/StatTile.cjs.map +1 -0
- package/dist/components/data/StatTile.d.cts +19 -0
- package/dist/components/data/StatTile.d.ts +19 -0
- package/dist/components/data/StatTile.mjs +18 -0
- package/dist/components/data/StatTile.mjs.map +1 -0
- package/dist/components/data/Table.cjs +45 -0
- package/dist/components/data/Table.cjs.map +1 -0
- package/dist/components/data/Table.d.cts +27 -0
- package/dist/components/data/Table.d.ts +27 -0
- package/dist/components/data/Table.mjs +43 -0
- package/dist/components/data/Table.mjs.map +1 -0
- package/dist/components/data/UsageMeter.cjs +28 -0
- package/dist/components/data/UsageMeter.cjs.map +1 -0
- package/dist/components/data/UsageMeter.d.cts +19 -0
- package/dist/components/data/UsageMeter.d.ts +19 -0
- package/dist/components/data/UsageMeter.mjs +26 -0
- package/dist/components/data/UsageMeter.mjs.map +1 -0
- package/dist/components/feedback/Alert.cjs +78 -0
- package/dist/components/feedback/Alert.cjs.map +1 -0
- package/dist/components/feedback/Alert.d.cts +29 -0
- package/dist/components/feedback/Alert.d.ts +29 -0
- package/dist/components/feedback/Alert.mjs +74 -0
- package/dist/components/feedback/Alert.mjs.map +1 -0
- package/dist/components/feedback/Dialog.cjs +62 -0
- package/dist/components/feedback/Dialog.cjs.map +1 -0
- package/dist/components/feedback/Dialog.d.cts +17 -0
- package/dist/components/feedback/Dialog.d.ts +17 -0
- package/dist/components/feedback/Dialog.mjs +60 -0
- package/dist/components/feedback/Dialog.mjs.map +1 -0
- package/dist/components/feedback/Drawer.cjs +58 -0
- package/dist/components/feedback/Drawer.cjs.map +1 -0
- package/dist/components/feedback/Drawer.d.cts +22 -0
- package/dist/components/feedback/Drawer.d.ts +22 -0
- package/dist/components/feedback/Drawer.mjs +56 -0
- package/dist/components/feedback/Drawer.mjs.map +1 -0
- package/dist/components/feedback/EmptyState.cjs +36 -0
- package/dist/components/feedback/EmptyState.cjs.map +1 -0
- package/dist/components/feedback/EmptyState.d.cts +14 -0
- package/dist/components/feedback/EmptyState.d.ts +14 -0
- package/dist/components/feedback/EmptyState.mjs +34 -0
- package/dist/components/feedback/EmptyState.mjs.map +1 -0
- package/dist/components/feedback/Skeleton.cjs +19 -0
- package/dist/components/feedback/Skeleton.cjs.map +1 -0
- package/dist/components/feedback/Skeleton.d.cts +12 -0
- package/dist/components/feedback/Skeleton.d.ts +12 -0
- package/dist/components/feedback/Skeleton.mjs +17 -0
- package/dist/components/feedback/Skeleton.mjs.map +1 -0
- package/dist/components/feedback/Spinner.cjs +17 -0
- package/dist/components/feedback/Spinner.cjs.map +1 -0
- package/dist/components/feedback/Spinner.d.cts +12 -0
- package/dist/components/feedback/Spinner.d.ts +12 -0
- package/dist/components/feedback/Spinner.mjs +15 -0
- package/dist/components/feedback/Spinner.mjs.map +1 -0
- package/dist/components/feedback/Toast.cjs +32 -0
- package/dist/components/feedback/Toast.cjs.map +1 -0
- package/dist/components/feedback/Toast.d.cts +20 -0
- package/dist/components/feedback/Toast.d.ts +20 -0
- package/dist/components/feedback/Toast.mjs +30 -0
- package/dist/components/feedback/Toast.mjs.map +1 -0
- package/dist/components/feedback/Tooltip.cjs +51 -0
- package/dist/components/feedback/Tooltip.cjs.map +1 -0
- package/dist/components/feedback/Tooltip.d.cts +11 -0
- package/dist/components/feedback/Tooltip.d.ts +11 -0
- package/dist/components/feedback/Tooltip.mjs +49 -0
- package/dist/components/feedback/Tooltip.mjs.map +1 -0
- package/dist/components/forms/Checkbox.cjs +74 -0
- package/dist/components/forms/Checkbox.cjs.map +1 -0
- package/dist/components/forms/Checkbox.d.cts +16 -0
- package/dist/components/forms/Checkbox.d.ts +16 -0
- package/dist/components/forms/Checkbox.mjs +72 -0
- package/dist/components/forms/Checkbox.mjs.map +1 -0
- package/dist/components/forms/Combobox.cjs +217 -0
- package/dist/components/forms/Combobox.cjs.map +1 -0
- package/dist/components/forms/Combobox.d.cts +27 -0
- package/dist/components/forms/Combobox.d.ts +27 -0
- package/dist/components/forms/Combobox.mjs +215 -0
- package/dist/components/forms/Combobox.mjs.map +1 -0
- package/dist/components/forms/FileUpload.cjs +187 -0
- package/dist/components/forms/FileUpload.cjs.map +1 -0
- package/dist/components/forms/FileUpload.d.cts +26 -0
- package/dist/components/forms/FileUpload.d.ts +26 -0
- package/dist/components/forms/FileUpload.mjs +185 -0
- package/dist/components/forms/FileUpload.mjs.map +1 -0
- package/dist/components/forms/RadioGroup.cjs +73 -0
- package/dist/components/forms/RadioGroup.cjs.map +1 -0
- package/dist/components/forms/RadioGroup.d.cts +21 -0
- package/dist/components/forms/RadioGroup.d.ts +21 -0
- package/dist/components/forms/RadioGroup.mjs +71 -0
- package/dist/components/forms/RadioGroup.mjs.map +1 -0
- package/dist/components/forms/SegmentedControl.cjs +67 -0
- package/dist/components/forms/SegmentedControl.cjs.map +1 -0
- package/dist/components/forms/SegmentedControl.d.cts +19 -0
- package/dist/components/forms/SegmentedControl.d.ts +19 -0
- package/dist/components/forms/SegmentedControl.mjs +65 -0
- package/dist/components/forms/SegmentedControl.mjs.map +1 -0
- package/dist/components/forms/Select.cjs +67 -0
- package/dist/components/forms/Select.cjs.map +1 -0
- package/dist/components/forms/Select.d.cts +23 -0
- package/dist/components/forms/Select.d.ts +23 -0
- package/dist/components/forms/Select.mjs +65 -0
- package/dist/components/forms/Select.mjs.map +1 -0
- package/dist/components/forms/Slider.cjs +129 -0
- package/dist/components/forms/Slider.cjs.map +1 -0
- package/dist/components/forms/Slider.d.cts +24 -0
- package/dist/components/forms/Slider.d.ts +24 -0
- package/dist/components/forms/Slider.mjs +127 -0
- package/dist/components/forms/Slider.mjs.map +1 -0
- package/dist/components/forms/Switch.cjs +101 -0
- package/dist/components/forms/Switch.cjs.map +1 -0
- package/dist/components/forms/Switch.d.cts +24 -0
- package/dist/components/forms/Switch.d.ts +24 -0
- package/dist/components/forms/Switch.mjs +98 -0
- package/dist/components/forms/Switch.mjs.map +1 -0
- package/dist/components/forms/Textarea.cjs +35 -0
- package/dist/components/forms/Textarea.cjs.map +1 -0
- package/dist/components/forms/Textarea.d.cts +15 -0
- package/dist/components/forms/Textarea.d.ts +15 -0
- package/dist/components/forms/Textarea.mjs +33 -0
- package/dist/components/forms/Textarea.mjs.map +1 -0
- package/dist/components/navigation/Breadcrumb.cjs +27 -0
- package/dist/components/navigation/Breadcrumb.cjs.map +1 -0
- package/dist/components/navigation/Breadcrumb.d.cts +15 -0
- package/dist/components/navigation/Breadcrumb.d.ts +15 -0
- package/dist/components/navigation/Breadcrumb.mjs +25 -0
- package/dist/components/navigation/Breadcrumb.mjs.map +1 -0
- package/dist/components/navigation/CommandPalette.cjs +136 -0
- package/dist/components/navigation/CommandPalette.cjs.map +1 -0
- package/dist/components/navigation/CommandPalette.d.cts +26 -0
- package/dist/components/navigation/CommandPalette.d.ts +26 -0
- package/dist/components/navigation/CommandPalette.mjs +134 -0
- package/dist/components/navigation/CommandPalette.mjs.map +1 -0
- package/dist/components/navigation/Menu.cjs +104 -0
- package/dist/components/navigation/Menu.cjs.map +1 -0
- package/dist/components/navigation/Menu.d.cts +20 -0
- package/dist/components/navigation/Menu.d.ts +20 -0
- package/dist/components/navigation/Menu.mjs +102 -0
- package/dist/components/navigation/Menu.mjs.map +1 -0
- package/dist/components/navigation/Sidebar.cjs +60 -0
- package/dist/components/navigation/Sidebar.cjs.map +1 -0
- package/dist/components/navigation/Sidebar.d.cts +30 -0
- package/dist/components/navigation/Sidebar.d.ts +30 -0
- package/dist/components/navigation/Sidebar.mjs +58 -0
- package/dist/components/navigation/Sidebar.mjs.map +1 -0
- package/dist/components/navigation/Stepper.cjs +55 -0
- package/dist/components/navigation/Stepper.cjs.map +1 -0
- package/dist/components/navigation/Stepper.d.cts +21 -0
- package/dist/components/navigation/Stepper.d.ts +21 -0
- package/dist/components/navigation/Stepper.mjs +53 -0
- package/dist/components/navigation/Stepper.mjs.map +1 -0
- package/dist/components/product/BrandLogo.cjs +159 -0
- package/dist/components/product/BrandLogo.cjs.map +1 -0
- package/dist/components/product/BrandLogo.d.cts +28 -0
- package/dist/components/product/BrandLogo.d.ts +28 -0
- package/dist/components/product/BrandLogo.mjs +156 -0
- package/dist/components/product/BrandLogo.mjs.map +1 -0
- package/dist/components/product/ProductActionPill.cjs +57 -0
- package/dist/components/product/ProductActionPill.cjs.map +1 -0
- package/dist/components/product/ProductActionPill.d.cts +31 -0
- package/dist/components/product/ProductActionPill.d.ts +31 -0
- package/dist/components/product/ProductActionPill.mjs +52 -0
- package/dist/components/product/ProductActionPill.mjs.map +1 -0
- package/dist/components/product/ProductCinematic.cjs +69 -0
- package/dist/components/product/ProductCinematic.cjs.map +1 -0
- package/dist/components/product/ProductCinematic.d.cts +33 -0
- package/dist/components/product/ProductCinematic.d.ts +33 -0
- package/dist/components/product/ProductCinematic.mjs +63 -0
- package/dist/components/product/ProductCinematic.mjs.map +1 -0
- package/dist/components/product/ProductPageHeader.cjs +35 -0
- package/dist/components/product/ProductPageHeader.cjs.map +1 -0
- package/dist/components/product/ProductPageHeader.d.cts +13 -0
- package/dist/components/product/ProductPageHeader.d.ts +13 -0
- package/dist/components/product/ProductPageHeader.mjs +33 -0
- package/dist/components/product/ProductPageHeader.mjs.map +1 -0
- package/dist/components/product/SectionCard.cjs +72 -0
- package/dist/components/product/SectionCard.cjs.map +1 -0
- package/dist/components/product/SectionCard.d.cts +20 -0
- package/dist/components/product/SectionCard.d.ts +20 -0
- package/dist/components/product/SectionCard.mjs +70 -0
- package/dist/components/product/SectionCard.mjs.map +1 -0
- package/dist/components/product/ToolCard.cjs +70 -0
- package/dist/components/product/ToolCard.cjs.map +1 -0
- package/dist/components/product/ToolCard.d.cts +22 -0
- package/dist/components/product/ToolCard.d.ts +22 -0
- package/dist/components/product/ToolCard.mjs +68 -0
- package/dist/components/product/ToolCard.mjs.map +1 -0
- package/dist/index.cjs +2593 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +49 -0
- package/dist/index.d.ts +49 -0
- package/dist/index.mjs +2532 -0
- package/dist/index.mjs.map +1 -0
- package/dist/styles.css +463 -0
- 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"]}
|