@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,62 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
+
|
|
6
|
+
// src/components/feedback/Dialog.tsx
|
|
7
|
+
function Dialog({ open, onClose, title, description, children, footer, "aria-label": ariaLabel, width = 460 }) {
|
|
8
|
+
const titleId = react.useId();
|
|
9
|
+
react.useEffect(() => {
|
|
10
|
+
if (!open) return void 0;
|
|
11
|
+
const onKey = (event) => {
|
|
12
|
+
if (event.key === "Escape") onClose?.();
|
|
13
|
+
};
|
|
14
|
+
window.addEventListener("keydown", onKey);
|
|
15
|
+
return () => window.removeEventListener("keydown", onKey);
|
|
16
|
+
}, [open, onClose]);
|
|
17
|
+
if (!open) return null;
|
|
18
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { onClick: onClose, style: {
|
|
19
|
+
position: "fixed",
|
|
20
|
+
inset: 0,
|
|
21
|
+
zIndex: 100,
|
|
22
|
+
display: "grid",
|
|
23
|
+
placeItems: "center",
|
|
24
|
+
padding: 20,
|
|
25
|
+
background: "color-mix(in srgb, var(--dt-ink-strong) 32%, transparent)",
|
|
26
|
+
backdropFilter: "blur(2px)",
|
|
27
|
+
animation: "dt-fade 160ms var(--dt-ease)"
|
|
28
|
+
}, children: [
|
|
29
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
30
|
+
"div",
|
|
31
|
+
{
|
|
32
|
+
role: "dialog",
|
|
33
|
+
"aria-modal": "true",
|
|
34
|
+
onClick: (event) => event.stopPropagation(),
|
|
35
|
+
"aria-labelledby": title ? titleId : void 0,
|
|
36
|
+
"aria-label": title ? void 0 : ariaLabel,
|
|
37
|
+
style: {
|
|
38
|
+
width: "100%",
|
|
39
|
+
maxWidth: width,
|
|
40
|
+
background: "var(--dt-surface)",
|
|
41
|
+
borderRadius: "var(--dt-radius-lg)",
|
|
42
|
+
boxShadow: "var(--dt-shadow-xl)",
|
|
43
|
+
animation: "dt-pop 200ms var(--dt-ease)",
|
|
44
|
+
overflow: "hidden"
|
|
45
|
+
},
|
|
46
|
+
children: [
|
|
47
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { padding: "22px 24px" }, children: [
|
|
48
|
+
title ? /* @__PURE__ */ jsxRuntime.jsx("h3", { id: titleId, style: { fontSize: 18, fontWeight: 700, letterSpacing: "-0.01em", color: "var(--dt-ink-strong)" }, children: title }) : null,
|
|
49
|
+
description ? /* @__PURE__ */ jsxRuntime.jsx("p", { style: { marginTop: 8, fontSize: 14, lineHeight: 1.55, color: "var(--dt-muted-strong)" }, children: description }) : null,
|
|
50
|
+
children ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: title || description ? 16 : 0 }, children }) : null
|
|
51
|
+
] }),
|
|
52
|
+
footer ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", justifyContent: "flex-end", gap: 8, padding: "14px 24px", background: "var(--dt-surface-sunken)" }, children: footer }) : null
|
|
53
|
+
]
|
|
54
|
+
}
|
|
55
|
+
),
|
|
56
|
+
/* @__PURE__ */ jsxRuntime.jsx("style", { children: `@keyframes dt-fade{from{opacity:0}}@keyframes dt-pop{from{opacity:0;transform:translateY(8px) scale(.98)}}` })
|
|
57
|
+
] });
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
exports.Dialog = Dialog;
|
|
61
|
+
//# sourceMappingURL=Dialog.cjs.map
|
|
62
|
+
//# sourceMappingURL=Dialog.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/feedback/Dialog.tsx"],"names":["useId","useEffect","jsxs","jsx"],"mappings":"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","file":"Dialog.cjs","sourcesContent":["import type { ReactNode } from 'react';\nimport { useEffect, useId } from 'react';\n\nexport interface DialogProps {\n open: boolean;\n onClose?: () => void;\n title?: ReactNode;\n description?: ReactNode;\n children?: ReactNode;\n footer?: ReactNode;\n 'aria-label'?: string;\n width?: number;\n}\n\n/** Modal dialog with overlay, Esc/backdrop close, and a footer action bar. */\nexport function Dialog({ open, onClose, title, description, children, footer, 'aria-label': ariaLabel, width = 460 }: DialogProps) {\n const titleId = useId();\n useEffect(() => {\n if (!open) return undefined;\n const onKey = (event: KeyboardEvent) => { if (event.key === 'Escape') onClose?.(); };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [open, onClose]);\n if (!open) return null;\n return (\n <div onClick={onClose} style={{\n position: 'fixed', inset: 0, zIndex: 100, display: 'grid', placeItems: 'center', padding: 20,\n background: 'color-mix(in srgb, var(--dt-ink-strong) 32%, transparent)',\n backdropFilter: 'blur(2px)', animation: 'dt-fade 160ms var(--dt-ease)',\n }}>\n <div\n role=\"dialog\" aria-modal=\"true\" onClick={(event) => event.stopPropagation()}\n aria-labelledby={title ? titleId : undefined}\n aria-label={title ? undefined : ariaLabel}\n style={{\n width: '100%', maxWidth: width, background: 'var(--dt-surface)',\n borderRadius: 'var(--dt-radius-lg)', boxShadow: 'var(--dt-shadow-xl)',\n animation: 'dt-pop 200ms var(--dt-ease)', overflow: 'hidden',\n }}\n >\n <div style={{ padding: '22px 24px' }}>\n {title ? <h3 id={titleId} style={{ fontSize: 18, fontWeight: 700, letterSpacing: '-0.01em', color: 'var(--dt-ink-strong)' }}>{title}</h3> : null}\n {description ? <p style={{ marginTop: 8, fontSize: 14, lineHeight: 1.55, color: 'var(--dt-muted-strong)' }}>{description}</p> : null}\n {children ? <div style={{ marginTop: title || description ? 16 : 0 }}>{children}</div> : null}\n </div>\n {footer ? <div style={{ display: 'flex', justifyContent: 'flex-end', gap: 8, padding: '14px 24px', background: 'var(--dt-surface-sunken)' }}>{footer}</div> : null}\n </div>\n <style>{`@keyframes dt-fade{from{opacity:0}}@keyframes dt-pop{from{opacity:0;transform:translateY(8px) scale(.98)}}`}</style>\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
interface DialogProps {
|
|
5
|
+
open: boolean;
|
|
6
|
+
onClose?: () => void;
|
|
7
|
+
title?: ReactNode;
|
|
8
|
+
description?: ReactNode;
|
|
9
|
+
children?: ReactNode;
|
|
10
|
+
footer?: ReactNode;
|
|
11
|
+
'aria-label'?: string;
|
|
12
|
+
width?: number;
|
|
13
|
+
}
|
|
14
|
+
/** Modal dialog with overlay, Esc/backdrop close, and a footer action bar. */
|
|
15
|
+
declare function Dialog({ open, onClose, title, description, children, footer, 'aria-label': ariaLabel, width }: DialogProps): react.JSX.Element | null;
|
|
16
|
+
|
|
17
|
+
export { Dialog, type DialogProps };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
interface DialogProps {
|
|
5
|
+
open: boolean;
|
|
6
|
+
onClose?: () => void;
|
|
7
|
+
title?: ReactNode;
|
|
8
|
+
description?: ReactNode;
|
|
9
|
+
children?: ReactNode;
|
|
10
|
+
footer?: ReactNode;
|
|
11
|
+
'aria-label'?: string;
|
|
12
|
+
width?: number;
|
|
13
|
+
}
|
|
14
|
+
/** Modal dialog with overlay, Esc/backdrop close, and a footer action bar. */
|
|
15
|
+
declare function Dialog({ open, onClose, title, description, children, footer, 'aria-label': ariaLabel, width }: DialogProps): react.JSX.Element | null;
|
|
16
|
+
|
|
17
|
+
export { Dialog, type DialogProps };
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { useId, useEffect } from 'react';
|
|
2
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
// src/components/feedback/Dialog.tsx
|
|
5
|
+
function Dialog({ open, onClose, title, description, children, footer, "aria-label": ariaLabel, width = 460 }) {
|
|
6
|
+
const titleId = useId();
|
|
7
|
+
useEffect(() => {
|
|
8
|
+
if (!open) return void 0;
|
|
9
|
+
const onKey = (event) => {
|
|
10
|
+
if (event.key === "Escape") onClose?.();
|
|
11
|
+
};
|
|
12
|
+
window.addEventListener("keydown", onKey);
|
|
13
|
+
return () => window.removeEventListener("keydown", onKey);
|
|
14
|
+
}, [open, onClose]);
|
|
15
|
+
if (!open) return null;
|
|
16
|
+
return /* @__PURE__ */ jsxs("div", { onClick: onClose, style: {
|
|
17
|
+
position: "fixed",
|
|
18
|
+
inset: 0,
|
|
19
|
+
zIndex: 100,
|
|
20
|
+
display: "grid",
|
|
21
|
+
placeItems: "center",
|
|
22
|
+
padding: 20,
|
|
23
|
+
background: "color-mix(in srgb, var(--dt-ink-strong) 32%, transparent)",
|
|
24
|
+
backdropFilter: "blur(2px)",
|
|
25
|
+
animation: "dt-fade 160ms var(--dt-ease)"
|
|
26
|
+
}, children: [
|
|
27
|
+
/* @__PURE__ */ jsxs(
|
|
28
|
+
"div",
|
|
29
|
+
{
|
|
30
|
+
role: "dialog",
|
|
31
|
+
"aria-modal": "true",
|
|
32
|
+
onClick: (event) => event.stopPropagation(),
|
|
33
|
+
"aria-labelledby": title ? titleId : void 0,
|
|
34
|
+
"aria-label": title ? void 0 : ariaLabel,
|
|
35
|
+
style: {
|
|
36
|
+
width: "100%",
|
|
37
|
+
maxWidth: width,
|
|
38
|
+
background: "var(--dt-surface)",
|
|
39
|
+
borderRadius: "var(--dt-radius-lg)",
|
|
40
|
+
boxShadow: "var(--dt-shadow-xl)",
|
|
41
|
+
animation: "dt-pop 200ms var(--dt-ease)",
|
|
42
|
+
overflow: "hidden"
|
|
43
|
+
},
|
|
44
|
+
children: [
|
|
45
|
+
/* @__PURE__ */ jsxs("div", { style: { padding: "22px 24px" }, children: [
|
|
46
|
+
title ? /* @__PURE__ */ jsx("h3", { id: titleId, style: { fontSize: 18, fontWeight: 700, letterSpacing: "-0.01em", color: "var(--dt-ink-strong)" }, children: title }) : null,
|
|
47
|
+
description ? /* @__PURE__ */ jsx("p", { style: { marginTop: 8, fontSize: 14, lineHeight: 1.55, color: "var(--dt-muted-strong)" }, children: description }) : null,
|
|
48
|
+
children ? /* @__PURE__ */ jsx("div", { style: { marginTop: title || description ? 16 : 0 }, children }) : null
|
|
49
|
+
] }),
|
|
50
|
+
footer ? /* @__PURE__ */ jsx("div", { style: { display: "flex", justifyContent: "flex-end", gap: 8, padding: "14px 24px", background: "var(--dt-surface-sunken)" }, children: footer }) : null
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
),
|
|
54
|
+
/* @__PURE__ */ jsx("style", { children: `@keyframes dt-fade{from{opacity:0}}@keyframes dt-pop{from{opacity:0;transform:translateY(8px) scale(.98)}}` })
|
|
55
|
+
] });
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export { Dialog };
|
|
59
|
+
//# sourceMappingURL=Dialog.mjs.map
|
|
60
|
+
//# sourceMappingURL=Dialog.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/feedback/Dialog.tsx"],"names":[],"mappings":"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","file":"Dialog.mjs","sourcesContent":["import type { ReactNode } from 'react';\nimport { useEffect, useId } from 'react';\n\nexport interface DialogProps {\n open: boolean;\n onClose?: () => void;\n title?: ReactNode;\n description?: ReactNode;\n children?: ReactNode;\n footer?: ReactNode;\n 'aria-label'?: string;\n width?: number;\n}\n\n/** Modal dialog with overlay, Esc/backdrop close, and a footer action bar. */\nexport function Dialog({ open, onClose, title, description, children, footer, 'aria-label': ariaLabel, width = 460 }: DialogProps) {\n const titleId = useId();\n useEffect(() => {\n if (!open) return undefined;\n const onKey = (event: KeyboardEvent) => { if (event.key === 'Escape') onClose?.(); };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [open, onClose]);\n if (!open) return null;\n return (\n <div onClick={onClose} style={{\n position: 'fixed', inset: 0, zIndex: 100, display: 'grid', placeItems: 'center', padding: 20,\n background: 'color-mix(in srgb, var(--dt-ink-strong) 32%, transparent)',\n backdropFilter: 'blur(2px)', animation: 'dt-fade 160ms var(--dt-ease)',\n }}>\n <div\n role=\"dialog\" aria-modal=\"true\" onClick={(event) => event.stopPropagation()}\n aria-labelledby={title ? titleId : undefined}\n aria-label={title ? undefined : ariaLabel}\n style={{\n width: '100%', maxWidth: width, background: 'var(--dt-surface)',\n borderRadius: 'var(--dt-radius-lg)', boxShadow: 'var(--dt-shadow-xl)',\n animation: 'dt-pop 200ms var(--dt-ease)', overflow: 'hidden',\n }}\n >\n <div style={{ padding: '22px 24px' }}>\n {title ? <h3 id={titleId} style={{ fontSize: 18, fontWeight: 700, letterSpacing: '-0.01em', color: 'var(--dt-ink-strong)' }}>{title}</h3> : null}\n {description ? <p style={{ marginTop: 8, fontSize: 14, lineHeight: 1.55, color: 'var(--dt-muted-strong)' }}>{description}</p> : null}\n {children ? <div style={{ marginTop: title || description ? 16 : 0 }}>{children}</div> : null}\n </div>\n {footer ? <div style={{ display: 'flex', justifyContent: 'flex-end', gap: 8, padding: '14px 24px', background: 'var(--dt-surface-sunken)' }}>{footer}</div> : null}\n </div>\n <style>{`@keyframes dt-fade{from{opacity:0}}@keyframes dt-pop{from{opacity:0;transform:translateY(8px) scale(.98)}}`}</style>\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
+
|
|
6
|
+
// src/components/feedback/Drawer.tsx
|
|
7
|
+
function Drawer({ open = false, side = "right", title, children, footer, onClose, width = 420, style, "aria-label": ariaLabel }) {
|
|
8
|
+
const titleId = react.useId();
|
|
9
|
+
if (!open) return null;
|
|
10
|
+
const fromRight = side === "right";
|
|
11
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { position: "absolute", inset: 0, zIndex: 40, display: "flex", justifyContent: fromRight ? "flex-end" : "flex-start" }, children: [
|
|
12
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { onClick: onClose, style: { position: "absolute", inset: 0, background: "rgba(24,22,18,0.32)" } }),
|
|
13
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
14
|
+
"aside",
|
|
15
|
+
{
|
|
16
|
+
role: "dialog",
|
|
17
|
+
"aria-modal": "true",
|
|
18
|
+
"aria-labelledby": title ? titleId : void 0,
|
|
19
|
+
"aria-label": title ? void 0 : ariaLabel || "pane",
|
|
20
|
+
style: {
|
|
21
|
+
position: "relative",
|
|
22
|
+
width,
|
|
23
|
+
maxWidth: "100%",
|
|
24
|
+
height: "100%",
|
|
25
|
+
display: "flex",
|
|
26
|
+
flexDirection: "column",
|
|
27
|
+
background: "var(--dt-surface)",
|
|
28
|
+
boxShadow: "var(--dt-shadow-xl)",
|
|
29
|
+
borderLeft: fromRight ? "1px solid var(--dt-border-strong)" : "none",
|
|
30
|
+
borderRight: fromRight ? "none" : "1px solid var(--dt-border-strong)",
|
|
31
|
+
fontFamily: "var(--dt-font-sans)",
|
|
32
|
+
...style
|
|
33
|
+
},
|
|
34
|
+
children: [
|
|
35
|
+
/* @__PURE__ */ jsxRuntime.jsxs("header", { style: { display: "flex", alignItems: "center", gap: 12, padding: "16px 18px", borderBottom: "1px solid var(--dt-border)" }, children: [
|
|
36
|
+
title ? /* @__PURE__ */ jsxRuntime.jsx("h3", { id: titleId, style: { margin: 0, flex: 1, minWidth: 0, fontSize: 16, fontWeight: 650, letterSpacing: "-0.01em", color: "var(--dt-ink-strong)" }, children: title }) : null,
|
|
37
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
38
|
+
"button",
|
|
39
|
+
{
|
|
40
|
+
type: "button",
|
|
41
|
+
onClick: onClose,
|
|
42
|
+
"aria-label": "\uB2EB\uAE30",
|
|
43
|
+
style: { flex: "0 0 auto", width: 30, height: 30, display: "grid", placeItems: "center", border: "none", background: "var(--dt-surface-sunken)", borderRadius: "var(--dt-radius-sm)", color: "var(--dt-muted-strong)", cursor: "pointer" },
|
|
44
|
+
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: "M18 6L6 18M6 6l12 12", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round" }) })
|
|
45
|
+
}
|
|
46
|
+
)
|
|
47
|
+
] }),
|
|
48
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { flex: 1, overflowY: "auto", padding: 18 }, children }),
|
|
49
|
+
footer ? /* @__PURE__ */ jsxRuntime.jsx("footer", { style: { display: "flex", alignItems: "center", gap: 10, padding: "14px 18px", borderTop: "1px solid var(--dt-border)" }, children: footer }) : null
|
|
50
|
+
]
|
|
51
|
+
}
|
|
52
|
+
)
|
|
53
|
+
] });
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
exports.Drawer = Drawer;
|
|
57
|
+
//# sourceMappingURL=Drawer.cjs.map
|
|
58
|
+
//# sourceMappingURL=Drawer.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/feedback/Drawer.tsx"],"names":["useId","jsx","jsxs"],"mappings":"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","file":"Drawer.cjs","sourcesContent":["import type { CSSProperties, ReactNode } from 'react';\nimport { useId } from 'react';\n\nexport interface DrawerProps {\n open?: boolean;\n side?: 'right' | 'left';\n title?: string;\n children?: ReactNode;\n footer?: ReactNode;\n onClose?: () => void;\n width?: number;\n style?: CSSProperties;\n 'aria-label'?: string;\n}\n\n/**\n * Side sheet over a scrim for secondary flows — floats (shadow) but stays flat inside.\n * Render inside a positioned container (the panel fills its height).\n * @startingPoint section=\"Feedback\" subtitle=\"Side sheet over a scrim\" viewport=\"560x420\"\n */\nexport function Drawer({ open = false, side = 'right', title, children, footer, onClose, width = 420, style, 'aria-label': ariaLabel }: DrawerProps) {\n const titleId = useId();\n if (!open) return null;\n const fromRight = side === 'right';\n return (\n <div style={{ position: 'absolute', inset: 0, zIndex: 40, display: 'flex', justifyContent: fromRight ? 'flex-end' : 'flex-start' }}>\n <div onClick={onClose} style={{ position: 'absolute', inset: 0, background: 'rgba(24,22,18,0.32)' }} />\n <aside\n role=\"dialog\" aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n aria-label={title ? undefined : ariaLabel || 'pane'}\n style={{\n position: 'relative', width, maxWidth: '100%', height: '100%', display: 'flex', flexDirection: 'column',\n background: 'var(--dt-surface)', boxShadow: 'var(--dt-shadow-xl)',\n borderLeft: fromRight ? '1px solid var(--dt-border-strong)' : 'none',\n borderRight: fromRight ? 'none' : '1px solid var(--dt-border-strong)',\n fontFamily: 'var(--dt-font-sans)', ...style,\n }}\n >\n <header style={{ display: 'flex', alignItems: 'center', gap: 12, padding: '16px 18px', borderBottom: '1px solid var(--dt-border)' }}>\n {title ? <h3 id={titleId} style={{ margin: 0, flex: 1, minWidth: 0, fontSize: 16, fontWeight: 650, letterSpacing: '-0.01em', color: 'var(--dt-ink-strong)' }}>{title}</h3> : null}\n <button\n type=\"button\" onClick={onClose} aria-label=\"닫기\"\n style={{ flex: '0 0 auto', width: 30, height: 30, display: 'grid', placeItems: 'center', border: 'none', background: 'var(--dt-surface-sunken)', borderRadius: 'var(--dt-radius-sm)', color: 'var(--dt-muted-strong)', cursor: 'pointer' }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\"><path d=\"M18 6L6 18M6 6l12 12\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" /></svg>\n </button>\n </header>\n <div style={{ flex: 1, overflowY: 'auto', padding: 18 }}>{children}</div>\n {footer ? <footer style={{ display: 'flex', alignItems: 'center', gap: 10, padding: '14px 18px', borderTop: '1px solid var(--dt-border)' }}>{footer}</footer> : null}\n </aside>\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { ReactNode, CSSProperties } from 'react';
|
|
3
|
+
|
|
4
|
+
interface DrawerProps {
|
|
5
|
+
open?: boolean;
|
|
6
|
+
side?: 'right' | 'left';
|
|
7
|
+
title?: string;
|
|
8
|
+
children?: ReactNode;
|
|
9
|
+
footer?: ReactNode;
|
|
10
|
+
onClose?: () => void;
|
|
11
|
+
width?: number;
|
|
12
|
+
style?: CSSProperties;
|
|
13
|
+
'aria-label'?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Side sheet over a scrim for secondary flows — floats (shadow) but stays flat inside.
|
|
17
|
+
* Render inside a positioned container (the panel fills its height).
|
|
18
|
+
* @startingPoint section="Feedback" subtitle="Side sheet over a scrim" viewport="560x420"
|
|
19
|
+
*/
|
|
20
|
+
declare function Drawer({ open, side, title, children, footer, onClose, width, style, 'aria-label': ariaLabel }: DrawerProps): react.JSX.Element | null;
|
|
21
|
+
|
|
22
|
+
export { Drawer, type DrawerProps };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { ReactNode, CSSProperties } from 'react';
|
|
3
|
+
|
|
4
|
+
interface DrawerProps {
|
|
5
|
+
open?: boolean;
|
|
6
|
+
side?: 'right' | 'left';
|
|
7
|
+
title?: string;
|
|
8
|
+
children?: ReactNode;
|
|
9
|
+
footer?: ReactNode;
|
|
10
|
+
onClose?: () => void;
|
|
11
|
+
width?: number;
|
|
12
|
+
style?: CSSProperties;
|
|
13
|
+
'aria-label'?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Side sheet over a scrim for secondary flows — floats (shadow) but stays flat inside.
|
|
17
|
+
* Render inside a positioned container (the panel fills its height).
|
|
18
|
+
* @startingPoint section="Feedback" subtitle="Side sheet over a scrim" viewport="560x420"
|
|
19
|
+
*/
|
|
20
|
+
declare function Drawer({ open, side, title, children, footer, onClose, width, style, 'aria-label': ariaLabel }: DrawerProps): react.JSX.Element | null;
|
|
21
|
+
|
|
22
|
+
export { Drawer, type DrawerProps };
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { useId } from 'react';
|
|
2
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
// src/components/feedback/Drawer.tsx
|
|
5
|
+
function Drawer({ open = false, side = "right", title, children, footer, onClose, width = 420, style, "aria-label": ariaLabel }) {
|
|
6
|
+
const titleId = useId();
|
|
7
|
+
if (!open) return null;
|
|
8
|
+
const fromRight = side === "right";
|
|
9
|
+
return /* @__PURE__ */ jsxs("div", { style: { position: "absolute", inset: 0, zIndex: 40, display: "flex", justifyContent: fromRight ? "flex-end" : "flex-start" }, children: [
|
|
10
|
+
/* @__PURE__ */ jsx("div", { onClick: onClose, style: { position: "absolute", inset: 0, background: "rgba(24,22,18,0.32)" } }),
|
|
11
|
+
/* @__PURE__ */ jsxs(
|
|
12
|
+
"aside",
|
|
13
|
+
{
|
|
14
|
+
role: "dialog",
|
|
15
|
+
"aria-modal": "true",
|
|
16
|
+
"aria-labelledby": title ? titleId : void 0,
|
|
17
|
+
"aria-label": title ? void 0 : ariaLabel || "pane",
|
|
18
|
+
style: {
|
|
19
|
+
position: "relative",
|
|
20
|
+
width,
|
|
21
|
+
maxWidth: "100%",
|
|
22
|
+
height: "100%",
|
|
23
|
+
display: "flex",
|
|
24
|
+
flexDirection: "column",
|
|
25
|
+
background: "var(--dt-surface)",
|
|
26
|
+
boxShadow: "var(--dt-shadow-xl)",
|
|
27
|
+
borderLeft: fromRight ? "1px solid var(--dt-border-strong)" : "none",
|
|
28
|
+
borderRight: fromRight ? "none" : "1px solid var(--dt-border-strong)",
|
|
29
|
+
fontFamily: "var(--dt-font-sans)",
|
|
30
|
+
...style
|
|
31
|
+
},
|
|
32
|
+
children: [
|
|
33
|
+
/* @__PURE__ */ jsxs("header", { style: { display: "flex", alignItems: "center", gap: 12, padding: "16px 18px", borderBottom: "1px solid var(--dt-border)" }, children: [
|
|
34
|
+
title ? /* @__PURE__ */ jsx("h3", { id: titleId, style: { margin: 0, flex: 1, minWidth: 0, fontSize: 16, fontWeight: 650, letterSpacing: "-0.01em", color: "var(--dt-ink-strong)" }, children: title }) : null,
|
|
35
|
+
/* @__PURE__ */ jsx(
|
|
36
|
+
"button",
|
|
37
|
+
{
|
|
38
|
+
type: "button",
|
|
39
|
+
onClick: onClose,
|
|
40
|
+
"aria-label": "\uB2EB\uAE30",
|
|
41
|
+
style: { flex: "0 0 auto", width: 30, height: 30, display: "grid", placeItems: "center", border: "none", background: "var(--dt-surface-sunken)", borderRadius: "var(--dt-radius-sm)", color: "var(--dt-muted-strong)", cursor: "pointer" },
|
|
42
|
+
children: /* @__PURE__ */ jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx("path", { d: "M18 6L6 18M6 6l12 12", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round" }) })
|
|
43
|
+
}
|
|
44
|
+
)
|
|
45
|
+
] }),
|
|
46
|
+
/* @__PURE__ */ jsx("div", { style: { flex: 1, overflowY: "auto", padding: 18 }, children }),
|
|
47
|
+
footer ? /* @__PURE__ */ jsx("footer", { style: { display: "flex", alignItems: "center", gap: 10, padding: "14px 18px", borderTop: "1px solid var(--dt-border)" }, children: footer }) : null
|
|
48
|
+
]
|
|
49
|
+
}
|
|
50
|
+
)
|
|
51
|
+
] });
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export { Drawer };
|
|
55
|
+
//# sourceMappingURL=Drawer.mjs.map
|
|
56
|
+
//# sourceMappingURL=Drawer.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/feedback/Drawer.tsx"],"names":[],"mappings":"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","file":"Drawer.mjs","sourcesContent":["import type { CSSProperties, ReactNode } from 'react';\nimport { useId } from 'react';\n\nexport interface DrawerProps {\n open?: boolean;\n side?: 'right' | 'left';\n title?: string;\n children?: ReactNode;\n footer?: ReactNode;\n onClose?: () => void;\n width?: number;\n style?: CSSProperties;\n 'aria-label'?: string;\n}\n\n/**\n * Side sheet over a scrim for secondary flows — floats (shadow) but stays flat inside.\n * Render inside a positioned container (the panel fills its height).\n * @startingPoint section=\"Feedback\" subtitle=\"Side sheet over a scrim\" viewport=\"560x420\"\n */\nexport function Drawer({ open = false, side = 'right', title, children, footer, onClose, width = 420, style, 'aria-label': ariaLabel }: DrawerProps) {\n const titleId = useId();\n if (!open) return null;\n const fromRight = side === 'right';\n return (\n <div style={{ position: 'absolute', inset: 0, zIndex: 40, display: 'flex', justifyContent: fromRight ? 'flex-end' : 'flex-start' }}>\n <div onClick={onClose} style={{ position: 'absolute', inset: 0, background: 'rgba(24,22,18,0.32)' }} />\n <aside\n role=\"dialog\" aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n aria-label={title ? undefined : ariaLabel || 'pane'}\n style={{\n position: 'relative', width, maxWidth: '100%', height: '100%', display: 'flex', flexDirection: 'column',\n background: 'var(--dt-surface)', boxShadow: 'var(--dt-shadow-xl)',\n borderLeft: fromRight ? '1px solid var(--dt-border-strong)' : 'none',\n borderRight: fromRight ? 'none' : '1px solid var(--dt-border-strong)',\n fontFamily: 'var(--dt-font-sans)', ...style,\n }}\n >\n <header style={{ display: 'flex', alignItems: 'center', gap: 12, padding: '16px 18px', borderBottom: '1px solid var(--dt-border)' }}>\n {title ? <h3 id={titleId} style={{ margin: 0, flex: 1, minWidth: 0, fontSize: 16, fontWeight: 650, letterSpacing: '-0.01em', color: 'var(--dt-ink-strong)' }}>{title}</h3> : null}\n <button\n type=\"button\" onClick={onClose} aria-label=\"닫기\"\n style={{ flex: '0 0 auto', width: 30, height: 30, display: 'grid', placeItems: 'center', border: 'none', background: 'var(--dt-surface-sunken)', borderRadius: 'var(--dt-radius-sm)', color: 'var(--dt-muted-strong)', cursor: 'pointer' }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\"><path d=\"M18 6L6 18M6 6l12 12\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" /></svg>\n </button>\n </header>\n <div style={{ flex: 1, overflowY: 'auto', padding: 18 }}>{children}</div>\n {footer ? <footer style={{ display: 'flex', alignItems: 'center', gap: 10, padding: '14px 18px', borderTop: '1px solid var(--dt-border)' }}>{footer}</footer> : null}\n </aside>\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
|
|
5
|
+
// src/components/feedback/EmptyState.tsx
|
|
6
|
+
function EmptyState({ icon, title, description, action, style }) {
|
|
7
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: {
|
|
8
|
+
display: "grid",
|
|
9
|
+
placeItems: "center",
|
|
10
|
+
gap: 10,
|
|
11
|
+
textAlign: "center",
|
|
12
|
+
padding: "40px 24px",
|
|
13
|
+
borderRadius: "var(--dt-radius-lg)",
|
|
14
|
+
background: "var(--dt-surface-sunken)",
|
|
15
|
+
...style
|
|
16
|
+
}, children: [
|
|
17
|
+
icon ? /* @__PURE__ */ jsxRuntime.jsx("span", { style: {
|
|
18
|
+
display: "inline-flex",
|
|
19
|
+
width: 44,
|
|
20
|
+
height: 44,
|
|
21
|
+
alignItems: "center",
|
|
22
|
+
justifyContent: "center",
|
|
23
|
+
borderRadius: "var(--dt-radius-md)",
|
|
24
|
+
background: "var(--dt-surface)",
|
|
25
|
+
color: "var(--dt-muted)",
|
|
26
|
+
boxShadow: "var(--dt-ring), var(--dt-shadow-xs)"
|
|
27
|
+
}, children: icon }) : null,
|
|
28
|
+
title ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 15, fontWeight: 650, color: "var(--dt-ink-strong)" }, children: title }) : null,
|
|
29
|
+
description ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 13, lineHeight: 1.55, color: "var(--dt-muted)", maxWidth: 320 }, children: description }) : null,
|
|
30
|
+
action ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: 6 }, children: action }) : null
|
|
31
|
+
] });
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
exports.EmptyState = EmptyState;
|
|
35
|
+
//# sourceMappingURL=EmptyState.cjs.map
|
|
36
|
+
//# sourceMappingURL=EmptyState.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/feedback/EmptyState.tsx"],"names":["jsxs","jsx"],"mappings":";;;;;AAWO,SAAS,WAAW,EAAE,IAAA,EAAM,OAAO,WAAA,EAAa,MAAA,EAAQ,OAAM,EAAoB;AACvF,EAAA,uBACEA,eAAA,CAAC,SAAI,KAAA,EAAO;AAAA,IACV,OAAA,EAAS,MAAA;AAAA,IAAQ,UAAA,EAAY,QAAA;AAAA,IAAU,GAAA,EAAK,EAAA;AAAA,IAAI,SAAA,EAAW,QAAA;AAAA,IAC3D,OAAA,EAAS,WAAA;AAAA,IAAa,YAAA,EAAc,qBAAA;AAAA,IACpC,UAAA,EAAY,0BAAA;AAAA,IAA4B,GAAG;AAAA,GAC7C,EACG,QAAA,EAAA;AAAA,IAAA,IAAA,mBACCC,cAAA,CAAC,UAAK,KAAA,EAAO;AAAA,MACX,OAAA,EAAS,aAAA;AAAA,MAAe,KAAA,EAAO,EAAA;AAAA,MAAI,MAAA,EAAQ,EAAA;AAAA,MAAI,UAAA,EAAY,QAAA;AAAA,MAAU,cAAA,EAAgB,QAAA;AAAA,MACrF,YAAA,EAAc,qBAAA;AAAA,MAAuB,UAAA,EAAY,mBAAA;AAAA,MAAqB,KAAA,EAAO,iBAAA;AAAA,MAC7E,SAAA,EAAW;AAAA,KACb,EAAI,gBAAK,CAAA,GACP,IAAA;AAAA,IACH,KAAA,mBAAQA,cAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,UAAA,EAAY,GAAA,EAAK,KAAA,EAAO,sBAAA,EAAuB,EAAI,iBAAM,CAAA,GAAS,IAAA;AAAA,IACtG,WAAA,mBAAcA,cAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,OAAO,iBAAA,EAAmB,QAAA,EAAU,GAAA,EAAI,EAAI,uBAAY,CAAA,GAAS,IAAA;AAAA,IAC7H,MAAA,kCAAU,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAA,EAAW,CAAA,EAAE,EAAI,QAAA,EAAA,MAAA,EAAO,CAAA,GAAS;AAAA,GAAA,EAC3D,CAAA;AAEJ","file":"EmptyState.cjs","sourcesContent":["import type { CSSProperties, ReactNode } from 'react';\n\nexport interface EmptyStateProps {\n icon?: ReactNode;\n title?: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n style?: CSSProperties;\n}\n\n/** Empty state for lists/tables — quiet icon, title, guidance, action. */\nexport function EmptyState({ icon, title, description, action, style }: EmptyStateProps) {\n return (\n <div style={{\n display: 'grid', placeItems: 'center', gap: 10, textAlign: 'center',\n padding: '40px 24px', borderRadius: 'var(--dt-radius-lg)',\n background: 'var(--dt-surface-sunken)', ...style,\n }}>\n {icon ? (\n <span style={{\n display: 'inline-flex', width: 44, height: 44, alignItems: 'center', justifyContent: 'center',\n borderRadius: 'var(--dt-radius-md)', background: 'var(--dt-surface)', color: 'var(--dt-muted)',\n boxShadow: 'var(--dt-ring), var(--dt-shadow-xs)',\n }}>{icon}</span>\n ) : null}\n {title ? <div style={{ fontSize: 15, fontWeight: 650, color: 'var(--dt-ink-strong)' }}>{title}</div> : null}\n {description ? <div style={{ fontSize: 13, lineHeight: 1.55, color: 'var(--dt-muted)', maxWidth: 320 }}>{description}</div> : null}\n {action ? <div style={{ marginTop: 6 }}>{action}</div> : null}\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { ReactNode, CSSProperties } from 'react';
|
|
3
|
+
|
|
4
|
+
interface EmptyStateProps {
|
|
5
|
+
icon?: ReactNode;
|
|
6
|
+
title?: ReactNode;
|
|
7
|
+
description?: ReactNode;
|
|
8
|
+
action?: ReactNode;
|
|
9
|
+
style?: CSSProperties;
|
|
10
|
+
}
|
|
11
|
+
/** Empty state for lists/tables — quiet icon, title, guidance, action. */
|
|
12
|
+
declare function EmptyState({ icon, title, description, action, style }: EmptyStateProps): react.JSX.Element;
|
|
13
|
+
|
|
14
|
+
export { EmptyState, type EmptyStateProps };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { ReactNode, CSSProperties } from 'react';
|
|
3
|
+
|
|
4
|
+
interface EmptyStateProps {
|
|
5
|
+
icon?: ReactNode;
|
|
6
|
+
title?: ReactNode;
|
|
7
|
+
description?: ReactNode;
|
|
8
|
+
action?: ReactNode;
|
|
9
|
+
style?: CSSProperties;
|
|
10
|
+
}
|
|
11
|
+
/** Empty state for lists/tables — quiet icon, title, guidance, action. */
|
|
12
|
+
declare function EmptyState({ icon, title, description, action, style }: EmptyStateProps): react.JSX.Element;
|
|
13
|
+
|
|
14
|
+
export { EmptyState, type EmptyStateProps };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
// src/components/feedback/EmptyState.tsx
|
|
4
|
+
function EmptyState({ icon, title, description, action, style }) {
|
|
5
|
+
return /* @__PURE__ */ jsxs("div", { style: {
|
|
6
|
+
display: "grid",
|
|
7
|
+
placeItems: "center",
|
|
8
|
+
gap: 10,
|
|
9
|
+
textAlign: "center",
|
|
10
|
+
padding: "40px 24px",
|
|
11
|
+
borderRadius: "var(--dt-radius-lg)",
|
|
12
|
+
background: "var(--dt-surface-sunken)",
|
|
13
|
+
...style
|
|
14
|
+
}, children: [
|
|
15
|
+
icon ? /* @__PURE__ */ jsx("span", { style: {
|
|
16
|
+
display: "inline-flex",
|
|
17
|
+
width: 44,
|
|
18
|
+
height: 44,
|
|
19
|
+
alignItems: "center",
|
|
20
|
+
justifyContent: "center",
|
|
21
|
+
borderRadius: "var(--dt-radius-md)",
|
|
22
|
+
background: "var(--dt-surface)",
|
|
23
|
+
color: "var(--dt-muted)",
|
|
24
|
+
boxShadow: "var(--dt-ring), var(--dt-shadow-xs)"
|
|
25
|
+
}, children: icon }) : null,
|
|
26
|
+
title ? /* @__PURE__ */ jsx("div", { style: { fontSize: 15, fontWeight: 650, color: "var(--dt-ink-strong)" }, children: title }) : null,
|
|
27
|
+
description ? /* @__PURE__ */ jsx("div", { style: { fontSize: 13, lineHeight: 1.55, color: "var(--dt-muted)", maxWidth: 320 }, children: description }) : null,
|
|
28
|
+
action ? /* @__PURE__ */ jsx("div", { style: { marginTop: 6 }, children: action }) : null
|
|
29
|
+
] });
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export { EmptyState };
|
|
33
|
+
//# sourceMappingURL=EmptyState.mjs.map
|
|
34
|
+
//# sourceMappingURL=EmptyState.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/feedback/EmptyState.tsx"],"names":[],"mappings":";;;AAWO,SAAS,WAAW,EAAE,IAAA,EAAM,OAAO,WAAA,EAAa,MAAA,EAAQ,OAAM,EAAoB;AACvF,EAAA,uBACE,IAAA,CAAC,SAAI,KAAA,EAAO;AAAA,IACV,OAAA,EAAS,MAAA;AAAA,IAAQ,UAAA,EAAY,QAAA;AAAA,IAAU,GAAA,EAAK,EAAA;AAAA,IAAI,SAAA,EAAW,QAAA;AAAA,IAC3D,OAAA,EAAS,WAAA;AAAA,IAAa,YAAA,EAAc,qBAAA;AAAA,IACpC,UAAA,EAAY,0BAAA;AAAA,IAA4B,GAAG;AAAA,GAC7C,EACG,QAAA,EAAA;AAAA,IAAA,IAAA,mBACC,GAAA,CAAC,UAAK,KAAA,EAAO;AAAA,MACX,OAAA,EAAS,aAAA;AAAA,MAAe,KAAA,EAAO,EAAA;AAAA,MAAI,MAAA,EAAQ,EAAA;AAAA,MAAI,UAAA,EAAY,QAAA;AAAA,MAAU,cAAA,EAAgB,QAAA;AAAA,MACrF,YAAA,EAAc,qBAAA;AAAA,MAAuB,UAAA,EAAY,mBAAA;AAAA,MAAqB,KAAA,EAAO,iBAAA;AAAA,MAC7E,SAAA,EAAW;AAAA,KACb,EAAI,gBAAK,CAAA,GACP,IAAA;AAAA,IACH,KAAA,mBAAQ,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,UAAA,EAAY,GAAA,EAAK,KAAA,EAAO,sBAAA,EAAuB,EAAI,iBAAM,CAAA,GAAS,IAAA;AAAA,IACtG,WAAA,mBAAc,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,OAAO,iBAAA,EAAmB,QAAA,EAAU,GAAA,EAAI,EAAI,uBAAY,CAAA,GAAS,IAAA;AAAA,IAC7H,MAAA,uBAAU,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAA,EAAW,CAAA,EAAE,EAAI,QAAA,EAAA,MAAA,EAAO,CAAA,GAAS;AAAA,GAAA,EAC3D,CAAA;AAEJ","file":"EmptyState.mjs","sourcesContent":["import type { CSSProperties, ReactNode } from 'react';\n\nexport interface EmptyStateProps {\n icon?: ReactNode;\n title?: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n style?: CSSProperties;\n}\n\n/** Empty state for lists/tables — quiet icon, title, guidance, action. */\nexport function EmptyState({ icon, title, description, action, style }: EmptyStateProps) {\n return (\n <div style={{\n display: 'grid', placeItems: 'center', gap: 10, textAlign: 'center',\n padding: '40px 24px', borderRadius: 'var(--dt-radius-lg)',\n background: 'var(--dt-surface-sunken)', ...style,\n }}>\n {icon ? (\n <span style={{\n display: 'inline-flex', width: 44, height: 44, alignItems: 'center', justifyContent: 'center',\n borderRadius: 'var(--dt-radius-md)', background: 'var(--dt-surface)', color: 'var(--dt-muted)',\n boxShadow: 'var(--dt-ring), var(--dt-shadow-xs)',\n }}>{icon}</span>\n ) : null}\n {title ? <div style={{ fontSize: 15, fontWeight: 650, color: 'var(--dt-ink-strong)' }}>{title}</div> : null}\n {description ? <div style={{ fontSize: 13, lineHeight: 1.55, color: 'var(--dt-muted)', maxWidth: 320 }}>{description}</div> : null}\n {action ? <div style={{ marginTop: 6 }}>{action}</div> : null}\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
|
|
5
|
+
// src/components/feedback/Skeleton.tsx
|
|
6
|
+
function Skeleton({ width = "100%", height = 14, radius = "var(--dt-radius-sm)", style }) {
|
|
7
|
+
return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "dt-skeleton", style: {
|
|
8
|
+
display: "block",
|
|
9
|
+
width,
|
|
10
|
+
height,
|
|
11
|
+
borderRadius: radius,
|
|
12
|
+
background: "var(--dt-surface-sunken)",
|
|
13
|
+
...style
|
|
14
|
+
} });
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
exports.Skeleton = Skeleton;
|
|
18
|
+
//# sourceMappingURL=Skeleton.cjs.map
|
|
19
|
+
//# sourceMappingURL=Skeleton.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/feedback/Skeleton.tsx"],"names":["jsx"],"mappings":";;;;;AASO,SAAS,QAAA,CAAS,EAAE,KAAA,GAAQ,MAAA,EAAQ,SAAS,EAAA,EAAI,MAAA,GAAS,qBAAA,EAAuB,KAAA,EAAM,EAAkB;AAC9G,EAAA,uBACEA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAc,KAAA,EAAO;AAAA,IACnC,OAAA,EAAS,OAAA;AAAA,IAAS,KAAA;AAAA,IAAO,MAAA;AAAA,IAAQ,YAAA,EAAc,MAAA;AAAA,IAC/C,UAAA,EAAY,0BAAA;AAAA,IAA4B,GAAG;AAAA,GAC7C,EAAG,CAAA;AAEP","file":"Skeleton.cjs","sourcesContent":["import type { CSSProperties } from 'react';\n\nexport interface SkeletonProps {\n width?: number | string;\n height?: number | string;\n radius?: string;\n style?: CSSProperties;\n}\n\nexport function Skeleton({ width = '100%', height = 14, radius = 'var(--dt-radius-sm)', style }: SkeletonProps) {\n return (\n <span className=\"dt-skeleton\" style={{\n display: 'block', width, height, borderRadius: radius,\n background: 'var(--dt-surface-sunken)', ...style,\n }} />\n );\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { CSSProperties } from 'react';
|
|
3
|
+
|
|
4
|
+
interface SkeletonProps {
|
|
5
|
+
width?: number | string;
|
|
6
|
+
height?: number | string;
|
|
7
|
+
radius?: string;
|
|
8
|
+
style?: CSSProperties;
|
|
9
|
+
}
|
|
10
|
+
declare function Skeleton({ width, height, radius, style }: SkeletonProps): react.JSX.Element;
|
|
11
|
+
|
|
12
|
+
export { Skeleton, type SkeletonProps };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { CSSProperties } from 'react';
|
|
3
|
+
|
|
4
|
+
interface SkeletonProps {
|
|
5
|
+
width?: number | string;
|
|
6
|
+
height?: number | string;
|
|
7
|
+
radius?: string;
|
|
8
|
+
style?: CSSProperties;
|
|
9
|
+
}
|
|
10
|
+
declare function Skeleton({ width, height, radius, style }: SkeletonProps): react.JSX.Element;
|
|
11
|
+
|
|
12
|
+
export { Skeleton, type SkeletonProps };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
// src/components/feedback/Skeleton.tsx
|
|
4
|
+
function Skeleton({ width = "100%", height = 14, radius = "var(--dt-radius-sm)", style }) {
|
|
5
|
+
return /* @__PURE__ */ jsx("span", { className: "dt-skeleton", style: {
|
|
6
|
+
display: "block",
|
|
7
|
+
width,
|
|
8
|
+
height,
|
|
9
|
+
borderRadius: radius,
|
|
10
|
+
background: "var(--dt-surface-sunken)",
|
|
11
|
+
...style
|
|
12
|
+
} });
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export { Skeleton };
|
|
16
|
+
//# sourceMappingURL=Skeleton.mjs.map
|
|
17
|
+
//# sourceMappingURL=Skeleton.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/feedback/Skeleton.tsx"],"names":[],"mappings":";;;AASO,SAAS,QAAA,CAAS,EAAE,KAAA,GAAQ,MAAA,EAAQ,SAAS,EAAA,EAAI,MAAA,GAAS,qBAAA,EAAuB,KAAA,EAAM,EAAkB;AAC9G,EAAA,uBACE,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAc,KAAA,EAAO;AAAA,IACnC,OAAA,EAAS,OAAA;AAAA,IAAS,KAAA;AAAA,IAAO,MAAA;AAAA,IAAQ,YAAA,EAAc,MAAA;AAAA,IAC/C,UAAA,EAAY,0BAAA;AAAA,IAA4B,GAAG;AAAA,GAC7C,EAAG,CAAA;AAEP","file":"Skeleton.mjs","sourcesContent":["import type { CSSProperties } from 'react';\n\nexport interface SkeletonProps {\n width?: number | string;\n height?: number | string;\n radius?: string;\n style?: CSSProperties;\n}\n\nexport function Skeleton({ width = '100%', height = 14, radius = 'var(--dt-radius-sm)', style }: SkeletonProps) {\n return (\n <span className=\"dt-skeleton\" style={{\n display: 'block', width, height, borderRadius: radius,\n background: 'var(--dt-surface-sunken)', ...style,\n }} />\n );\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
+
|
|
6
|
+
// src/components/feedback/Spinner.tsx
|
|
7
|
+
function Spinner({ size = 18, stroke = 2, color = "var(--dt-accent)", style }) {
|
|
8
|
+
react.useId();
|
|
9
|
+
return /* @__PURE__ */ jsxRuntime.jsx("span", { style: { display: "inline-flex", ...style }, role: "status", "aria-label": "\uB85C\uB529 \uC911", children: /* @__PURE__ */ jsxRuntime.jsxs("svg", { className: "dt-spinner-svg", width: size, height: size, viewBox: "0 0 24 24", fill: "none", children: [
|
|
10
|
+
/* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "9", stroke: "currentColor", strokeWidth: stroke, style: { color: "var(--dt-border-strong)", opacity: 0.5 } }),
|
|
11
|
+
/* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 3a9 9 0 0 1 9 9", stroke: color, strokeWidth: stroke, strokeLinecap: "round" })
|
|
12
|
+
] }) });
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
exports.Spinner = Spinner;
|
|
16
|
+
//# sourceMappingURL=Spinner.cjs.map
|
|
17
|
+
//# sourceMappingURL=Spinner.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/feedback/Spinner.tsx"],"names":["useId","jsx","jsxs"],"mappings":";;;;;;AAUO,SAAS,OAAA,CAAQ,EAAE,IAAA,GAAO,EAAA,EAAI,SAAS,CAAA,EAAG,KAAA,GAAQ,kBAAA,EAAoB,KAAA,EAAM,EAAiB;AAClG,EAAAA,WAAA,EAAM;AACN,EAAA,uBACEC,cAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,OAAA,EAAS,eAAe,GAAG,KAAA,EAAM,EAAG,IAAA,EAAK,QAAA,EAAS,YAAA,EAAW,uBAC1E,QAAA,kBAAAC,eAAA,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,oBAAAD,cAAA,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,oBACpIA,cAAA,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.cjs","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,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 };
|