@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,12 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { CSSProperties } from 'react';
|
|
3
|
+
|
|
4
|
+
interface SpinnerProps {
|
|
5
|
+
size?: number;
|
|
6
|
+
stroke?: number;
|
|
7
|
+
color?: string;
|
|
8
|
+
style?: CSSProperties;
|
|
9
|
+
}
|
|
10
|
+
declare function Spinner({ size, stroke, color, style }: SpinnerProps): react.JSX.Element;
|
|
11
|
+
|
|
12
|
+
export { Spinner, type SpinnerProps };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { useId } from 'react';
|
|
2
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
// src/components/feedback/Spinner.tsx
|
|
5
|
+
function Spinner({ size = 18, stroke = 2, color = "var(--dt-accent)", style }) {
|
|
6
|
+
useId();
|
|
7
|
+
return /* @__PURE__ */ jsx("span", { style: { display: "inline-flex", ...style }, role: "status", "aria-label": "\uB85C\uB529 \uC911", children: /* @__PURE__ */ jsxs("svg", { className: "dt-spinner-svg", width: size, height: size, viewBox: "0 0 24 24", fill: "none", children: [
|
|
8
|
+
/* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "9", stroke: "currentColor", strokeWidth: stroke, style: { color: "var(--dt-border-strong)", opacity: 0.5 } }),
|
|
9
|
+
/* @__PURE__ */ jsx("path", { d: "M12 3a9 9 0 0 1 9 9", stroke: color, strokeWidth: stroke, strokeLinecap: "round" })
|
|
10
|
+
] }) });
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export { Spinner };
|
|
14
|
+
//# sourceMappingURL=Spinner.mjs.map
|
|
15
|
+
//# sourceMappingURL=Spinner.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/feedback/Spinner.tsx"],"names":[],"mappings":";;;;AAUO,SAAS,OAAA,CAAQ,EAAE,IAAA,GAAO,EAAA,EAAI,SAAS,CAAA,EAAG,KAAA,GAAQ,kBAAA,EAAoB,KAAA,EAAM,EAAiB;AAClG,EAAA,KAAA,EAAM;AACN,EAAA,uBACE,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,OAAA,EAAS,eAAe,GAAG,KAAA,EAAM,EAAG,IAAA,EAAK,QAAA,EAAS,YAAA,EAAW,uBAC1E,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EAAiB,KAAA,EAAO,IAAA,EAAM,QAAQ,IAAA,EAAM,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAClF,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,YAAO,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,GAAE,GAAA,EAAI,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,QAAQ,KAAA,EAAO,EAAE,OAAO,yBAAA,EAA2B,OAAA,EAAS,KAAI,EAAG,CAAA;AAAA,oBACpI,GAAA,CAAC,UAAK,CAAA,EAAE,qBAAA,EAAsB,QAAQ,KAAA,EAAO,WAAA,EAAa,MAAA,EAAQ,aAAA,EAAc,OAAA,EAAQ;AAAA,GAAA,EAC1F,CAAA,EACF,CAAA;AAEJ","file":"Spinner.mjs","sourcesContent":["import type { CSSProperties } from 'react';\nimport { useId } from 'react';\n\nexport interface SpinnerProps {\n size?: number;\n stroke?: number;\n color?: string;\n style?: CSSProperties;\n}\n\nexport function Spinner({ size = 18, stroke = 2, color = 'var(--dt-accent)', style }: SpinnerProps) {\n useId();\n return (\n <span style={{ display: 'inline-flex', ...style }} role=\"status\" aria-label=\"로딩 중\">\n <svg className=\"dt-spinner-svg\" width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" strokeWidth={stroke} style={{ color: 'var(--dt-border-strong)', opacity: 0.5 }} />\n <path d=\"M12 3a9 9 0 0 1 9 9\" stroke={color} strokeWidth={stroke} strokeLinecap=\"round\" />\n </svg>\n </span>\n );\n}\n"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
|
|
5
|
+
// src/components/feedback/Toast.tsx
|
|
6
|
+
var DOT = { info: "var(--dt-cobalt)", success: "var(--dt-success)", warning: "var(--dt-warning)", danger: "var(--dt-danger)" };
|
|
7
|
+
function Toast({ tone = "success", title, message, action, onDismiss, style }) {
|
|
8
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { role: "status", className: "dt-toast", style: {
|
|
9
|
+
display: "flex",
|
|
10
|
+
alignItems: "flex-start",
|
|
11
|
+
gap: 11,
|
|
12
|
+
width: 340,
|
|
13
|
+
maxWidth: "90vw",
|
|
14
|
+
padding: "13px 15px",
|
|
15
|
+
background: "var(--dt-surface)",
|
|
16
|
+
borderRadius: "var(--dt-radius-md)",
|
|
17
|
+
boxShadow: "var(--dt-shadow-lg)",
|
|
18
|
+
...style
|
|
19
|
+
}, children: [
|
|
20
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { style: { width: 8, height: 8, borderRadius: 9999, marginTop: 5, flex: "0 0 auto", background: DOT[tone] ?? DOT.success } }),
|
|
21
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { flex: 1, minWidth: 0 }, children: [
|
|
22
|
+
title ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 14, fontWeight: 650, color: "var(--dt-ink-strong)" }, children: title }) : null,
|
|
23
|
+
message ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: title ? 2 : 0, fontSize: 13, lineHeight: 1.5, color: "var(--dt-muted-strong)" }, children: message }) : null
|
|
24
|
+
] }),
|
|
25
|
+
action ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { flex: "0 0 auto" }, children: action }) : null,
|
|
26
|
+
onDismiss ? /* @__PURE__ */ jsxRuntime.jsx("button", { onClick: onDismiss, "aria-label": "\uB2EB\uAE30", style: { flex: "0 0 auto", border: "none", background: "transparent", cursor: "pointer", color: "var(--dt-muted)", padding: 2, lineHeight: 0 }, children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "15", height: "15", 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
|
|
27
|
+
] });
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
exports.Toast = Toast;
|
|
31
|
+
//# sourceMappingURL=Toast.cjs.map
|
|
32
|
+
//# sourceMappingURL=Toast.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/feedback/Toast.tsx"],"names":["jsx","jsxs"],"mappings":";;;;;AAEA,IAAM,GAAA,GAAM,EAAE,IAAA,EAAM,kBAAA,EAAoB,SAAS,mBAAA,EAAqB,OAAA,EAAS,mBAAA,EAAqB,MAAA,EAAQ,kBAAA,EAAmB;AAWxH,SAAS,KAAA,CAAM,EAAE,IAAA,GAAO,SAAA,EAAW,OAAO,OAAA,EAAS,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAM,EAAe;AAChG,EAAA,uCACG,KAAA,EAAA,EAAI,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,YAAW,KAAA,EAAO;AAAA,IAC7C,OAAA,EAAS,MAAA;AAAA,IAAQ,UAAA,EAAY,YAAA;AAAA,IAAc,GAAA,EAAK,EAAA;AAAA,IAAI,KAAA,EAAO,GAAA;AAAA,IAAK,QAAA,EAAU,MAAA;AAAA,IAC1E,OAAA,EAAS,WAAA;AAAA,IAAa,UAAA,EAAY,mBAAA;AAAA,IAClC,YAAA,EAAc,qBAAA;AAAA,IAAuB,SAAA,EAAW,qBAAA;AAAA,IAChD,GAAG;AAAA,GACL,EACE,QAAA,EAAA;AAAA,oBAAAA,cAAA,CAAC,UAAK,KAAA,EAAO,EAAE,OAAO,CAAA,EAAG,MAAA,EAAQ,GAAG,YAAA,EAAc,IAAA,EAAM,WAAW,CAAA,EAAG,IAAA,EAAM,YAAY,UAAA,EAAY,GAAA,CAAI,IAAI,CAAA,IAAK,GAAA,CAAI,SAAQ,EAAG,CAAA;AAAA,oBAChIC,eAAA,CAAC,SAAI,KAAA,EAAO,EAAE,MAAM,CAAA,EAAG,QAAA,EAAU,GAAE,EAChC,QAAA,EAAA;AAAA,MAAA,KAAA,mBAAQD,cAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,UAAA,EAAY,GAAA,EAAK,KAAA,EAAO,sBAAA,EAAuB,EAAI,QAAA,EAAA,KAAA,EAAM,CAAA,GAAS,IAAA;AAAA,MACtG,0BAAUA,cAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,WAAW,KAAA,GAAQ,CAAA,GAAI,CAAA,EAAG,QAAA,EAAU,IAAI,UAAA,EAAY,GAAA,EAAK,OAAO,wBAAA,EAAyB,EAAI,mBAAQ,CAAA,GAAS;AAAA,KAAA,EACzI,CAAA;AAAA,IACC,MAAA,kCAAU,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,IAAA,EAAM,UAAA,EAAW,EAAI,QAAA,EAAA,MAAA,EAAO,CAAA,GAAS,IAAA;AAAA,IAC5D,SAAA,kCACE,QAAA,EAAA,EAAO,OAAA,EAAS,WAAW,YAAA,EAAW,cAAA,EAAK,KAAA,EAAO,EAAE,IAAA,EAAM,UAAA,EAAY,QAAQ,MAAA,EAAQ,UAAA,EAAY,eAAe,MAAA,EAAQ,SAAA,EAAW,OAAO,iBAAA,EAAmB,OAAA,EAAS,CAAA,EAAG,UAAA,EAAY,CAAA,EAAE,EACvL,yCAAC,KAAA,EAAA,EAAI,KAAA,EAAM,MAAK,MAAA,EAAO,IAAA,EAAK,SAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,aAAA,EAAY,MAAA,EAAO,QAAA,kBAAAA,cAAA,CAAC,UAAK,CAAA,EAAE,sBAAA,EAAuB,QAAO,cAAA,EAAe,WAAA,EAAY,KAAI,aAAA,EAAc,OAAA,EAAQ,CAAA,EAAE,CAAA,EAC9K,CAAA,GACE;AAAA,GAAA,EACN,CAAA;AAEJ","file":"Toast.cjs","sourcesContent":["import type { CSSProperties, ReactNode } from 'react';\n\nconst DOT = { info: 'var(--dt-cobalt)', success: 'var(--dt-success)', warning: 'var(--dt-warning)', danger: 'var(--dt-danger)' };\n\nexport interface ToastProps {\n tone?: keyof typeof DOT;\n title?: ReactNode;\n message?: ReactNode;\n action?: ReactNode;\n onDismiss?: () => void;\n style?: CSSProperties;\n}\n\nexport function Toast({ tone = 'success', title, message, action, onDismiss, style }: ToastProps) {\n return (\n <div role=\"status\" className=\"dt-toast\" style={{\n display: 'flex', alignItems: 'flex-start', gap: 11, width: 340, maxWidth: '90vw',\n padding: '13px 15px', background: 'var(--dt-surface)',\n borderRadius: 'var(--dt-radius-md)', boxShadow: 'var(--dt-shadow-lg)',\n ...style,\n }}>\n <span style={{ width: 8, height: 8, borderRadius: 9999, marginTop: 5, flex: '0 0 auto', background: DOT[tone] ?? DOT.success }} />\n <div style={{ flex: 1, minWidth: 0 }}>\n {title ? <div style={{ fontSize: 14, fontWeight: 650, color: 'var(--dt-ink-strong)' }}>{title}</div> : null}\n {message ? <div style={{ marginTop: title ? 2 : 0, fontSize: 13, lineHeight: 1.5, color: 'var(--dt-muted-strong)' }}>{message}</div> : null}\n </div>\n {action ? <div style={{ flex: '0 0 auto' }}>{action}</div> : null}\n {onDismiss ? (\n <button onClick={onDismiss} aria-label=\"닫기\" style={{ flex: '0 0 auto', border: 'none', background: 'transparent', cursor: 'pointer', color: 'var(--dt-muted)', padding: 2, lineHeight: 0 }}>\n <svg width=\"15\" height=\"15\" 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,20 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { ReactNode, CSSProperties } from 'react';
|
|
3
|
+
|
|
4
|
+
declare const DOT: {
|
|
5
|
+
info: string;
|
|
6
|
+
success: string;
|
|
7
|
+
warning: string;
|
|
8
|
+
danger: string;
|
|
9
|
+
};
|
|
10
|
+
interface ToastProps {
|
|
11
|
+
tone?: keyof typeof DOT;
|
|
12
|
+
title?: ReactNode;
|
|
13
|
+
message?: ReactNode;
|
|
14
|
+
action?: ReactNode;
|
|
15
|
+
onDismiss?: () => void;
|
|
16
|
+
style?: CSSProperties;
|
|
17
|
+
}
|
|
18
|
+
declare function Toast({ tone, title, message, action, onDismiss, style }: ToastProps): react.JSX.Element;
|
|
19
|
+
|
|
20
|
+
export { Toast, type ToastProps };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { ReactNode, CSSProperties } from 'react';
|
|
3
|
+
|
|
4
|
+
declare const DOT: {
|
|
5
|
+
info: string;
|
|
6
|
+
success: string;
|
|
7
|
+
warning: string;
|
|
8
|
+
danger: string;
|
|
9
|
+
};
|
|
10
|
+
interface ToastProps {
|
|
11
|
+
tone?: keyof typeof DOT;
|
|
12
|
+
title?: ReactNode;
|
|
13
|
+
message?: ReactNode;
|
|
14
|
+
action?: ReactNode;
|
|
15
|
+
onDismiss?: () => void;
|
|
16
|
+
style?: CSSProperties;
|
|
17
|
+
}
|
|
18
|
+
declare function Toast({ tone, title, message, action, onDismiss, style }: ToastProps): react.JSX.Element;
|
|
19
|
+
|
|
20
|
+
export { Toast, type ToastProps };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
// src/components/feedback/Toast.tsx
|
|
4
|
+
var DOT = { info: "var(--dt-cobalt)", success: "var(--dt-success)", warning: "var(--dt-warning)", danger: "var(--dt-danger)" };
|
|
5
|
+
function Toast({ tone = "success", title, message, action, onDismiss, style }) {
|
|
6
|
+
return /* @__PURE__ */ jsxs("div", { role: "status", className: "dt-toast", style: {
|
|
7
|
+
display: "flex",
|
|
8
|
+
alignItems: "flex-start",
|
|
9
|
+
gap: 11,
|
|
10
|
+
width: 340,
|
|
11
|
+
maxWidth: "90vw",
|
|
12
|
+
padding: "13px 15px",
|
|
13
|
+
background: "var(--dt-surface)",
|
|
14
|
+
borderRadius: "var(--dt-radius-md)",
|
|
15
|
+
boxShadow: "var(--dt-shadow-lg)",
|
|
16
|
+
...style
|
|
17
|
+
}, children: [
|
|
18
|
+
/* @__PURE__ */ jsx("span", { style: { width: 8, height: 8, borderRadius: 9999, marginTop: 5, flex: "0 0 auto", background: DOT[tone] ?? DOT.success } }),
|
|
19
|
+
/* @__PURE__ */ jsxs("div", { style: { flex: 1, minWidth: 0 }, children: [
|
|
20
|
+
title ? /* @__PURE__ */ jsx("div", { style: { fontSize: 14, fontWeight: 650, color: "var(--dt-ink-strong)" }, children: title }) : null,
|
|
21
|
+
message ? /* @__PURE__ */ jsx("div", { style: { marginTop: title ? 2 : 0, fontSize: 13, lineHeight: 1.5, color: "var(--dt-muted-strong)" }, children: message }) : null
|
|
22
|
+
] }),
|
|
23
|
+
action ? /* @__PURE__ */ jsx("div", { style: { flex: "0 0 auto" }, children: action }) : null,
|
|
24
|
+
onDismiss ? /* @__PURE__ */ jsx("button", { onClick: onDismiss, "aria-label": "\uB2EB\uAE30", style: { flex: "0 0 auto", border: "none", background: "transparent", cursor: "pointer", color: "var(--dt-muted)", padding: 2, lineHeight: 0 }, children: /* @__PURE__ */ jsx("svg", { width: "15", height: "15", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx("path", { d: "M6 6l12 12M18 6L6 18", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round" }) }) }) : null
|
|
25
|
+
] });
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export { Toast };
|
|
29
|
+
//# sourceMappingURL=Toast.mjs.map
|
|
30
|
+
//# sourceMappingURL=Toast.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/feedback/Toast.tsx"],"names":[],"mappings":";;;AAEA,IAAM,GAAA,GAAM,EAAE,IAAA,EAAM,kBAAA,EAAoB,SAAS,mBAAA,EAAqB,OAAA,EAAS,mBAAA,EAAqB,MAAA,EAAQ,kBAAA,EAAmB;AAWxH,SAAS,KAAA,CAAM,EAAE,IAAA,GAAO,SAAA,EAAW,OAAO,OAAA,EAAS,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAM,EAAe;AAChG,EAAA,4BACG,KAAA,EAAA,EAAI,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,YAAW,KAAA,EAAO;AAAA,IAC7C,OAAA,EAAS,MAAA;AAAA,IAAQ,UAAA,EAAY,YAAA;AAAA,IAAc,GAAA,EAAK,EAAA;AAAA,IAAI,KAAA,EAAO,GAAA;AAAA,IAAK,QAAA,EAAU,MAAA;AAAA,IAC1E,OAAA,EAAS,WAAA;AAAA,IAAa,UAAA,EAAY,mBAAA;AAAA,IAClC,YAAA,EAAc,qBAAA;AAAA,IAAuB,SAAA,EAAW,qBAAA;AAAA,IAChD,GAAG;AAAA,GACL,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,UAAK,KAAA,EAAO,EAAE,OAAO,CAAA,EAAG,MAAA,EAAQ,GAAG,YAAA,EAAc,IAAA,EAAM,WAAW,CAAA,EAAG,IAAA,EAAM,YAAY,UAAA,EAAY,GAAA,CAAI,IAAI,CAAA,IAAK,GAAA,CAAI,SAAQ,EAAG,CAAA;AAAA,oBAChI,IAAA,CAAC,SAAI,KAAA,EAAO,EAAE,MAAM,CAAA,EAAG,QAAA,EAAU,GAAE,EAChC,QAAA,EAAA;AAAA,MAAA,KAAA,mBAAQ,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,UAAA,EAAY,GAAA,EAAK,KAAA,EAAO,sBAAA,EAAuB,EAAI,QAAA,EAAA,KAAA,EAAM,CAAA,GAAS,IAAA;AAAA,MACtG,0BAAU,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,WAAW,KAAA,GAAQ,CAAA,GAAI,CAAA,EAAG,QAAA,EAAU,IAAI,UAAA,EAAY,GAAA,EAAK,OAAO,wBAAA,EAAyB,EAAI,mBAAQ,CAAA,GAAS;AAAA,KAAA,EACzI,CAAA;AAAA,IACC,MAAA,uBAAU,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,IAAA,EAAM,UAAA,EAAW,EAAI,QAAA,EAAA,MAAA,EAAO,CAAA,GAAS,IAAA;AAAA,IAC5D,SAAA,uBACE,QAAA,EAAA,EAAO,OAAA,EAAS,WAAW,YAAA,EAAW,cAAA,EAAK,KAAA,EAAO,EAAE,IAAA,EAAM,UAAA,EAAY,QAAQ,MAAA,EAAQ,UAAA,EAAY,eAAe,MAAA,EAAQ,SAAA,EAAW,OAAO,iBAAA,EAAmB,OAAA,EAAS,CAAA,EAAG,UAAA,EAAY,CAAA,EAAE,EACvL,8BAAC,KAAA,EAAA,EAAI,KAAA,EAAM,MAAK,MAAA,EAAO,IAAA,EAAK,SAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,aAAA,EAAY,MAAA,EAAO,QAAA,kBAAA,GAAA,CAAC,UAAK,CAAA,EAAE,sBAAA,EAAuB,QAAO,cAAA,EAAe,WAAA,EAAY,KAAI,aAAA,EAAc,OAAA,EAAQ,CAAA,EAAE,CAAA,EAC9K,CAAA,GACE;AAAA,GAAA,EACN,CAAA;AAEJ","file":"Toast.mjs","sourcesContent":["import type { CSSProperties, ReactNode } from 'react';\n\nconst DOT = { info: 'var(--dt-cobalt)', success: 'var(--dt-success)', warning: 'var(--dt-warning)', danger: 'var(--dt-danger)' };\n\nexport interface ToastProps {\n tone?: keyof typeof DOT;\n title?: ReactNode;\n message?: ReactNode;\n action?: ReactNode;\n onDismiss?: () => void;\n style?: CSSProperties;\n}\n\nexport function Toast({ tone = 'success', title, message, action, onDismiss, style }: ToastProps) {\n return (\n <div role=\"status\" className=\"dt-toast\" style={{\n display: 'flex', alignItems: 'flex-start', gap: 11, width: 340, maxWidth: '90vw',\n padding: '13px 15px', background: 'var(--dt-surface)',\n borderRadius: 'var(--dt-radius-md)', boxShadow: 'var(--dt-shadow-lg)',\n ...style,\n }}>\n <span style={{ width: 8, height: 8, borderRadius: 9999, marginTop: 5, flex: '0 0 auto', background: DOT[tone] ?? DOT.success }} />\n <div style={{ flex: 1, minWidth: 0 }}>\n {title ? <div style={{ fontSize: 14, fontWeight: 650, color: 'var(--dt-ink-strong)' }}>{title}</div> : null}\n {message ? <div style={{ marginTop: title ? 2 : 0, fontSize: 13, lineHeight: 1.5, color: 'var(--dt-muted-strong)' }}>{message}</div> : null}\n </div>\n {action ? <div style={{ flex: '0 0 auto' }}>{action}</div> : null}\n {onDismiss ? (\n <button onClick={onDismiss} aria-label=\"닫기\" style={{ flex: '0 0 auto', border: 'none', background: 'transparent', cursor: 'pointer', color: 'var(--dt-muted)', padding: 2, lineHeight: 0 }}>\n <svg width=\"15\" height=\"15\" 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,51 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
+
|
|
6
|
+
// src/components/feedback/Tooltip.tsx
|
|
7
|
+
function Tooltip({ label, position = "top", children }) {
|
|
8
|
+
const tooltipId = react.useId();
|
|
9
|
+
const [show, setShow] = react.useState(false);
|
|
10
|
+
const pos = {
|
|
11
|
+
top: { bottom: "100%", left: "50%", transform: "translateX(-50%) translateY(-7px)" },
|
|
12
|
+
bottom: { top: "100%", left: "50%", transform: "translateX(-50%) translateY(7px)" },
|
|
13
|
+
left: { right: "100%", top: "50%", transform: "translateY(-50%) translateX(-7px)" },
|
|
14
|
+
right: { left: "100%", top: "50%", transform: "translateY(-50%) translateX(7px)" }
|
|
15
|
+
}[position];
|
|
16
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
17
|
+
"span",
|
|
18
|
+
{
|
|
19
|
+
style: { position: "relative", display: "inline-flex" },
|
|
20
|
+
onMouseEnter: () => setShow(true),
|
|
21
|
+
onMouseLeave: () => setShow(false),
|
|
22
|
+
onFocus: () => setShow(true),
|
|
23
|
+
onBlur: () => setShow(false),
|
|
24
|
+
children: [
|
|
25
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { "aria-describedby": show ? tooltipId : void 0, children }),
|
|
26
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { id: tooltipId, role: "tooltip", style: {
|
|
27
|
+
position: "absolute",
|
|
28
|
+
zIndex: 60,
|
|
29
|
+
whiteSpace: "nowrap",
|
|
30
|
+
pointerEvents: "none",
|
|
31
|
+
opacity: show ? 1 : 0,
|
|
32
|
+
visibility: show ? "visible" : "hidden",
|
|
33
|
+
padding: "6px 9px",
|
|
34
|
+
fontSize: 12,
|
|
35
|
+
fontWeight: 500,
|
|
36
|
+
lineHeight: 1.2,
|
|
37
|
+
color: "var(--dt-paper)",
|
|
38
|
+
background: "var(--dt-ink-strong)",
|
|
39
|
+
borderRadius: "var(--dt-radius-sm)",
|
|
40
|
+
boxShadow: "var(--dt-shadow-md)",
|
|
41
|
+
transition: "opacity var(--dt-motion-fast), visibility var(--dt-motion-fast)",
|
|
42
|
+
...pos
|
|
43
|
+
}, children: label })
|
|
44
|
+
]
|
|
45
|
+
}
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
exports.Tooltip = Tooltip;
|
|
50
|
+
//# sourceMappingURL=Tooltip.cjs.map
|
|
51
|
+
//# sourceMappingURL=Tooltip.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/feedback/Tooltip.tsx"],"names":["useId","useState","jsxs","jsx"],"mappings":";;;;;;AASO,SAAS,QAAQ,EAAE,KAAA,EAAO,QAAA,GAAW,KAAA,EAAO,UAAS,EAAiB;AAC3E,EAAA,MAAM,YAAYA,WAAA,EAAM;AACxB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIC,eAAS,KAAK,CAAA;AACtC,EAAA,MAAM,GAAA,GAAqB;AAAA,IACzB,KAAK,EAAE,MAAA,EAAQ,QAAQ,IAAA,EAAM,KAAA,EAAO,WAAW,mCAAA,EAAoC;AAAA,IACnF,QAAQ,EAAE,GAAA,EAAK,QAAQ,IAAA,EAAM,KAAA,EAAO,WAAW,kCAAA,EAAmC;AAAA,IAClF,MAAM,EAAE,KAAA,EAAO,QAAQ,GAAA,EAAK,KAAA,EAAO,WAAW,mCAAA,EAAoC;AAAA,IAClF,OAAO,EAAE,IAAA,EAAM,QAAQ,GAAA,EAAK,KAAA,EAAO,WAAW,kCAAA;AAAmC,IACjF,QAAQ,CAAA;AACV,EAAA,uBACEC,eAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MAAK,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,SAAS,aAAA,EAAc;AAAA,MAC1D,YAAA,EAAc,MAAM,OAAA,CAAQ,IAAI,CAAA;AAAA,MAAG,YAAA,EAAc,MAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,MACpE,OAAA,EAAS,MAAM,OAAA,CAAQ,IAAI,CAAA;AAAA,MAAG,MAAA,EAAQ,MAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,MACzD,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,MAAA,EAAA,EAAK,kBAAA,EAAkB,IAAA,GAAO,SAAA,GAAY,QAAY,QAAA,EAAS,CAAA;AAAA,uCAC/D,MAAA,EAAA,EAAK,EAAA,EAAI,SAAA,EAAW,IAAA,EAAK,WAAU,KAAA,EAAO;AAAA,UACzC,QAAA,EAAU,UAAA;AAAA,UAAY,MAAA,EAAQ,EAAA;AAAA,UAAI,UAAA,EAAY,QAAA;AAAA,UAAU,aAAA,EAAe,MAAA;AAAA,UACvE,OAAA,EAAS,OAAO,CAAA,GAAI,CAAA;AAAA,UAAG,UAAA,EAAY,OAAO,SAAA,GAAY,QAAA;AAAA,UACtD,OAAA,EAAS,SAAA;AAAA,UAAW,QAAA,EAAU,EAAA;AAAA,UAAI,UAAA,EAAY,GAAA;AAAA,UAAK,UAAA,EAAY,GAAA;AAAA,UAC/D,KAAA,EAAO,iBAAA;AAAA,UAAmB,UAAA,EAAY,sBAAA;AAAA,UACtC,YAAA,EAAc,qBAAA;AAAA,UAAuB,SAAA,EAAW,qBAAA;AAAA,UAChD,UAAA,EAAY,iEAAA;AAAA,UAAmE,GAAG;AAAA,WAChF,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,GACZ;AAEJ","file":"Tooltip.cjs","sourcesContent":["import type { CSSProperties, ReactNode } from 'react';\nimport { useState, useId } from 'react';\n\nexport interface TooltipProps {\n label: ReactNode;\n position?: 'top' | 'bottom' | 'left' | 'right';\n children: ReactNode;\n}\n\nexport function Tooltip({ label, position = 'top', children }: TooltipProps) {\n const tooltipId = useId();\n const [show, setShow] = useState(false);\n const pos: CSSProperties = {\n top: { bottom: '100%', left: '50%', transform: 'translateX(-50%) translateY(-7px)' },\n bottom: { top: '100%', left: '50%', transform: 'translateX(-50%) translateY(7px)' },\n left: { right: '100%', top: '50%', transform: 'translateY(-50%) translateX(-7px)' },\n right: { left: '100%', top: '50%', transform: 'translateY(-50%) translateX(7px)' },\n }[position];\n return (\n <span style={{ position: 'relative', display: 'inline-flex' }}\n onMouseEnter={() => setShow(true)} onMouseLeave={() => setShow(false)}\n onFocus={() => setShow(true)} onBlur={() => setShow(false)}>\n <span aria-describedby={show ? tooltipId : undefined}>{children}</span>\n <span id={tooltipId} role=\"tooltip\" style={{\n position: 'absolute', zIndex: 60, whiteSpace: 'nowrap', pointerEvents: 'none',\n opacity: show ? 1 : 0, visibility: show ? 'visible' : 'hidden',\n padding: '6px 9px', fontSize: 12, fontWeight: 500, lineHeight: 1.2,\n color: 'var(--dt-paper)', background: 'var(--dt-ink-strong)',\n borderRadius: 'var(--dt-radius-sm)', boxShadow: 'var(--dt-shadow-md)',\n transition: 'opacity var(--dt-motion-fast), visibility var(--dt-motion-fast)', ...pos,\n }}>{label}</span>\n </span>\n );\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
interface TooltipProps {
|
|
5
|
+
label: ReactNode;
|
|
6
|
+
position?: 'top' | 'bottom' | 'left' | 'right';
|
|
7
|
+
children: ReactNode;
|
|
8
|
+
}
|
|
9
|
+
declare function Tooltip({ label, position, children }: TooltipProps): react.JSX.Element;
|
|
10
|
+
|
|
11
|
+
export { Tooltip, type TooltipProps };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
interface TooltipProps {
|
|
5
|
+
label: ReactNode;
|
|
6
|
+
position?: 'top' | 'bottom' | 'left' | 'right';
|
|
7
|
+
children: ReactNode;
|
|
8
|
+
}
|
|
9
|
+
declare function Tooltip({ label, position, children }: TooltipProps): react.JSX.Element;
|
|
10
|
+
|
|
11
|
+
export { Tooltip, type TooltipProps };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { useId, useState } from 'react';
|
|
2
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
// src/components/feedback/Tooltip.tsx
|
|
5
|
+
function Tooltip({ label, position = "top", children }) {
|
|
6
|
+
const tooltipId = useId();
|
|
7
|
+
const [show, setShow] = useState(false);
|
|
8
|
+
const pos = {
|
|
9
|
+
top: { bottom: "100%", left: "50%", transform: "translateX(-50%) translateY(-7px)" },
|
|
10
|
+
bottom: { top: "100%", left: "50%", transform: "translateX(-50%) translateY(7px)" },
|
|
11
|
+
left: { right: "100%", top: "50%", transform: "translateY(-50%) translateX(-7px)" },
|
|
12
|
+
right: { left: "100%", top: "50%", transform: "translateY(-50%) translateX(7px)" }
|
|
13
|
+
}[position];
|
|
14
|
+
return /* @__PURE__ */ jsxs(
|
|
15
|
+
"span",
|
|
16
|
+
{
|
|
17
|
+
style: { position: "relative", display: "inline-flex" },
|
|
18
|
+
onMouseEnter: () => setShow(true),
|
|
19
|
+
onMouseLeave: () => setShow(false),
|
|
20
|
+
onFocus: () => setShow(true),
|
|
21
|
+
onBlur: () => setShow(false),
|
|
22
|
+
children: [
|
|
23
|
+
/* @__PURE__ */ jsx("span", { "aria-describedby": show ? tooltipId : void 0, children }),
|
|
24
|
+
/* @__PURE__ */ jsx("span", { id: tooltipId, role: "tooltip", style: {
|
|
25
|
+
position: "absolute",
|
|
26
|
+
zIndex: 60,
|
|
27
|
+
whiteSpace: "nowrap",
|
|
28
|
+
pointerEvents: "none",
|
|
29
|
+
opacity: show ? 1 : 0,
|
|
30
|
+
visibility: show ? "visible" : "hidden",
|
|
31
|
+
padding: "6px 9px",
|
|
32
|
+
fontSize: 12,
|
|
33
|
+
fontWeight: 500,
|
|
34
|
+
lineHeight: 1.2,
|
|
35
|
+
color: "var(--dt-paper)",
|
|
36
|
+
background: "var(--dt-ink-strong)",
|
|
37
|
+
borderRadius: "var(--dt-radius-sm)",
|
|
38
|
+
boxShadow: "var(--dt-shadow-md)",
|
|
39
|
+
transition: "opacity var(--dt-motion-fast), visibility var(--dt-motion-fast)",
|
|
40
|
+
...pos
|
|
41
|
+
}, children: label })
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export { Tooltip };
|
|
48
|
+
//# sourceMappingURL=Tooltip.mjs.map
|
|
49
|
+
//# sourceMappingURL=Tooltip.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/feedback/Tooltip.tsx"],"names":[],"mappings":";;;;AASO,SAAS,QAAQ,EAAE,KAAA,EAAO,QAAA,GAAW,KAAA,EAAO,UAAS,EAAiB;AAC3E,EAAA,MAAM,YAAY,KAAA,EAAM;AACxB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,GAAA,GAAqB;AAAA,IACzB,KAAK,EAAE,MAAA,EAAQ,QAAQ,IAAA,EAAM,KAAA,EAAO,WAAW,mCAAA,EAAoC;AAAA,IACnF,QAAQ,EAAE,GAAA,EAAK,QAAQ,IAAA,EAAM,KAAA,EAAO,WAAW,kCAAA,EAAmC;AAAA,IAClF,MAAM,EAAE,KAAA,EAAO,QAAQ,GAAA,EAAK,KAAA,EAAO,WAAW,mCAAA,EAAoC;AAAA,IAClF,OAAO,EAAE,IAAA,EAAM,QAAQ,GAAA,EAAK,KAAA,EAAO,WAAW,kCAAA;AAAmC,IACjF,QAAQ,CAAA;AACV,EAAA,uBACE,IAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MAAK,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,SAAS,aAAA,EAAc;AAAA,MAC1D,YAAA,EAAc,MAAM,OAAA,CAAQ,IAAI,CAAA;AAAA,MAAG,YAAA,EAAc,MAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,MACpE,OAAA,EAAS,MAAM,OAAA,CAAQ,IAAI,CAAA;AAAA,MAAG,MAAA,EAAQ,MAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,MACzD,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,kBAAA,EAAkB,IAAA,GAAO,SAAA,GAAY,QAAY,QAAA,EAAS,CAAA;AAAA,4BAC/D,MAAA,EAAA,EAAK,EAAA,EAAI,SAAA,EAAW,IAAA,EAAK,WAAU,KAAA,EAAO;AAAA,UACzC,QAAA,EAAU,UAAA;AAAA,UAAY,MAAA,EAAQ,EAAA;AAAA,UAAI,UAAA,EAAY,QAAA;AAAA,UAAU,aAAA,EAAe,MAAA;AAAA,UACvE,OAAA,EAAS,OAAO,CAAA,GAAI,CAAA;AAAA,UAAG,UAAA,EAAY,OAAO,SAAA,GAAY,QAAA;AAAA,UACtD,OAAA,EAAS,SAAA;AAAA,UAAW,QAAA,EAAU,EAAA;AAAA,UAAI,UAAA,EAAY,GAAA;AAAA,UAAK,UAAA,EAAY,GAAA;AAAA,UAC/D,KAAA,EAAO,iBAAA;AAAA,UAAmB,UAAA,EAAY,sBAAA;AAAA,UACtC,YAAA,EAAc,qBAAA;AAAA,UAAuB,SAAA,EAAW,qBAAA;AAAA,UAChD,UAAA,EAAY,iEAAA;AAAA,UAAmE,GAAG;AAAA,WAChF,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,GACZ;AAEJ","file":"Tooltip.mjs","sourcesContent":["import type { CSSProperties, ReactNode } from 'react';\nimport { useState, useId } from 'react';\n\nexport interface TooltipProps {\n label: ReactNode;\n position?: 'top' | 'bottom' | 'left' | 'right';\n children: ReactNode;\n}\n\nexport function Tooltip({ label, position = 'top', children }: TooltipProps) {\n const tooltipId = useId();\n const [show, setShow] = useState(false);\n const pos: CSSProperties = {\n top: { bottom: '100%', left: '50%', transform: 'translateX(-50%) translateY(-7px)' },\n bottom: { top: '100%', left: '50%', transform: 'translateX(-50%) translateY(7px)' },\n left: { right: '100%', top: '50%', transform: 'translateY(-50%) translateX(-7px)' },\n right: { left: '100%', top: '50%', transform: 'translateY(-50%) translateX(7px)' },\n }[position];\n return (\n <span style={{ position: 'relative', display: 'inline-flex' }}\n onMouseEnter={() => setShow(true)} onMouseLeave={() => setShow(false)}\n onFocus={() => setShow(true)} onBlur={() => setShow(false)}>\n <span aria-describedby={show ? tooltipId : undefined}>{children}</span>\n <span id={tooltipId} role=\"tooltip\" style={{\n position: 'absolute', zIndex: 60, whiteSpace: 'nowrap', pointerEvents: 'none',\n opacity: show ? 1 : 0, visibility: show ? 'visible' : 'hidden',\n padding: '6px 9px', fontSize: 12, fontWeight: 500, lineHeight: 1.2,\n color: 'var(--dt-paper)', background: 'var(--dt-ink-strong)',\n borderRadius: 'var(--dt-radius-sm)', boxShadow: 'var(--dt-shadow-md)',\n transition: 'opacity var(--dt-motion-fast), visibility var(--dt-motion-fast)', ...pos,\n }}>{label}</span>\n </span>\n );\n}\n"]}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
+
|
|
6
|
+
// src/components/forms/Checkbox.tsx
|
|
7
|
+
function Checkbox({ label, checked, defaultChecked, onChange, disabled, id, style }) {
|
|
8
|
+
const cbId = id || (label ? `cb-${String(label).replace(/\s+/g, "-")}` : void 0);
|
|
9
|
+
const [internal, setInternal] = react.useState(defaultChecked ?? false);
|
|
10
|
+
const isOn = checked !== void 0 ? checked : internal;
|
|
11
|
+
const toggle = () => {
|
|
12
|
+
if (disabled) return;
|
|
13
|
+
if (checked === void 0) setInternal((v) => !v);
|
|
14
|
+
onChange?.(!isOn);
|
|
15
|
+
};
|
|
16
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
17
|
+
"label",
|
|
18
|
+
{
|
|
19
|
+
htmlFor: cbId,
|
|
20
|
+
style: {
|
|
21
|
+
display: "inline-flex",
|
|
22
|
+
alignItems: "center",
|
|
23
|
+
gap: 9,
|
|
24
|
+
cursor: disabled ? "not-allowed" : "pointer",
|
|
25
|
+
opacity: disabled ? 0.55 : 1,
|
|
26
|
+
...style
|
|
27
|
+
},
|
|
28
|
+
children: [
|
|
29
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
30
|
+
"input",
|
|
31
|
+
{
|
|
32
|
+
id: cbId,
|
|
33
|
+
type: "checkbox",
|
|
34
|
+
checked: isOn,
|
|
35
|
+
onChange: toggle,
|
|
36
|
+
disabled,
|
|
37
|
+
style: { position: "absolute", opacity: 0, width: 0, height: 0 }
|
|
38
|
+
}
|
|
39
|
+
),
|
|
40
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
41
|
+
"span",
|
|
42
|
+
{
|
|
43
|
+
style: {
|
|
44
|
+
width: 18,
|
|
45
|
+
height: 18,
|
|
46
|
+
flex: "0 0 auto",
|
|
47
|
+
borderRadius: 5,
|
|
48
|
+
display: "grid",
|
|
49
|
+
placeItems: "center",
|
|
50
|
+
background: isOn ? "var(--dt-accent)" : "var(--dt-surface)",
|
|
51
|
+
border: `1.5px solid ${isOn ? "var(--dt-accent)" : "var(--dt-border-strong)"}`,
|
|
52
|
+
transition: "background-color 130ms, border-color 130ms"
|
|
53
|
+
},
|
|
54
|
+
children: isOn ? /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
55
|
+
"path",
|
|
56
|
+
{
|
|
57
|
+
d: "M5 12l4.5 4.5L19 7",
|
|
58
|
+
stroke: "var(--dt-accent-ink)",
|
|
59
|
+
strokeWidth: "3",
|
|
60
|
+
strokeLinecap: "round",
|
|
61
|
+
strokeLinejoin: "round"
|
|
62
|
+
}
|
|
63
|
+
) }) : null
|
|
64
|
+
}
|
|
65
|
+
),
|
|
66
|
+
label ? /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 14, color: "var(--dt-ink)" }, children: label }) : null
|
|
67
|
+
]
|
|
68
|
+
}
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
exports.Checkbox = Checkbox;
|
|
73
|
+
//# sourceMappingURL=Checkbox.cjs.map
|
|
74
|
+
//# sourceMappingURL=Checkbox.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/forms/Checkbox.tsx"],"names":["useState","jsxs","jsx"],"mappings":";;;;;;AAkBO,SAAS,QAAA,CAAS,EAAE,KAAA,EAAO,OAAA,EAAS,gBAAgB,QAAA,EAAU,QAAA,EAAU,EAAA,EAAI,KAAA,EAAM,EAAkB;AACzG,EAAA,MAAM,IAAA,GAAO,EAAA,KAAO,KAAA,GAAQ,CAAA,GAAA,EAAM,MAAA,CAAO,KAAK,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAC,CAAA,CAAA,GAAK,MAAA,CAAA;AACzE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,cAAA,CAAS,kBAAkB,KAAK,CAAA;AAChE,EAAA,MAAM,IAAA,GAAO,OAAA,KAAY,MAAA,GAAY,OAAA,GAAU,QAAA;AAC/C,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,IAAI,QAAA,EAAU;AACd,IAAA,IAAI,YAAY,MAAA,EAAW,WAAA,CAAY,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAChD,IAAA,QAAA,GAAW,CAAC,IAAI,CAAA;AAAA,EAClB,CAAA;AACA,EAAA,uBACEC,eAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,IAAA;AAAA,MACT,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,aAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,GAAA,EAAK,CAAA;AAAA,QACL,MAAA,EAAQ,WAAW,aAAA,GAAgB,SAAA;AAAA,QACnC,OAAA,EAAS,WAAW,IAAA,GAAO,CAAA;AAAA,QAC3B,GAAG;AAAA,OACL;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAC,cAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI,IAAA;AAAA,YACJ,IAAA,EAAK,UAAA;AAAA,YACL,OAAA,EAAS,IAAA;AAAA,YACT,QAAA,EAAU,MAAA;AAAA,YACV,QAAA;AAAA,YACA,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,SAAS,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA;AAAE;AAAA,SACjE;AAAA,wBACAA,cAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,KAAA,EAAO,EAAA;AAAA,cACP,MAAA,EAAQ,EAAA;AAAA,cACR,IAAA,EAAM,UAAA;AAAA,cACN,YAAA,EAAc,CAAA;AAAA,cACd,OAAA,EAAS,MAAA;AAAA,cACT,UAAA,EAAY,QAAA;AAAA,cACZ,UAAA,EAAY,OAAO,kBAAA,GAAqB,mBAAA;AAAA,cACxC,MAAA,EAAQ,CAAA,YAAA,EAAe,IAAA,GAAO,kBAAA,GAAqB,yBAAyB,CAAA,CAAA;AAAA,cAC5E,UAAA,EAAY;AAAA,aACd;AAAA,YAEC,QAAA,EAAA,IAAA,mBACCA,cAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,aAAA,EAAY,MAAA,EACtE,QAAA,kBAAAA,cAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,CAAA,EAAE,oBAAA;AAAA,gBACF,MAAA,EAAO,sBAAA;AAAA,gBACP,WAAA,EAAY,GAAA;AAAA,gBACZ,aAAA,EAAc,OAAA;AAAA,gBACd,cAAA,EAAe;AAAA;AAAA,eAEnB,CAAA,GACE;AAAA;AAAA,SACN;AAAA,QACC,KAAA,mBAAQA,cAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,KAAA,EAAO,eAAA,EAAgB,EAAI,QAAA,EAAA,KAAA,EAAM,CAAA,GAAU;AAAA;AAAA;AAAA,GACnF;AAEJ","file":"Checkbox.cjs","sourcesContent":["import { useState } from 'react';\nimport type { CSSProperties, InputHTMLAttributes, ReactNode } from 'react';\n\nexport interface CheckboxProps\n extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'checked' | 'defaultChecked' | 'disabled' | 'id' | 'label' | 'onChange' | 'style'\n > {\n label?: ReactNode;\n checked?: boolean;\n defaultChecked?: boolean;\n onChange?: (checked: boolean) => void;\n disabled?: boolean;\n id?: string;\n style?: CSSProperties;\n}\n\n/** Checkbox — persimmon fill when checked. */\nexport function Checkbox({ label, checked, defaultChecked, onChange, disabled, id, style }: CheckboxProps) {\n const cbId = id || (label ? `cb-${String(label).replace(/\\s+/g, '-')}` : undefined);\n const [internal, setInternal] = useState(defaultChecked ?? false);\n const isOn = checked !== undefined ? checked : internal;\n const toggle = () => {\n if (disabled) return;\n if (checked === undefined) setInternal((v) => !v);\n onChange?.(!isOn);\n };\n return (\n <label\n htmlFor={cbId}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 9,\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.55 : 1,\n ...style,\n }}\n >\n <input\n id={cbId}\n type=\"checkbox\"\n checked={isOn}\n onChange={toggle}\n disabled={disabled}\n style={{ position: 'absolute', opacity: 0, width: 0, height: 0 }}\n />\n <span\n style={{\n width: 18,\n height: 18,\n flex: '0 0 auto',\n borderRadius: 5,\n display: 'grid',\n placeItems: 'center',\n background: isOn ? 'var(--dt-accent)' : 'var(--dt-surface)',\n border: `1.5px solid ${isOn ? 'var(--dt-accent)' : 'var(--dt-border-strong)'}`,\n transition: 'background-color 130ms, border-color 130ms',\n }}\n >\n {isOn ? (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M5 12l4.5 4.5L19 7\"\n stroke=\"var(--dt-accent-ink)\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n ) : null}\n </span>\n {label ? <span style={{ fontSize: 14, color: 'var(--dt-ink)' }}>{label}</span> : null}\n </label>\n );\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { InputHTMLAttributes, ReactNode, CSSProperties } from 'react';
|
|
3
|
+
|
|
4
|
+
interface CheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'checked' | 'defaultChecked' | 'disabled' | 'id' | 'label' | 'onChange' | 'style'> {
|
|
5
|
+
label?: ReactNode;
|
|
6
|
+
checked?: boolean;
|
|
7
|
+
defaultChecked?: boolean;
|
|
8
|
+
onChange?: (checked: boolean) => void;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
id?: string;
|
|
11
|
+
style?: CSSProperties;
|
|
12
|
+
}
|
|
13
|
+
/** Checkbox — persimmon fill when checked. */
|
|
14
|
+
declare function Checkbox({ label, checked, defaultChecked, onChange, disabled, id, style }: CheckboxProps): react.JSX.Element;
|
|
15
|
+
|
|
16
|
+
export { Checkbox, type CheckboxProps };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { InputHTMLAttributes, ReactNode, CSSProperties } from 'react';
|
|
3
|
+
|
|
4
|
+
interface CheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'checked' | 'defaultChecked' | 'disabled' | 'id' | 'label' | 'onChange' | 'style'> {
|
|
5
|
+
label?: ReactNode;
|
|
6
|
+
checked?: boolean;
|
|
7
|
+
defaultChecked?: boolean;
|
|
8
|
+
onChange?: (checked: boolean) => void;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
id?: string;
|
|
11
|
+
style?: CSSProperties;
|
|
12
|
+
}
|
|
13
|
+
/** Checkbox — persimmon fill when checked. */
|
|
14
|
+
declare function Checkbox({ label, checked, defaultChecked, onChange, disabled, id, style }: CheckboxProps): react.JSX.Element;
|
|
15
|
+
|
|
16
|
+
export { Checkbox, type CheckboxProps };
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { useState } from 'react';
|
|
2
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
// src/components/forms/Checkbox.tsx
|
|
5
|
+
function Checkbox({ label, checked, defaultChecked, onChange, disabled, id, style }) {
|
|
6
|
+
const cbId = id || (label ? `cb-${String(label).replace(/\s+/g, "-")}` : void 0);
|
|
7
|
+
const [internal, setInternal] = useState(defaultChecked ?? false);
|
|
8
|
+
const isOn = checked !== void 0 ? checked : internal;
|
|
9
|
+
const toggle = () => {
|
|
10
|
+
if (disabled) return;
|
|
11
|
+
if (checked === void 0) setInternal((v) => !v);
|
|
12
|
+
onChange?.(!isOn);
|
|
13
|
+
};
|
|
14
|
+
return /* @__PURE__ */ jsxs(
|
|
15
|
+
"label",
|
|
16
|
+
{
|
|
17
|
+
htmlFor: cbId,
|
|
18
|
+
style: {
|
|
19
|
+
display: "inline-flex",
|
|
20
|
+
alignItems: "center",
|
|
21
|
+
gap: 9,
|
|
22
|
+
cursor: disabled ? "not-allowed" : "pointer",
|
|
23
|
+
opacity: disabled ? 0.55 : 1,
|
|
24
|
+
...style
|
|
25
|
+
},
|
|
26
|
+
children: [
|
|
27
|
+
/* @__PURE__ */ jsx(
|
|
28
|
+
"input",
|
|
29
|
+
{
|
|
30
|
+
id: cbId,
|
|
31
|
+
type: "checkbox",
|
|
32
|
+
checked: isOn,
|
|
33
|
+
onChange: toggle,
|
|
34
|
+
disabled,
|
|
35
|
+
style: { position: "absolute", opacity: 0, width: 0, height: 0 }
|
|
36
|
+
}
|
|
37
|
+
),
|
|
38
|
+
/* @__PURE__ */ jsx(
|
|
39
|
+
"span",
|
|
40
|
+
{
|
|
41
|
+
style: {
|
|
42
|
+
width: 18,
|
|
43
|
+
height: 18,
|
|
44
|
+
flex: "0 0 auto",
|
|
45
|
+
borderRadius: 5,
|
|
46
|
+
display: "grid",
|
|
47
|
+
placeItems: "center",
|
|
48
|
+
background: isOn ? "var(--dt-accent)" : "var(--dt-surface)",
|
|
49
|
+
border: `1.5px solid ${isOn ? "var(--dt-accent)" : "var(--dt-border-strong)"}`,
|
|
50
|
+
transition: "background-color 130ms, border-color 130ms"
|
|
51
|
+
},
|
|
52
|
+
children: isOn ? /* @__PURE__ */ jsx("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx(
|
|
53
|
+
"path",
|
|
54
|
+
{
|
|
55
|
+
d: "M5 12l4.5 4.5L19 7",
|
|
56
|
+
stroke: "var(--dt-accent-ink)",
|
|
57
|
+
strokeWidth: "3",
|
|
58
|
+
strokeLinecap: "round",
|
|
59
|
+
strokeLinejoin: "round"
|
|
60
|
+
}
|
|
61
|
+
) }) : null
|
|
62
|
+
}
|
|
63
|
+
),
|
|
64
|
+
label ? /* @__PURE__ */ jsx("span", { style: { fontSize: 14, color: "var(--dt-ink)" }, children: label }) : null
|
|
65
|
+
]
|
|
66
|
+
}
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export { Checkbox };
|
|
71
|
+
//# sourceMappingURL=Checkbox.mjs.map
|
|
72
|
+
//# sourceMappingURL=Checkbox.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/forms/Checkbox.tsx"],"names":[],"mappings":"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","file":"Checkbox.mjs","sourcesContent":["import { useState } from 'react';\nimport type { CSSProperties, InputHTMLAttributes, ReactNode } from 'react';\n\nexport interface CheckboxProps\n extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'checked' | 'defaultChecked' | 'disabled' | 'id' | 'label' | 'onChange' | 'style'\n > {\n label?: ReactNode;\n checked?: boolean;\n defaultChecked?: boolean;\n onChange?: (checked: boolean) => void;\n disabled?: boolean;\n id?: string;\n style?: CSSProperties;\n}\n\n/** Checkbox — persimmon fill when checked. */\nexport function Checkbox({ label, checked, defaultChecked, onChange, disabled, id, style }: CheckboxProps) {\n const cbId = id || (label ? `cb-${String(label).replace(/\\s+/g, '-')}` : undefined);\n const [internal, setInternal] = useState(defaultChecked ?? false);\n const isOn = checked !== undefined ? checked : internal;\n const toggle = () => {\n if (disabled) return;\n if (checked === undefined) setInternal((v) => !v);\n onChange?.(!isOn);\n };\n return (\n <label\n htmlFor={cbId}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 9,\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.55 : 1,\n ...style,\n }}\n >\n <input\n id={cbId}\n type=\"checkbox\"\n checked={isOn}\n onChange={toggle}\n disabled={disabled}\n style={{ position: 'absolute', opacity: 0, width: 0, height: 0 }}\n />\n <span\n style={{\n width: 18,\n height: 18,\n flex: '0 0 auto',\n borderRadius: 5,\n display: 'grid',\n placeItems: 'center',\n background: isOn ? 'var(--dt-accent)' : 'var(--dt-surface)',\n border: `1.5px solid ${isOn ? 'var(--dt-accent)' : 'var(--dt-border-strong)'}`,\n transition: 'background-color 130ms, border-color 130ms',\n }}\n >\n {isOn ? (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M5 12l4.5 4.5L19 7\"\n stroke=\"var(--dt-accent-ink)\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n ) : null}\n </span>\n {label ? <span style={{ fontSize: 14, color: 'var(--dt-ink)' }}>{label}</span> : null}\n </label>\n );\n}\n"]}
|