@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
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
// src/components/data/StatTile.tsx
|
|
4
|
+
function StatTile({ label, value, delta, deltaTone = "neutral", hint, style, ...rest }) {
|
|
5
|
+
const tone = { up: "var(--dt-success)", down: "var(--dt-danger)", neutral: "var(--dt-muted)" }[deltaTone];
|
|
6
|
+
return /* @__PURE__ */ jsxs("div", { ...rest, style: { padding: 18, minWidth: 0, ...style }, children: [
|
|
7
|
+
/* @__PURE__ */ jsx("div", { style: { fontSize: 11, fontWeight: 650, letterSpacing: "0.04em", textTransform: "uppercase", color: "var(--dt-muted)" }, children: label }),
|
|
8
|
+
/* @__PURE__ */ jsx("div", { style: { marginTop: 8, fontSize: 25, fontWeight: 700, lineHeight: 1.1, letterSpacing: "-0.02em", color: "var(--dt-ink-strong)", fontVariantNumeric: "tabular-nums" }, children: value }),
|
|
9
|
+
delta || hint ? /* @__PURE__ */ jsxs("div", { style: { marginTop: 6, display: "flex", alignItems: "center", gap: 6, fontSize: 12, color: "var(--dt-muted)" }, children: [
|
|
10
|
+
delta ? /* @__PURE__ */ jsx("span", { style: { color: tone, fontWeight: 600, fontVariantNumeric: "tabular-nums" }, children: delta }) : null,
|
|
11
|
+
hint ? /* @__PURE__ */ jsx("span", { children: hint }) : null
|
|
12
|
+
] }) : null
|
|
13
|
+
] });
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export { StatTile };
|
|
17
|
+
//# sourceMappingURL=StatTile.mjs.map
|
|
18
|
+
//# sourceMappingURL=StatTile.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/data/StatTile.tsx"],"names":[],"mappings":";;;AAgBO,SAAS,QAAA,CAAS,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,SAAA,GAAY,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,GAAG,IAAA,EAAK,EAAkB;AAC5G,EAAA,MAAM,IAAA,GAAO,EAAE,EAAA,EAAI,mBAAA,EAAqB,MAAM,kBAAA,EAAoB,OAAA,EAAS,iBAAA,EAAkB,CAAE,SAAS,CAAA;AAExG,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAK,GAAG,IAAA,EAAM,KAAA,EAAO,EAAE,OAAA,EAAS,EAAA,EAAI,QAAA,EAAU,CAAA,EAAG,GAAG,KAAA,EAAM,EACzD,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,IAAI,UAAA,EAAY,GAAA,EAAK,aAAA,EAAe,QAAA,EAAU,aAAA,EAAe,WAAA,EAAa,KAAA,EAAO,iBAAA,IAAsB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,wBACpI,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAA,EAAW,CAAA,EAAG,UAAU,EAAA,EAAI,UAAA,EAAY,KAAK,UAAA,EAAY,GAAA,EAAK,eAAe,SAAA,EAAW,KAAA,EAAO,wBAAwB,kBAAA,EAAoB,cAAA,IAAmB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IAChL,SAAS,IAAA,mBACT,IAAA,CAAC,SAAI,KAAA,EAAO,EAAE,WAAW,CAAA,EAAG,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,UAAU,GAAA,EAAK,CAAA,EAAG,UAAU,EAAA,EAAI,KAAA,EAAO,mBAAkB,EAC/G,QAAA,EAAA;AAAA,MAAA,KAAA,mBAAQ,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,IAAA,EAAM,UAAA,EAAY,GAAA,EAAK,kBAAA,EAAoB,cAAA,EAAe,EAAI,QAAA,EAAA,KAAA,EAAM,CAAA,GAAU,IAAA;AAAA,MAC5G,IAAA,mBAAO,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,IAAA,EAAK,CAAA,GAAU;AAAA,KAAA,EAChC,CAAA,GACE;AAAA,GAAA,EACN,CAAA;AAEJ","file":"StatTile.mjs","sourcesContent":["import type { CSSProperties, HTMLAttributes, ReactNode } from 'react';\n\nexport interface StatTileProps extends Omit<HTMLAttributes<HTMLDivElement>, 'style'> {\n label: ReactNode;\n value: ReactNode;\n /** e.g. \"+8.4%\". */\n delta?: ReactNode;\n deltaTone?: 'up' | 'down' | 'neutral';\n hint?: ReactNode;\n style?: CSSProperties;\n}\n\n/**\n * Metric tile — uppercase label, large tabular value, optional delta.\n * The console's KPI unit. Compose several inside a bordered stat row.\n */\nexport function StatTile({ label, value, delta, deltaTone = 'neutral', hint, style, ...rest }: StatTileProps) {\n const tone = { up: 'var(--dt-success)', down: 'var(--dt-danger)', neutral: 'var(--dt-muted)' }[deltaTone];\n\n return (\n <div {...rest} style={{ padding: 18, minWidth: 0, ...style }}>\n <div style={{ fontSize: 11, fontWeight: 650, letterSpacing: '0.04em', textTransform: 'uppercase', color: 'var(--dt-muted)' }}>{label}</div>\n <div style={{ marginTop: 8, fontSize: 25, fontWeight: 700, lineHeight: 1.1, letterSpacing: '-0.02em', color: 'var(--dt-ink-strong)', fontVariantNumeric: 'tabular-nums' }}>{value}</div>\n {(delta || hint) ? (\n <div style={{ marginTop: 6, display: 'flex', alignItems: 'center', gap: 6, fontSize: 12, color: 'var(--dt-muted)' }}>\n {delta ? <span style={{ color: tone, fontWeight: 600, fontVariantNumeric: 'tabular-nums' }}>{delta}</span> : null}\n {hint ? <span>{hint}</span> : null}\n </div>\n ) : null}\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
|
|
5
|
+
// src/components/data/Table.tsx
|
|
6
|
+
function Table({ columns = [], rows = [], rowKey, onRowClick, empty, style, ...rest }) {
|
|
7
|
+
if (!rows.length && empty) return empty;
|
|
8
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { ...rest, style: { overflowX: "auto", borderRadius: "var(--dt-radius-lg)", background: "var(--dt-surface)", boxShadow: "var(--dt-ring), var(--dt-shadow-xs)", ...style }, children: [
|
|
9
|
+
/* @__PURE__ */ jsxRuntime.jsxs("table", { style: { width: "100%", borderCollapse: "collapse", color: "var(--dt-ink)" }, children: [
|
|
10
|
+
/* @__PURE__ */ jsxRuntime.jsx("thead", { children: /* @__PURE__ */ jsxRuntime.jsx("tr", { style: { background: "var(--dt-surface-muted)" }, children: columns.map((column) => /* @__PURE__ */ jsxRuntime.jsx("th", { style: {
|
|
11
|
+
textAlign: column.align || "left",
|
|
12
|
+
padding: "11px 18px",
|
|
13
|
+
fontFamily: "var(--dt-font-mono)",
|
|
14
|
+
fontSize: 11,
|
|
15
|
+
fontWeight: 600,
|
|
16
|
+
letterSpacing: "0.04em",
|
|
17
|
+
textTransform: "uppercase",
|
|
18
|
+
color: "var(--dt-muted)",
|
|
19
|
+
borderBottom: "1px solid var(--dt-divider)",
|
|
20
|
+
whiteSpace: "nowrap"
|
|
21
|
+
}, children: column.header }, column.key)) }) }),
|
|
22
|
+
/* @__PURE__ */ jsxRuntime.jsx("tbody", { children: rows.map((row, rowIndex) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
23
|
+
"tr",
|
|
24
|
+
{
|
|
25
|
+
onClick: onRowClick ? () => onRowClick(row) : void 0,
|
|
26
|
+
className: "dt-tr",
|
|
27
|
+
style: { cursor: onRowClick ? "pointer" : "default" },
|
|
28
|
+
children: columns.map((column) => /* @__PURE__ */ jsxRuntime.jsx("td", { style: {
|
|
29
|
+
textAlign: column.align || "left",
|
|
30
|
+
padding: "13px 18px",
|
|
31
|
+
fontSize: 13,
|
|
32
|
+
borderBottom: "1px solid var(--dt-divider)",
|
|
33
|
+
whiteSpace: column.nowrap ? "nowrap" : "normal"
|
|
34
|
+
}, children: column.render ? column.render(row[column.key], row) : row[column.key] }, column.key))
|
|
35
|
+
},
|
|
36
|
+
rowKey ? rowKey(row, rowIndex) : rowIndex
|
|
37
|
+
)) })
|
|
38
|
+
] }),
|
|
39
|
+
/* @__PURE__ */ jsxRuntime.jsx("style", { children: `.dt-tr{transition:background-color 130ms}.dt-tr:hover{background:var(--dt-surface-muted)}tbody tr:last-child td{border-bottom:0}` })
|
|
40
|
+
] });
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
exports.Table = Table;
|
|
44
|
+
//# sourceMappingURL=Table.cjs.map
|
|
45
|
+
//# sourceMappingURL=Table.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/data/Table.tsx"],"names":["jsxs","jsx"],"mappings":";;;;;AA0BO,SAAS,KAAA,CAAuC,EAAE,OAAA,GAAU,IAAI,IAAA,GAAO,EAAC,EAAG,MAAA,EAAQ,UAAA,EAAY,KAAA,EAAO,KAAA,EAAO,GAAG,MAAK,EAAoB;AAC9I,EAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,KAAA,EAAO,OAAO,KAAA;AAElC,EAAA,uCACG,KAAA,EAAA,EAAK,GAAG,IAAA,EAAM,KAAA,EAAO,EAAE,SAAA,EAAW,MAAA,EAAQ,YAAA,EAAc,qBAAA,EAAuB,YAAY,mBAAA,EAAqB,SAAA,EAAW,qCAAA,EAAuC,GAAG,OAAM,EAC1K,QAAA,EAAA;AAAA,oBAAAA,eAAA,CAAC,OAAA,EAAA,EAAM,OAAO,EAAE,KAAA,EAAO,QAAQ,cAAA,EAAgB,UAAA,EAAY,KAAA,EAAO,eAAA,EAAgB,EAChF,QAAA,EAAA;AAAA,sBAAAC,cAAA,CAAC,OAAA,EAAA,EACC,QAAA,kBAAAA,cAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,UAAA,EAAY,yBAAA,EAA0B,EAChD,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZA,cAAA,CAAC,QAAoB,KAAA,EAAO;AAAA,QAC1B,SAAA,EAAW,OAAO,KAAA,IAAS,MAAA;AAAA,QAAQ,OAAA,EAAS,WAAA;AAAA,QAC5C,UAAA,EAAY,qBAAA;AAAA,QAAuB,QAAA,EAAU,EAAA;AAAA,QAAI,UAAA,EAAY,GAAA;AAAA,QAC7D,aAAA,EAAe,QAAA;AAAA,QAAU,aAAA,EAAe,WAAA;AAAA,QAAa,KAAA,EAAO,iBAAA;AAAA,QAC5D,YAAA,EAAc,6BAAA;AAAA,QAA+B,UAAA,EAAY;AAAA,SACvD,QAAA,EAAA,MAAA,CAAO,MAAA,EAAA,EALF,OAAO,GAKE,CACnB,GACH,CAAA,EACF,CAAA;AAAA,qCACC,OAAA,EAAA,EACE,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,KAAK,QAAA,qBACdA,cAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,UAAA,GAAa,MAAM,UAAA,CAAW,GAAG,CAAA,GAAI,MAAA;AAAA,UAC9C,SAAA,EAAU,OAAA;AAAA,UACV,KAAA,EAAO,EAAE,MAAA,EAAQ,UAAA,GAAa,YAAY,SAAA,EAAU;AAAA,UACnD,kBAAQ,GAAA,CAAI,CAAC,MAAA,qBACZA,cAAA,CAAC,QAAoB,KAAA,EAAO;AAAA,YAC1B,SAAA,EAAW,OAAO,KAAA,IAAS,MAAA;AAAA,YAAQ,OAAA,EAAS,WAAA;AAAA,YAAa,QAAA,EAAU,EAAA;AAAA,YACnE,YAAA,EAAc,6BAAA;AAAA,YAA+B,UAAA,EAAY,MAAA,CAAO,MAAA,GAAS,QAAA,GAAW;AAAA,aAClF,QAAA,EAAA,MAAA,CAAO,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,IAAI,MAAA,CAAO,GAAG,CAAA,EAAG,GAAG,IAAI,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,EAAA,EAH/D,MAAA,CAAO,GAG0D,CAC3E;AAAA,SAAA;AAAA,QATM,MAAA,GAAS,MAAA,CAAO,GAAA,EAAK,QAAQ,CAAA,GAAI;AAAA,OAW3C,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,oBACAA,cAAA,CAAC,WAAO,QAAA,EAAA,CAAA,gIAAA,CAAA,EAAmI;AAAA,GAAA,EAC7I,CAAA;AAEJ","file":"Table.cjs","sourcesContent":["import type { CSSProperties, HTMLAttributes, ReactNode } from 'react';\n\nexport type TableAlign = 'left' | 'center' | 'right';\nexport type TableRow = Record<string, ReactNode>;\n\nexport interface TableColumn<Row extends TableRow = TableRow> {\n key: Extract<keyof Row, string>;\n header: ReactNode;\n align?: TableAlign;\n nowrap?: boolean;\n render?: (value: Row[Extract<keyof Row, string>], row: Row) => ReactNode;\n}\n\nexport interface TableProps<Row extends TableRow = TableRow> extends Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'style'> {\n columns?: Array<TableColumn<Row>>;\n rows?: Row[];\n rowKey?: (row: Row, index: number) => string | number;\n onRowClick?: (row: Row) => void;\n empty?: ReactNode;\n style?: CSSProperties;\n}\n\n/**\n * Data table — scannable, dense, hairline-divided. Columns define header,\n * alignment, and an optional cell renderer. Built for comparison, not decoration.\n */\nexport function Table<Row extends TableRow = TableRow>({ columns = [], rows = [], rowKey, onRowClick, empty, style, ...rest }: TableProps<Row>) {\n if (!rows.length && empty) return empty;\n\n return (\n <div {...rest} style={{ overflowX: 'auto', borderRadius: 'var(--dt-radius-lg)', background: 'var(--dt-surface)', boxShadow: 'var(--dt-ring), var(--dt-shadow-xs)', ...style }}>\n <table style={{ width: '100%', borderCollapse: 'collapse', color: 'var(--dt-ink)' }}>\n <thead>\n <tr style={{ background: 'var(--dt-surface-muted)' }}>\n {columns.map((column) => (\n <th key={column.key} style={{\n textAlign: column.align || 'left', padding: '11px 18px',\n fontFamily: 'var(--dt-font-mono)', fontSize: 11, fontWeight: 600,\n letterSpacing: '0.04em', textTransform: 'uppercase', color: 'var(--dt-muted)',\n borderBottom: '1px solid var(--dt-divider)', whiteSpace: 'nowrap',\n }}>{column.header}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, rowIndex) => (\n <tr key={rowKey ? rowKey(row, rowIndex) : rowIndex}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n className=\"dt-tr\"\n style={{ cursor: onRowClick ? 'pointer' : 'default' }}>\n {columns.map((column) => (\n <td key={column.key} style={{\n textAlign: column.align || 'left', padding: '13px 18px', fontSize: 13,\n borderBottom: '1px solid var(--dt-divider)', whiteSpace: column.nowrap ? 'nowrap' : 'normal',\n }}>{column.render ? column.render(row[column.key], row) : row[column.key]}</td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n <style>{`.dt-tr{transition:background-color 130ms}.dt-tr:hover{background:var(--dt-surface-muted)}tbody tr:last-child td{border-bottom:0}`}</style>\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { ReactNode, HTMLAttributes, CSSProperties } from 'react';
|
|
3
|
+
|
|
4
|
+
type TableAlign = 'left' | 'center' | 'right';
|
|
5
|
+
type TableRow = Record<string, ReactNode>;
|
|
6
|
+
interface TableColumn<Row extends TableRow = TableRow> {
|
|
7
|
+
key: Extract<keyof Row, string>;
|
|
8
|
+
header: ReactNode;
|
|
9
|
+
align?: TableAlign;
|
|
10
|
+
nowrap?: boolean;
|
|
11
|
+
render?: (value: Row[Extract<keyof Row, string>], row: Row) => ReactNode;
|
|
12
|
+
}
|
|
13
|
+
interface TableProps<Row extends TableRow = TableRow> extends Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'style'> {
|
|
14
|
+
columns?: Array<TableColumn<Row>>;
|
|
15
|
+
rows?: Row[];
|
|
16
|
+
rowKey?: (row: Row, index: number) => string | number;
|
|
17
|
+
onRowClick?: (row: Row) => void;
|
|
18
|
+
empty?: ReactNode;
|
|
19
|
+
style?: CSSProperties;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Data table — scannable, dense, hairline-divided. Columns define header,
|
|
23
|
+
* alignment, and an optional cell renderer. Built for comparison, not decoration.
|
|
24
|
+
*/
|
|
25
|
+
declare function Table<Row extends TableRow = TableRow>({ columns, rows, rowKey, onRowClick, empty, style, ...rest }: TableProps<Row>): string | number | bigint | true | Iterable<ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | react.JSX.Element;
|
|
26
|
+
|
|
27
|
+
export { Table, type TableAlign, type TableColumn, type TableProps, type TableRow };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { ReactNode, HTMLAttributes, CSSProperties } from 'react';
|
|
3
|
+
|
|
4
|
+
type TableAlign = 'left' | 'center' | 'right';
|
|
5
|
+
type TableRow = Record<string, ReactNode>;
|
|
6
|
+
interface TableColumn<Row extends TableRow = TableRow> {
|
|
7
|
+
key: Extract<keyof Row, string>;
|
|
8
|
+
header: ReactNode;
|
|
9
|
+
align?: TableAlign;
|
|
10
|
+
nowrap?: boolean;
|
|
11
|
+
render?: (value: Row[Extract<keyof Row, string>], row: Row) => ReactNode;
|
|
12
|
+
}
|
|
13
|
+
interface TableProps<Row extends TableRow = TableRow> extends Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'style'> {
|
|
14
|
+
columns?: Array<TableColumn<Row>>;
|
|
15
|
+
rows?: Row[];
|
|
16
|
+
rowKey?: (row: Row, index: number) => string | number;
|
|
17
|
+
onRowClick?: (row: Row) => void;
|
|
18
|
+
empty?: ReactNode;
|
|
19
|
+
style?: CSSProperties;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Data table — scannable, dense, hairline-divided. Columns define header,
|
|
23
|
+
* alignment, and an optional cell renderer. Built for comparison, not decoration.
|
|
24
|
+
*/
|
|
25
|
+
declare function Table<Row extends TableRow = TableRow>({ columns, rows, rowKey, onRowClick, empty, style, ...rest }: TableProps<Row>): string | number | bigint | true | Iterable<ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | react.JSX.Element;
|
|
26
|
+
|
|
27
|
+
export { Table, type TableAlign, type TableColumn, type TableProps, type TableRow };
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
// src/components/data/Table.tsx
|
|
4
|
+
function Table({ columns = [], rows = [], rowKey, onRowClick, empty, style, ...rest }) {
|
|
5
|
+
if (!rows.length && empty) return empty;
|
|
6
|
+
return /* @__PURE__ */ jsxs("div", { ...rest, style: { overflowX: "auto", borderRadius: "var(--dt-radius-lg)", background: "var(--dt-surface)", boxShadow: "var(--dt-ring), var(--dt-shadow-xs)", ...style }, children: [
|
|
7
|
+
/* @__PURE__ */ jsxs("table", { style: { width: "100%", borderCollapse: "collapse", color: "var(--dt-ink)" }, children: [
|
|
8
|
+
/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsx("tr", { style: { background: "var(--dt-surface-muted)" }, children: columns.map((column) => /* @__PURE__ */ jsx("th", { style: {
|
|
9
|
+
textAlign: column.align || "left",
|
|
10
|
+
padding: "11px 18px",
|
|
11
|
+
fontFamily: "var(--dt-font-mono)",
|
|
12
|
+
fontSize: 11,
|
|
13
|
+
fontWeight: 600,
|
|
14
|
+
letterSpacing: "0.04em",
|
|
15
|
+
textTransform: "uppercase",
|
|
16
|
+
color: "var(--dt-muted)",
|
|
17
|
+
borderBottom: "1px solid var(--dt-divider)",
|
|
18
|
+
whiteSpace: "nowrap"
|
|
19
|
+
}, children: column.header }, column.key)) }) }),
|
|
20
|
+
/* @__PURE__ */ jsx("tbody", { children: rows.map((row, rowIndex) => /* @__PURE__ */ jsx(
|
|
21
|
+
"tr",
|
|
22
|
+
{
|
|
23
|
+
onClick: onRowClick ? () => onRowClick(row) : void 0,
|
|
24
|
+
className: "dt-tr",
|
|
25
|
+
style: { cursor: onRowClick ? "pointer" : "default" },
|
|
26
|
+
children: columns.map((column) => /* @__PURE__ */ jsx("td", { style: {
|
|
27
|
+
textAlign: column.align || "left",
|
|
28
|
+
padding: "13px 18px",
|
|
29
|
+
fontSize: 13,
|
|
30
|
+
borderBottom: "1px solid var(--dt-divider)",
|
|
31
|
+
whiteSpace: column.nowrap ? "nowrap" : "normal"
|
|
32
|
+
}, children: column.render ? column.render(row[column.key], row) : row[column.key] }, column.key))
|
|
33
|
+
},
|
|
34
|
+
rowKey ? rowKey(row, rowIndex) : rowIndex
|
|
35
|
+
)) })
|
|
36
|
+
] }),
|
|
37
|
+
/* @__PURE__ */ jsx("style", { children: `.dt-tr{transition:background-color 130ms}.dt-tr:hover{background:var(--dt-surface-muted)}tbody tr:last-child td{border-bottom:0}` })
|
|
38
|
+
] });
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export { Table };
|
|
42
|
+
//# sourceMappingURL=Table.mjs.map
|
|
43
|
+
//# sourceMappingURL=Table.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/data/Table.tsx"],"names":[],"mappings":";;;AA0BO,SAAS,KAAA,CAAuC,EAAE,OAAA,GAAU,IAAI,IAAA,GAAO,EAAC,EAAG,MAAA,EAAQ,UAAA,EAAY,KAAA,EAAO,KAAA,EAAO,GAAG,MAAK,EAAoB;AAC9I,EAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,KAAA,EAAO,OAAO,KAAA;AAElC,EAAA,4BACG,KAAA,EAAA,EAAK,GAAG,IAAA,EAAM,KAAA,EAAO,EAAE,SAAA,EAAW,MAAA,EAAQ,YAAA,EAAc,qBAAA,EAAuB,YAAY,mBAAA,EAAqB,SAAA,EAAW,qCAAA,EAAuC,GAAG,OAAM,EAC1K,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,OAAA,EAAA,EAAM,OAAO,EAAE,KAAA,EAAO,QAAQ,cAAA,EAAgB,UAAA,EAAY,KAAA,EAAO,eAAA,EAAgB,EAChF,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,OAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,UAAA,EAAY,yBAAA,EAA0B,EAChD,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZ,GAAA,CAAC,QAAoB,KAAA,EAAO;AAAA,QAC1B,SAAA,EAAW,OAAO,KAAA,IAAS,MAAA;AAAA,QAAQ,OAAA,EAAS,WAAA;AAAA,QAC5C,UAAA,EAAY,qBAAA;AAAA,QAAuB,QAAA,EAAU,EAAA;AAAA,QAAI,UAAA,EAAY,GAAA;AAAA,QAC7D,aAAA,EAAe,QAAA;AAAA,QAAU,aAAA,EAAe,WAAA;AAAA,QAAa,KAAA,EAAO,iBAAA;AAAA,QAC5D,YAAA,EAAc,6BAAA;AAAA,QAA+B,UAAA,EAAY;AAAA,SACvD,QAAA,EAAA,MAAA,CAAO,MAAA,EAAA,EALF,OAAO,GAKE,CACnB,GACH,CAAA,EACF,CAAA;AAAA,0BACC,OAAA,EAAA,EACE,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,KAAK,QAAA,qBACd,GAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,UAAA,GAAa,MAAM,UAAA,CAAW,GAAG,CAAA,GAAI,MAAA;AAAA,UAC9C,SAAA,EAAU,OAAA;AAAA,UACV,KAAA,EAAO,EAAE,MAAA,EAAQ,UAAA,GAAa,YAAY,SAAA,EAAU;AAAA,UACnD,kBAAQ,GAAA,CAAI,CAAC,MAAA,qBACZ,GAAA,CAAC,QAAoB,KAAA,EAAO;AAAA,YAC1B,SAAA,EAAW,OAAO,KAAA,IAAS,MAAA;AAAA,YAAQ,OAAA,EAAS,WAAA;AAAA,YAAa,QAAA,EAAU,EAAA;AAAA,YACnE,YAAA,EAAc,6BAAA;AAAA,YAA+B,UAAA,EAAY,MAAA,CAAO,MAAA,GAAS,QAAA,GAAW;AAAA,aAClF,QAAA,EAAA,MAAA,CAAO,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,IAAI,MAAA,CAAO,GAAG,CAAA,EAAG,GAAG,IAAI,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,EAAA,EAH/D,MAAA,CAAO,GAG0D,CAC3E;AAAA,SAAA;AAAA,QATM,MAAA,GAAS,MAAA,CAAO,GAAA,EAAK,QAAQ,CAAA,GAAI;AAAA,OAW3C,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,oBACA,GAAA,CAAC,WAAO,QAAA,EAAA,CAAA,gIAAA,CAAA,EAAmI;AAAA,GAAA,EAC7I,CAAA;AAEJ","file":"Table.mjs","sourcesContent":["import type { CSSProperties, HTMLAttributes, ReactNode } from 'react';\n\nexport type TableAlign = 'left' | 'center' | 'right';\nexport type TableRow = Record<string, ReactNode>;\n\nexport interface TableColumn<Row extends TableRow = TableRow> {\n key: Extract<keyof Row, string>;\n header: ReactNode;\n align?: TableAlign;\n nowrap?: boolean;\n render?: (value: Row[Extract<keyof Row, string>], row: Row) => ReactNode;\n}\n\nexport interface TableProps<Row extends TableRow = TableRow> extends Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'style'> {\n columns?: Array<TableColumn<Row>>;\n rows?: Row[];\n rowKey?: (row: Row, index: number) => string | number;\n onRowClick?: (row: Row) => void;\n empty?: ReactNode;\n style?: CSSProperties;\n}\n\n/**\n * Data table — scannable, dense, hairline-divided. Columns define header,\n * alignment, and an optional cell renderer. Built for comparison, not decoration.\n */\nexport function Table<Row extends TableRow = TableRow>({ columns = [], rows = [], rowKey, onRowClick, empty, style, ...rest }: TableProps<Row>) {\n if (!rows.length && empty) return empty;\n\n return (\n <div {...rest} style={{ overflowX: 'auto', borderRadius: 'var(--dt-radius-lg)', background: 'var(--dt-surface)', boxShadow: 'var(--dt-ring), var(--dt-shadow-xs)', ...style }}>\n <table style={{ width: '100%', borderCollapse: 'collapse', color: 'var(--dt-ink)' }}>\n <thead>\n <tr style={{ background: 'var(--dt-surface-muted)' }}>\n {columns.map((column) => (\n <th key={column.key} style={{\n textAlign: column.align || 'left', padding: '11px 18px',\n fontFamily: 'var(--dt-font-mono)', fontSize: 11, fontWeight: 600,\n letterSpacing: '0.04em', textTransform: 'uppercase', color: 'var(--dt-muted)',\n borderBottom: '1px solid var(--dt-divider)', whiteSpace: 'nowrap',\n }}>{column.header}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, rowIndex) => (\n <tr key={rowKey ? rowKey(row, rowIndex) : rowIndex}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n className=\"dt-tr\"\n style={{ cursor: onRowClick ? 'pointer' : 'default' }}>\n {columns.map((column) => (\n <td key={column.key} style={{\n textAlign: column.align || 'left', padding: '13px 18px', fontSize: 13,\n borderBottom: '1px solid var(--dt-divider)', whiteSpace: column.nowrap ? 'nowrap' : 'normal',\n }}>{column.render ? column.render(row[column.key], row) : row[column.key]}</td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n <style>{`.dt-tr{transition:background-color 130ms}.dt-tr:hover{background:var(--dt-surface-muted)}tbody tr:last-child td{border-bottom:0}`}</style>\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
|
|
5
|
+
// src/components/data/UsageMeter.tsx
|
|
6
|
+
function UsageMeter({ label, value = 0, max = 100, unit = "", hint, style, ...rest }) {
|
|
7
|
+
const pct = Math.min(100, Math.max(0, value / max * 100));
|
|
8
|
+
const fill = pct >= 90 ? "var(--dt-danger)" : pct >= 75 ? "var(--dt-warning)" : "var(--dt-accent)";
|
|
9
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { ...rest, style: { display: "grid", gap: 8, ...style }, children: [
|
|
10
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "baseline", justifyContent: "space-between", gap: 12 }, children: [
|
|
11
|
+
label ? /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 13, fontWeight: 600, color: "var(--dt-muted-strong)" }, children: label }) : /* @__PURE__ */ jsxRuntime.jsx("span", {}),
|
|
12
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { style: { fontFamily: "var(--dt-font-mono)", fontSize: 12.5, color: "var(--dt-ink-strong)", fontVariantNumeric: "tabular-nums" }, children: [
|
|
13
|
+
/* @__PURE__ */ jsxRuntime.jsx("b", { style: { fontWeight: 700 }, children: value.toLocaleString() }),
|
|
14
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { style: { color: "var(--dt-muted)" }, children: [
|
|
15
|
+
" / ",
|
|
16
|
+
max.toLocaleString(),
|
|
17
|
+
unit
|
|
18
|
+
] })
|
|
19
|
+
] })
|
|
20
|
+
] }),
|
|
21
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { position: "relative", height: 8, borderRadius: "var(--dt-radius-sm)", background: "var(--dt-surface-sunken)", boxShadow: "inset 0 0 0 1px var(--dt-border-strong)", overflow: "hidden" }, children: /* @__PURE__ */ jsxRuntime.jsx("div", { style: { position: "absolute", inset: 0, width: `${pct}%`, background: fill, borderRadius: "var(--dt-radius-sm)", transition: "width var(--dt-motion)" } }) }),
|
|
22
|
+
hint ? /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 12, color: "var(--dt-muted)" }, children: hint }) : null
|
|
23
|
+
] });
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
exports.UsageMeter = UsageMeter;
|
|
27
|
+
//# sourceMappingURL=UsageMeter.cjs.map
|
|
28
|
+
//# sourceMappingURL=UsageMeter.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/data/UsageMeter.tsx"],"names":["jsxs","jsx"],"mappings":";;;;;AAgBO,SAAS,UAAA,CAAW,EAAE,KAAA,EAAO,KAAA,GAAQ,CAAA,EAAG,GAAA,GAAM,GAAA,EAAK,IAAA,GAAO,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,GAAG,MAAK,EAAoB;AAC5G,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,IAAI,CAAA,EAAI,KAAA,GAAQ,GAAA,GAAO,GAAG,CAAC,CAAA;AAC1D,EAAA,MAAM,OAAO,GAAA,IAAO,EAAA,GAAK,kBAAA,GAAqB,GAAA,IAAO,KAAK,mBAAA,GAAsB,kBAAA;AAEhF,EAAA,uBACEA,eAAA,CAAC,KAAA,EAAA,EAAK,GAAG,IAAA,EAAM,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,CAAA,EAAG,GAAG,KAAA,EAAM,EACxD,QAAA,EAAA;AAAA,oBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,UAAA,EAAY,cAAA,EAAgB,eAAA,EAAiB,GAAA,EAAK,EAAA,EAAG,EAC7F,QAAA,EAAA;AAAA,MAAA,KAAA,mBAAQC,cAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,UAAU,EAAA,EAAI,UAAA,EAAY,GAAA,EAAK,KAAA,EAAO,wBAAA,EAAyB,EAAI,QAAA,EAAA,KAAA,EAAM,CAAA,kCAAW,MAAA,EAAA,EAAK,CAAA;AAAA,sBACjHD,eAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,UAAA,EAAY,qBAAA,EAAuB,QAAA,EAAU,IAAA,EAAM,KAAA,EAAO,sBAAA,EAAwB,kBAAA,EAAoB,cAAA,EAAe,EAClI,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,GAAA,EAAA,EAAE,OAAO,EAAE,UAAA,EAAY,KAAI,EAAI,QAAA,EAAA,KAAA,CAAM,gBAAe,EAAE,CAAA;AAAA,wCACtD,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,mBAAkB,EAAG,QAAA,EAAA;AAAA,UAAA,KAAA;AAAA,UAAI,IAAI,cAAA,EAAe;AAAA,UAAG;AAAA,SAAA,EAAK;AAAA,OAAA,EAC5E;AAAA,KAAA,EACF,CAAA;AAAA,mCACC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,YAAY,MAAA,EAAQ,CAAA,EAAG,YAAA,EAAc,qBAAA,EAAuB,YAAY,0BAAA,EAA4B,SAAA,EAAW,yCAAA,EAA2C,QAAA,EAAU,UAAS,EACnM,QAAA,kBAAAA,cAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,KAAA,EAAO,CAAA,EAAG,OAAO,CAAA,EAAG,GAAG,CAAA,CAAA,CAAA,EAAK,UAAA,EAAY,MAAM,YAAA,EAAc,qBAAA,EAAuB,UAAA,EAAY,wBAAA,IAA4B,CAAA,EACjK,CAAA;AAAA,IACC,IAAA,mBAAOA,cAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,KAAA,EAAO,iBAAA,EAAkB,EAAI,QAAA,EAAA,IAAA,EAAK,CAAA,GAAU;AAAA,GAAA,EACnF,CAAA;AAEJ","file":"UsageMeter.cjs","sourcesContent":["import type { CSSProperties, HTMLAttributes, ReactNode } from 'react';\n\nexport interface UsageMeterProps extends Omit<HTMLAttributes<HTMLDivElement>, 'style'> {\n label?: ReactNode;\n value?: number;\n max?: number;\n /** Suffix after max, e.g. \"회/일\". */\n unit?: string;\n hint?: ReactNode;\n style?: CSSProperties;\n}\n\n/**\n * Quota / usage bar — hairline track, persimmon fill escalating to warning/danger.\n * @startingPoint section=\"Data\" subtitle=\"Quota usage with tabular readout\" viewport=\"420x80\"\n */\nexport function UsageMeter({ label, value = 0, max = 100, unit = '', hint, style, ...rest }: UsageMeterProps) {\n const pct = Math.min(100, Math.max(0, (value / max) * 100));\n const fill = pct >= 90 ? 'var(--dt-danger)' : pct >= 75 ? 'var(--dt-warning)' : 'var(--dt-accent)';\n\n return (\n <div {...rest} style={{ display: 'grid', gap: 8, ...style }}>\n <div style={{ display: 'flex', alignItems: 'baseline', justifyContent: 'space-between', gap: 12 }}>\n {label ? <span style={{ fontSize: 13, fontWeight: 600, color: 'var(--dt-muted-strong)' }}>{label}</span> : <span />}\n <span style={{ fontFamily: 'var(--dt-font-mono)', fontSize: 12.5, color: 'var(--dt-ink-strong)', fontVariantNumeric: 'tabular-nums' }}>\n <b style={{ fontWeight: 700 }}>{value.toLocaleString()}</b>\n <span style={{ color: 'var(--dt-muted)' }}> / {max.toLocaleString()}{unit}</span>\n </span>\n </div>\n <div style={{ position: 'relative', height: 8, borderRadius: 'var(--dt-radius-sm)', background: 'var(--dt-surface-sunken)', boxShadow: 'inset 0 0 0 1px var(--dt-border-strong)', overflow: 'hidden' }}>\n <div style={{ position: 'absolute', inset: 0, width: `${pct}%`, background: fill, borderRadius: 'var(--dt-radius-sm)', transition: 'width var(--dt-motion)' }} />\n </div>\n {hint ? <span style={{ fontSize: 12, color: 'var(--dt-muted)' }}>{hint}</span> : null}\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { HTMLAttributes, ReactNode, CSSProperties } from 'react';
|
|
3
|
+
|
|
4
|
+
interface UsageMeterProps extends Omit<HTMLAttributes<HTMLDivElement>, 'style'> {
|
|
5
|
+
label?: ReactNode;
|
|
6
|
+
value?: number;
|
|
7
|
+
max?: number;
|
|
8
|
+
/** Suffix after max, e.g. "회/일". */
|
|
9
|
+
unit?: string;
|
|
10
|
+
hint?: ReactNode;
|
|
11
|
+
style?: CSSProperties;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Quota / usage bar — hairline track, persimmon fill escalating to warning/danger.
|
|
15
|
+
* @startingPoint section="Data" subtitle="Quota usage with tabular readout" viewport="420x80"
|
|
16
|
+
*/
|
|
17
|
+
declare function UsageMeter({ label, value, max, unit, hint, style, ...rest }: UsageMeterProps): react.JSX.Element;
|
|
18
|
+
|
|
19
|
+
export { UsageMeter, type UsageMeterProps };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { HTMLAttributes, ReactNode, CSSProperties } from 'react';
|
|
3
|
+
|
|
4
|
+
interface UsageMeterProps extends Omit<HTMLAttributes<HTMLDivElement>, 'style'> {
|
|
5
|
+
label?: ReactNode;
|
|
6
|
+
value?: number;
|
|
7
|
+
max?: number;
|
|
8
|
+
/** Suffix after max, e.g. "회/일". */
|
|
9
|
+
unit?: string;
|
|
10
|
+
hint?: ReactNode;
|
|
11
|
+
style?: CSSProperties;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Quota / usage bar — hairline track, persimmon fill escalating to warning/danger.
|
|
15
|
+
* @startingPoint section="Data" subtitle="Quota usage with tabular readout" viewport="420x80"
|
|
16
|
+
*/
|
|
17
|
+
declare function UsageMeter({ label, value, max, unit, hint, style, ...rest }: UsageMeterProps): react.JSX.Element;
|
|
18
|
+
|
|
19
|
+
export { UsageMeter, type UsageMeterProps };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
// src/components/data/UsageMeter.tsx
|
|
4
|
+
function UsageMeter({ label, value = 0, max = 100, unit = "", hint, style, ...rest }) {
|
|
5
|
+
const pct = Math.min(100, Math.max(0, value / max * 100));
|
|
6
|
+
const fill = pct >= 90 ? "var(--dt-danger)" : pct >= 75 ? "var(--dt-warning)" : "var(--dt-accent)";
|
|
7
|
+
return /* @__PURE__ */ jsxs("div", { ...rest, style: { display: "grid", gap: 8, ...style }, children: [
|
|
8
|
+
/* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "baseline", justifyContent: "space-between", gap: 12 }, children: [
|
|
9
|
+
label ? /* @__PURE__ */ jsx("span", { style: { fontSize: 13, fontWeight: 600, color: "var(--dt-muted-strong)" }, children: label }) : /* @__PURE__ */ jsx("span", {}),
|
|
10
|
+
/* @__PURE__ */ jsxs("span", { style: { fontFamily: "var(--dt-font-mono)", fontSize: 12.5, color: "var(--dt-ink-strong)", fontVariantNumeric: "tabular-nums" }, children: [
|
|
11
|
+
/* @__PURE__ */ jsx("b", { style: { fontWeight: 700 }, children: value.toLocaleString() }),
|
|
12
|
+
/* @__PURE__ */ jsxs("span", { style: { color: "var(--dt-muted)" }, children: [
|
|
13
|
+
" / ",
|
|
14
|
+
max.toLocaleString(),
|
|
15
|
+
unit
|
|
16
|
+
] })
|
|
17
|
+
] })
|
|
18
|
+
] }),
|
|
19
|
+
/* @__PURE__ */ jsx("div", { style: { position: "relative", height: 8, borderRadius: "var(--dt-radius-sm)", background: "var(--dt-surface-sunken)", boxShadow: "inset 0 0 0 1px var(--dt-border-strong)", overflow: "hidden" }, children: /* @__PURE__ */ jsx("div", { style: { position: "absolute", inset: 0, width: `${pct}%`, background: fill, borderRadius: "var(--dt-radius-sm)", transition: "width var(--dt-motion)" } }) }),
|
|
20
|
+
hint ? /* @__PURE__ */ jsx("span", { style: { fontSize: 12, color: "var(--dt-muted)" }, children: hint }) : null
|
|
21
|
+
] });
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export { UsageMeter };
|
|
25
|
+
//# sourceMappingURL=UsageMeter.mjs.map
|
|
26
|
+
//# sourceMappingURL=UsageMeter.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/data/UsageMeter.tsx"],"names":[],"mappings":";;;AAgBO,SAAS,UAAA,CAAW,EAAE,KAAA,EAAO,KAAA,GAAQ,CAAA,EAAG,GAAA,GAAM,GAAA,EAAK,IAAA,GAAO,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,GAAG,MAAK,EAAoB;AAC5G,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,IAAI,CAAA,EAAI,KAAA,GAAQ,GAAA,GAAO,GAAG,CAAC,CAAA;AAC1D,EAAA,MAAM,OAAO,GAAA,IAAO,EAAA,GAAK,kBAAA,GAAqB,GAAA,IAAO,KAAK,mBAAA,GAAsB,kBAAA;AAEhF,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAK,GAAG,IAAA,EAAM,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,CAAA,EAAG,GAAG,KAAA,EAAM,EACxD,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,UAAA,EAAY,cAAA,EAAgB,eAAA,EAAiB,GAAA,EAAK,EAAA,EAAG,EAC7F,QAAA,EAAA;AAAA,MAAA,KAAA,mBAAQ,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,UAAU,EAAA,EAAI,UAAA,EAAY,GAAA,EAAK,KAAA,EAAO,wBAAA,EAAyB,EAAI,QAAA,EAAA,KAAA,EAAM,CAAA,uBAAW,MAAA,EAAA,EAAK,CAAA;AAAA,sBACjH,IAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,UAAA,EAAY,qBAAA,EAAuB,QAAA,EAAU,IAAA,EAAM,KAAA,EAAO,sBAAA,EAAwB,kBAAA,EAAoB,cAAA,EAAe,EAClI,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,GAAA,EAAA,EAAE,OAAO,EAAE,UAAA,EAAY,KAAI,EAAI,QAAA,EAAA,KAAA,CAAM,gBAAe,EAAE,CAAA;AAAA,6BACtD,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,mBAAkB,EAAG,QAAA,EAAA;AAAA,UAAA,KAAA;AAAA,UAAI,IAAI,cAAA,EAAe;AAAA,UAAG;AAAA,SAAA,EAAK;AAAA,OAAA,EAC5E;AAAA,KAAA,EACF,CAAA;AAAA,wBACC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,YAAY,MAAA,EAAQ,CAAA,EAAG,YAAA,EAAc,qBAAA,EAAuB,YAAY,0BAAA,EAA4B,SAAA,EAAW,yCAAA,EAA2C,QAAA,EAAU,UAAS,EACnM,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,KAAA,EAAO,CAAA,EAAG,OAAO,CAAA,EAAG,GAAG,CAAA,CAAA,CAAA,EAAK,UAAA,EAAY,MAAM,YAAA,EAAc,qBAAA,EAAuB,UAAA,EAAY,wBAAA,IAA4B,CAAA,EACjK,CAAA;AAAA,IACC,IAAA,mBAAO,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,KAAA,EAAO,iBAAA,EAAkB,EAAI,QAAA,EAAA,IAAA,EAAK,CAAA,GAAU;AAAA,GAAA,EACnF,CAAA;AAEJ","file":"UsageMeter.mjs","sourcesContent":["import type { CSSProperties, HTMLAttributes, ReactNode } from 'react';\n\nexport interface UsageMeterProps extends Omit<HTMLAttributes<HTMLDivElement>, 'style'> {\n label?: ReactNode;\n value?: number;\n max?: number;\n /** Suffix after max, e.g. \"회/일\". */\n unit?: string;\n hint?: ReactNode;\n style?: CSSProperties;\n}\n\n/**\n * Quota / usage bar — hairline track, persimmon fill escalating to warning/danger.\n * @startingPoint section=\"Data\" subtitle=\"Quota usage with tabular readout\" viewport=\"420x80\"\n */\nexport function UsageMeter({ label, value = 0, max = 100, unit = '', hint, style, ...rest }: UsageMeterProps) {\n const pct = Math.min(100, Math.max(0, (value / max) * 100));\n const fill = pct >= 90 ? 'var(--dt-danger)' : pct >= 75 ? 'var(--dt-warning)' : 'var(--dt-accent)';\n\n return (\n <div {...rest} style={{ display: 'grid', gap: 8, ...style }}>\n <div style={{ display: 'flex', alignItems: 'baseline', justifyContent: 'space-between', gap: 12 }}>\n {label ? <span style={{ fontSize: 13, fontWeight: 600, color: 'var(--dt-muted-strong)' }}>{label}</span> : <span />}\n <span style={{ fontFamily: 'var(--dt-font-mono)', fontSize: 12.5, color: 'var(--dt-ink-strong)', fontVariantNumeric: 'tabular-nums' }}>\n <b style={{ fontWeight: 700 }}>{value.toLocaleString()}</b>\n <span style={{ color: 'var(--dt-muted)' }}> / {max.toLocaleString()}{unit}</span>\n </span>\n </div>\n <div style={{ position: 'relative', height: 8, borderRadius: 'var(--dt-radius-sm)', background: 'var(--dt-surface-sunken)', boxShadow: 'inset 0 0 0 1px var(--dt-border-strong)', overflow: 'hidden' }}>\n <div style={{ position: 'absolute', inset: 0, width: `${pct}%`, background: fill, borderRadius: 'var(--dt-radius-sm)', transition: 'width var(--dt-motion)' }} />\n </div>\n {hint ? <span style={{ fontSize: 12, color: 'var(--dt-muted)' }}>{hint}</span> : null}\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
|
|
5
|
+
// src/lib/cx.ts
|
|
6
|
+
function cx(...classes) {
|
|
7
|
+
return classes.filter(Boolean).join(" ");
|
|
8
|
+
}
|
|
9
|
+
var AlertTone = {
|
|
10
|
+
Info: "info",
|
|
11
|
+
Success: "success",
|
|
12
|
+
Warning: "warning",
|
|
13
|
+
Danger: "danger"
|
|
14
|
+
};
|
|
15
|
+
var AlertMotion = {
|
|
16
|
+
None: "none",
|
|
17
|
+
Subtle: "subtle",
|
|
18
|
+
Pulse: "pulse"
|
|
19
|
+
};
|
|
20
|
+
var TONE_BACKGROUND = {
|
|
21
|
+
info: "var(--dt-status-cobalt)",
|
|
22
|
+
success: "var(--dt-status-success)",
|
|
23
|
+
warning: "var(--dt-status-warning)",
|
|
24
|
+
danger: "var(--dt-status-danger)"
|
|
25
|
+
};
|
|
26
|
+
function Alert({
|
|
27
|
+
tone = AlertTone.Info,
|
|
28
|
+
title,
|
|
29
|
+
children,
|
|
30
|
+
icon,
|
|
31
|
+
action,
|
|
32
|
+
motion = AlertMotion.None,
|
|
33
|
+
onDismiss,
|
|
34
|
+
className,
|
|
35
|
+
style,
|
|
36
|
+
...rest
|
|
37
|
+
}) {
|
|
38
|
+
const background = TONE_BACKGROUND[tone] ?? TONE_BACKGROUND[AlertTone.Info];
|
|
39
|
+
const motionClass = motion === AlertMotion.None ? void 0 : `dt-alert-motion-${motion}`;
|
|
40
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
41
|
+
"div",
|
|
42
|
+
{
|
|
43
|
+
role: "status",
|
|
44
|
+
className: cx("dt-alert", motionClass, className),
|
|
45
|
+
style: {
|
|
46
|
+
alignItems: "flex-start",
|
|
47
|
+
background,
|
|
48
|
+
borderRadius: "20px",
|
|
49
|
+
color: "var(--dt-alert-ink)",
|
|
50
|
+
display: "flex",
|
|
51
|
+
gap: 12,
|
|
52
|
+
minHeight: 62,
|
|
53
|
+
overflow: "clip",
|
|
54
|
+
padding: "13px 15px",
|
|
55
|
+
position: "relative",
|
|
56
|
+
transition: "filter var(--dt-motion-fast), transform var(--dt-motion-fast)",
|
|
57
|
+
width: "min(100%, 380px)",
|
|
58
|
+
...style
|
|
59
|
+
},
|
|
60
|
+
...rest,
|
|
61
|
+
children: [
|
|
62
|
+
icon ? /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: "currentColor", display: "inline-flex", flex: "0 0 auto", marginTop: 1 }, children: icon }) : null,
|
|
63
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { flex: "1 0 0", minWidth: 1, overflow: "clip", wordBreak: "break-word" }, children: [
|
|
64
|
+
title ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 14, fontWeight: 600, lineHeight: "normal" }, children: title }) : null,
|
|
65
|
+
children ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: title ? 3 : 0, fontSize: 13, fontWeight: 400, lineHeight: "normal" }, children }) : null,
|
|
66
|
+
action ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 10 }, children: action }) : null
|
|
67
|
+
] }),
|
|
68
|
+
onDismiss ? /* @__PURE__ */ jsxRuntime.jsx("button", { onClick: onDismiss, "aria-label": "\uB2EB\uAE30", style: { flex: "0 0 auto", border: "none", background: "transparent", cursor: "pointer", color: "currentColor", padding: 2, lineHeight: 0 }, children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M6 6l12 12M18 6L6 18", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round" }) }) }) : null
|
|
69
|
+
]
|
|
70
|
+
}
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
exports.Alert = Alert;
|
|
75
|
+
exports.AlertMotion = AlertMotion;
|
|
76
|
+
exports.AlertTone = AlertTone;
|
|
77
|
+
//# sourceMappingURL=Alert.cjs.map
|
|
78
|
+
//# sourceMappingURL=Alert.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/cx.ts","../../../src/components/feedback/Alert.tsx"],"names":["jsxs","jsx"],"mappings":"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","file":"Alert.cjs","sourcesContent":["export function cx(...classes: Array<string | false | null | undefined>): string {\n return classes.filter(Boolean).join(' ');\n}\n","import type { CSSProperties, HTMLAttributes, ReactNode } from 'react';\nimport { cx } from '../../lib/cx';\n\nexport const AlertTone = {\n Info: 'info',\n Success: 'success',\n Warning: 'warning',\n Danger: 'danger',\n} as const;\n\nexport type AlertTone = (typeof AlertTone)[keyof typeof AlertTone];\n\nexport const AlertMotion = {\n None: 'none',\n Subtle: 'subtle',\n Pulse: 'pulse',\n} as const;\n\nexport type AlertMotion = (typeof AlertMotion)[keyof typeof AlertMotion];\n\nconst TONE_BACKGROUND = {\n info: 'var(--dt-status-cobalt)',\n success: 'var(--dt-status-success)',\n warning: 'var(--dt-status-warning)',\n danger: 'var(--dt-status-danger)',\n} satisfies Record<AlertTone, string>;\n\nexport interface AlertProps extends Omit<HTMLAttributes<HTMLDivElement>, 'style' | 'title'> {\n tone?: AlertTone;\n title?: ReactNode;\n children?: ReactNode;\n icon?: ReactNode;\n action?: ReactNode;\n motion?: AlertMotion;\n onDismiss?: () => void;\n style?: CSSProperties;\n}\n\nexport function Alert({\n tone = AlertTone.Info,\n title,\n children,\n icon,\n action,\n motion = AlertMotion.None,\n onDismiss,\n className,\n style,\n ...rest\n}: AlertProps) {\n const background = TONE_BACKGROUND[tone] ?? TONE_BACKGROUND[AlertTone.Info];\n const motionClass = motion === AlertMotion.None ? undefined : `dt-alert-motion-${motion}`;\n return (\n <div\n role=\"status\"\n className={cx('dt-alert', motionClass, className)}\n style={{\n alignItems: 'flex-start',\n background,\n borderRadius: '20px',\n color: 'var(--dt-alert-ink)',\n display: 'flex',\n gap: 12,\n minHeight: 62,\n overflow: 'clip',\n padding: '13px 15px',\n position: 'relative',\n transition: 'filter var(--dt-motion-fast), transform var(--dt-motion-fast)',\n width: 'min(100%, 380px)',\n ...style,\n }}\n {...rest}\n >\n {icon ? <span style={{ color: 'currentColor', display: 'inline-flex', flex: '0 0 auto', marginTop: 1 }}>{icon}</span> : null}\n <div style={{ flex: '1 0 0', minWidth: 1, overflow: 'clip', wordBreak: 'break-word' }}>\n {title ? <div style={{ fontSize: 14, fontWeight: 600, lineHeight: 'normal' }}>{title}</div> : null}\n {children ? <div style={{ marginTop: title ? 3 : 0, fontSize: 13, fontWeight: 400, lineHeight: 'normal' }}>{children}</div> : null}\n {action ? <div style={{ marginTop: 10 }}>{action}</div> : null}\n </div>\n {onDismiss ? (\n <button onClick={onDismiss} aria-label=\"닫기\" style={{ flex: '0 0 auto', border: 'none', background: 'transparent', cursor: 'pointer', color: 'currentColor', padding: 2, lineHeight: 0 }}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\"><path d=\"M6 6l12 12M18 6L6 18\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" /></svg>\n </button>\n ) : null}\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { HTMLAttributes, ReactNode, CSSProperties } from 'react';
|
|
3
|
+
|
|
4
|
+
declare const AlertTone: {
|
|
5
|
+
readonly Info: "info";
|
|
6
|
+
readonly Success: "success";
|
|
7
|
+
readonly Warning: "warning";
|
|
8
|
+
readonly Danger: "danger";
|
|
9
|
+
};
|
|
10
|
+
type AlertTone = (typeof AlertTone)[keyof typeof AlertTone];
|
|
11
|
+
declare const AlertMotion: {
|
|
12
|
+
readonly None: "none";
|
|
13
|
+
readonly Subtle: "subtle";
|
|
14
|
+
readonly Pulse: "pulse";
|
|
15
|
+
};
|
|
16
|
+
type AlertMotion = (typeof AlertMotion)[keyof typeof AlertMotion];
|
|
17
|
+
interface AlertProps extends Omit<HTMLAttributes<HTMLDivElement>, 'style' | 'title'> {
|
|
18
|
+
tone?: AlertTone;
|
|
19
|
+
title?: ReactNode;
|
|
20
|
+
children?: ReactNode;
|
|
21
|
+
icon?: ReactNode;
|
|
22
|
+
action?: ReactNode;
|
|
23
|
+
motion?: AlertMotion;
|
|
24
|
+
onDismiss?: () => void;
|
|
25
|
+
style?: CSSProperties;
|
|
26
|
+
}
|
|
27
|
+
declare function Alert({ tone, title, children, icon, action, motion, onDismiss, className, style, ...rest }: AlertProps): react.JSX.Element;
|
|
28
|
+
|
|
29
|
+
export { Alert, AlertMotion, type AlertProps, AlertTone };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { HTMLAttributes, ReactNode, CSSProperties } from 'react';
|
|
3
|
+
|
|
4
|
+
declare const AlertTone: {
|
|
5
|
+
readonly Info: "info";
|
|
6
|
+
readonly Success: "success";
|
|
7
|
+
readonly Warning: "warning";
|
|
8
|
+
readonly Danger: "danger";
|
|
9
|
+
};
|
|
10
|
+
type AlertTone = (typeof AlertTone)[keyof typeof AlertTone];
|
|
11
|
+
declare const AlertMotion: {
|
|
12
|
+
readonly None: "none";
|
|
13
|
+
readonly Subtle: "subtle";
|
|
14
|
+
readonly Pulse: "pulse";
|
|
15
|
+
};
|
|
16
|
+
type AlertMotion = (typeof AlertMotion)[keyof typeof AlertMotion];
|
|
17
|
+
interface AlertProps extends Omit<HTMLAttributes<HTMLDivElement>, 'style' | 'title'> {
|
|
18
|
+
tone?: AlertTone;
|
|
19
|
+
title?: ReactNode;
|
|
20
|
+
children?: ReactNode;
|
|
21
|
+
icon?: ReactNode;
|
|
22
|
+
action?: ReactNode;
|
|
23
|
+
motion?: AlertMotion;
|
|
24
|
+
onDismiss?: () => void;
|
|
25
|
+
style?: CSSProperties;
|
|
26
|
+
}
|
|
27
|
+
declare function Alert({ tone, title, children, icon, action, motion, onDismiss, className, style, ...rest }: AlertProps): react.JSX.Element;
|
|
28
|
+
|
|
29
|
+
export { Alert, AlertMotion, type AlertProps, AlertTone };
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
// src/lib/cx.ts
|
|
4
|
+
function cx(...classes) {
|
|
5
|
+
return classes.filter(Boolean).join(" ");
|
|
6
|
+
}
|
|
7
|
+
var AlertTone = {
|
|
8
|
+
Info: "info",
|
|
9
|
+
Success: "success",
|
|
10
|
+
Warning: "warning",
|
|
11
|
+
Danger: "danger"
|
|
12
|
+
};
|
|
13
|
+
var AlertMotion = {
|
|
14
|
+
None: "none",
|
|
15
|
+
Subtle: "subtle",
|
|
16
|
+
Pulse: "pulse"
|
|
17
|
+
};
|
|
18
|
+
var TONE_BACKGROUND = {
|
|
19
|
+
info: "var(--dt-status-cobalt)",
|
|
20
|
+
success: "var(--dt-status-success)",
|
|
21
|
+
warning: "var(--dt-status-warning)",
|
|
22
|
+
danger: "var(--dt-status-danger)"
|
|
23
|
+
};
|
|
24
|
+
function Alert({
|
|
25
|
+
tone = AlertTone.Info,
|
|
26
|
+
title,
|
|
27
|
+
children,
|
|
28
|
+
icon,
|
|
29
|
+
action,
|
|
30
|
+
motion = AlertMotion.None,
|
|
31
|
+
onDismiss,
|
|
32
|
+
className,
|
|
33
|
+
style,
|
|
34
|
+
...rest
|
|
35
|
+
}) {
|
|
36
|
+
const background = TONE_BACKGROUND[tone] ?? TONE_BACKGROUND[AlertTone.Info];
|
|
37
|
+
const motionClass = motion === AlertMotion.None ? void 0 : `dt-alert-motion-${motion}`;
|
|
38
|
+
return /* @__PURE__ */ jsxs(
|
|
39
|
+
"div",
|
|
40
|
+
{
|
|
41
|
+
role: "status",
|
|
42
|
+
className: cx("dt-alert", motionClass, className),
|
|
43
|
+
style: {
|
|
44
|
+
alignItems: "flex-start",
|
|
45
|
+
background,
|
|
46
|
+
borderRadius: "20px",
|
|
47
|
+
color: "var(--dt-alert-ink)",
|
|
48
|
+
display: "flex",
|
|
49
|
+
gap: 12,
|
|
50
|
+
minHeight: 62,
|
|
51
|
+
overflow: "clip",
|
|
52
|
+
padding: "13px 15px",
|
|
53
|
+
position: "relative",
|
|
54
|
+
transition: "filter var(--dt-motion-fast), transform var(--dt-motion-fast)",
|
|
55
|
+
width: "min(100%, 380px)",
|
|
56
|
+
...style
|
|
57
|
+
},
|
|
58
|
+
...rest,
|
|
59
|
+
children: [
|
|
60
|
+
icon ? /* @__PURE__ */ jsx("span", { style: { color: "currentColor", display: "inline-flex", flex: "0 0 auto", marginTop: 1 }, children: icon }) : null,
|
|
61
|
+
/* @__PURE__ */ jsxs("div", { style: { flex: "1 0 0", minWidth: 1, overflow: "clip", wordBreak: "break-word" }, children: [
|
|
62
|
+
title ? /* @__PURE__ */ jsx("div", { style: { fontSize: 14, fontWeight: 600, lineHeight: "normal" }, children: title }) : null,
|
|
63
|
+
children ? /* @__PURE__ */ jsx("div", { style: { marginTop: title ? 3 : 0, fontSize: 13, fontWeight: 400, lineHeight: "normal" }, children }) : null,
|
|
64
|
+
action ? /* @__PURE__ */ jsx("div", { style: { marginTop: 10 }, children: action }) : null
|
|
65
|
+
] }),
|
|
66
|
+
onDismiss ? /* @__PURE__ */ jsx("button", { onClick: onDismiss, "aria-label": "\uB2EB\uAE30", style: { flex: "0 0 auto", border: "none", background: "transparent", cursor: "pointer", color: "currentColor", padding: 2, lineHeight: 0 }, children: /* @__PURE__ */ jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx("path", { d: "M6 6l12 12M18 6L6 18", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round" }) }) }) : null
|
|
67
|
+
]
|
|
68
|
+
}
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export { Alert, AlertMotion, AlertTone };
|
|
73
|
+
//# sourceMappingURL=Alert.mjs.map
|
|
74
|
+
//# sourceMappingURL=Alert.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/cx.ts","../../../src/components/feedback/Alert.tsx"],"names":[],"mappings":"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","file":"Alert.mjs","sourcesContent":["export function cx(...classes: Array<string | false | null | undefined>): string {\n return classes.filter(Boolean).join(' ');\n}\n","import type { CSSProperties, HTMLAttributes, ReactNode } from 'react';\nimport { cx } from '../../lib/cx';\n\nexport const AlertTone = {\n Info: 'info',\n Success: 'success',\n Warning: 'warning',\n Danger: 'danger',\n} as const;\n\nexport type AlertTone = (typeof AlertTone)[keyof typeof AlertTone];\n\nexport const AlertMotion = {\n None: 'none',\n Subtle: 'subtle',\n Pulse: 'pulse',\n} as const;\n\nexport type AlertMotion = (typeof AlertMotion)[keyof typeof AlertMotion];\n\nconst TONE_BACKGROUND = {\n info: 'var(--dt-status-cobalt)',\n success: 'var(--dt-status-success)',\n warning: 'var(--dt-status-warning)',\n danger: 'var(--dt-status-danger)',\n} satisfies Record<AlertTone, string>;\n\nexport interface AlertProps extends Omit<HTMLAttributes<HTMLDivElement>, 'style' | 'title'> {\n tone?: AlertTone;\n title?: ReactNode;\n children?: ReactNode;\n icon?: ReactNode;\n action?: ReactNode;\n motion?: AlertMotion;\n onDismiss?: () => void;\n style?: CSSProperties;\n}\n\nexport function Alert({\n tone = AlertTone.Info,\n title,\n children,\n icon,\n action,\n motion = AlertMotion.None,\n onDismiss,\n className,\n style,\n ...rest\n}: AlertProps) {\n const background = TONE_BACKGROUND[tone] ?? TONE_BACKGROUND[AlertTone.Info];\n const motionClass = motion === AlertMotion.None ? undefined : `dt-alert-motion-${motion}`;\n return (\n <div\n role=\"status\"\n className={cx('dt-alert', motionClass, className)}\n style={{\n alignItems: 'flex-start',\n background,\n borderRadius: '20px',\n color: 'var(--dt-alert-ink)',\n display: 'flex',\n gap: 12,\n minHeight: 62,\n overflow: 'clip',\n padding: '13px 15px',\n position: 'relative',\n transition: 'filter var(--dt-motion-fast), transform var(--dt-motion-fast)',\n width: 'min(100%, 380px)',\n ...style,\n }}\n {...rest}\n >\n {icon ? <span style={{ color: 'currentColor', display: 'inline-flex', flex: '0 0 auto', marginTop: 1 }}>{icon}</span> : null}\n <div style={{ flex: '1 0 0', minWidth: 1, overflow: 'clip', wordBreak: 'break-word' }}>\n {title ? <div style={{ fontSize: 14, fontWeight: 600, lineHeight: 'normal' }}>{title}</div> : null}\n {children ? <div style={{ marginTop: title ? 3 : 0, fontSize: 13, fontWeight: 400, lineHeight: 'normal' }}>{children}</div> : null}\n {action ? <div style={{ marginTop: 10 }}>{action}</div> : null}\n </div>\n {onDismiss ? (\n <button onClick={onDismiss} aria-label=\"닫기\" style={{ flex: '0 0 auto', border: 'none', background: 'transparent', cursor: 'pointer', color: 'currentColor', padding: 2, lineHeight: 0 }}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\"><path d=\"M6 6l12 12M18 6L6 18\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" /></svg>\n </button>\n ) : null}\n </div>\n );\n}\n"]}
|