@xfilecom/front-core 0.2.28 → 0.2.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/README.md +10 -0
  2. package/dist/base.css +717 -0
  3. package/dist/components/atoms/Accordion.d.ts +18 -0
  4. package/dist/components/atoms/Accordion.js +68 -0
  5. package/dist/components/atoms/Alert.d.ts +12 -0
  6. package/dist/components/atoms/Alert.js +24 -0
  7. package/dist/components/atoms/AspectRatio.d.ts +8 -0
  8. package/dist/components/atoms/AspectRatio.js +10 -0
  9. package/dist/components/atoms/Avatar.d.ts +22 -0
  10. package/dist/components/atoms/Avatar.js +32 -0
  11. package/dist/components/atoms/Breadcrumb.d.ts +15 -0
  12. package/dist/components/atoms/Breadcrumb.js +27 -0
  13. package/dist/components/atoms/Collapsible.d.ts +12 -0
  14. package/dist/components/atoms/Collapsible.js +42 -0
  15. package/dist/components/atoms/Label.d.ts +8 -0
  16. package/dist/components/atoms/Label.js +10 -0
  17. package/dist/components/atoms/Pagination.d.ts +13 -0
  18. package/dist/components/atoms/Pagination.js +25 -0
  19. package/dist/components/atoms/Progress.d.ts +8 -0
  20. package/dist/components/atoms/Progress.js +9 -0
  21. package/dist/components/atoms/RadioGroup.d.ts +15 -0
  22. package/dist/components/atoms/RadioGroup.js +37 -0
  23. package/dist/components/atoms/ScrollArea.d.ts +8 -0
  24. package/dist/components/atoms/ScrollArea.js +15 -0
  25. package/dist/components/atoms/Separator.d.ts +10 -0
  26. package/dist/components/atoms/Separator.js +17 -0
  27. package/dist/components/atoms/Skeleton.d.ts +6 -0
  28. package/dist/components/atoms/Skeleton.js +15 -0
  29. package/dist/components/atoms/Slider.d.ts +4 -0
  30. package/dist/components/atoms/Slider.js +9 -0
  31. package/dist/components/atoms/Switch.d.ts +10 -0
  32. package/dist/components/atoms/Switch.js +12 -0
  33. package/dist/components/atoms/Table.d.ts +20 -0
  34. package/dist/components/atoms/Table.js +38 -0
  35. package/dist/components/atoms/Tabs.d.ts +20 -0
  36. package/dist/components/atoms/Tabs.js +54 -0
  37. package/dist/components/atoms/Toggle.d.ts +8 -0
  38. package/dist/components/atoms/Toggle.js +23 -0
  39. package/dist/components/atoms/Tooltip.d.ts +10 -0
  40. package/dist/components/atoms/Tooltip.js +12 -0
  41. package/dist/components/atoms/index.d.ts +22 -3
  42. package/dist/components/atoms/index.js +76 -7
  43. package/dist/generatedVersion.d.ts +1 -1
  44. package/dist/generatedVersion.js +1 -1
  45. package/dist/index.d.ts +1 -1
  46. package/dist/index.js +51 -1
  47. package/dist/showcase/DesignSystemShowcase.d.ts +2 -0
  48. package/dist/showcase/DesignSystemShowcase.js +19 -0
  49. package/dist/showcase/ShowcaseContext.d.ts +48 -0
  50. package/dist/showcase/ShowcaseContext.js +117 -0
  51. package/dist/showcase/components/CodeBlock.d.ts +7 -0
  52. package/dist/showcase/components/CodeBlock.js +11 -0
  53. package/dist/showcase/components/SectionTitle.d.ts +4 -0
  54. package/dist/showcase/components/SectionTitle.js +8 -0
  55. package/dist/showcase/components/ShowcaseChrome.d.ts +2 -0
  56. package/dist/showcase/components/ShowcaseChrome.js +25 -0
  57. package/dist/showcase/components/ShowcaseDemo.d.ts +10 -0
  58. package/dist/showcase/components/ShowcaseDemo.js +9 -0
  59. package/dist/showcase/components/icons.d.ts +2 -0
  60. package/dist/showcase/components/icons.js +11 -0
  61. package/dist/showcase/index.d.ts +4 -0
  62. package/dist/showcase/index.js +10 -0
  63. package/dist/showcase/nav.d.ts +26 -0
  64. package/dist/showcase/nav.js +13 -0
  65. package/dist/showcase/sections/ActionsSection.d.ts +1 -0
  66. package/dist/showcase/sections/ActionsSection.js +24 -0
  67. package/dist/showcase/sections/FeedbackSection.d.ts +1 -0
  68. package/dist/showcase/sections/FeedbackSection.js +17 -0
  69. package/dist/showcase/sections/FormsSection.d.ts +1 -0
  70. package/dist/showcase/sections/FormsSection.js +20 -0
  71. package/dist/showcase/sections/LayoutSection.d.ts +1 -0
  72. package/dist/showcase/sections/LayoutSection.js +19 -0
  73. package/dist/showcase/sections/OverlaysSection.d.ts +1 -0
  74. package/dist/showcase/sections/OverlaysSection.js +25 -0
  75. package/dist/showcase/sections/OverviewSection.d.ts +1 -0
  76. package/dist/showcase/sections/OverviewSection.js +17 -0
  77. package/dist/showcase/sections/SurfacesSection.d.ts +1 -0
  78. package/dist/showcase/sections/SurfacesSection.js +38 -0
  79. package/dist/showcase/sections/TypographySection.d.ts +1 -0
  80. package/dist/showcase/sections/TypographySection.js +24 -0
  81. package/dist/showcase.css +235 -0
  82. package/docs/COMPONENTS.md +26 -0
  83. package/docs/SHADCN.md +66 -0
  84. package/package.json +8 -3
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Accordion = Accordion;
4
+ exports.AccordionItem = AccordionItem;
5
+ exports.AccordionTrigger = AccordionTrigger;
6
+ exports.AccordionContent = AccordionContent;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const react_1 = require("react");
9
+ const AccordionContext = (0, react_1.createContext)(null);
10
+ function useAccordionContext(component) {
11
+ const ctx = (0, react_1.useContext)(AccordionContext);
12
+ if (!ctx) {
13
+ throw new Error(`${component} must be used inside <Accordion>`);
14
+ }
15
+ return ctx;
16
+ }
17
+ const AccordionItemContext = (0, react_1.createContext)(null);
18
+ function useAccordionItemContext(component) {
19
+ const ctx = (0, react_1.useContext)(AccordionItemContext);
20
+ if (!ctx) {
21
+ throw new Error(`${component} must be used inside <AccordionItem>`);
22
+ }
23
+ return ctx;
24
+ }
25
+ /** shadcn/ui `Accordion` 대응 — 단일 열림(single). */
26
+ function Accordion({ collapsible = false, defaultValue = undefined, value: valueProp, onValueChange, className = '', children, ...rest }) {
27
+ const [uncontrolled, setUncontrolled] = (0, react_1.useState)(defaultValue);
28
+ const isControlled = valueProp !== undefined;
29
+ const open = isControlled ? valueProp : uncontrolled;
30
+ const setOpen = (0, react_1.useCallback)((next) => {
31
+ onValueChange?.(next);
32
+ if (!isControlled) {
33
+ setUncontrolled(next);
34
+ }
35
+ }, [isControlled, onValueChange]);
36
+ const toggle = (0, react_1.useCallback)((itemValue) => {
37
+ if (open === itemValue) {
38
+ if (collapsible) {
39
+ setOpen(null);
40
+ }
41
+ return;
42
+ }
43
+ setOpen(itemValue);
44
+ }, [open, collapsible, setOpen]);
45
+ const ctx = (0, react_1.useMemo)(() => ({ open, toggle, collapsible }), [open, toggle, collapsible]);
46
+ return ((0, jsx_runtime_1.jsx)(AccordionContext.Provider, { value: ctx, children: (0, jsx_runtime_1.jsx)("div", { className: ['xfc-accordion', className].filter(Boolean).join(' '), ...rest, children: children }) }));
47
+ }
48
+ function AccordionItem({ value, className = '', children, ...rest }) {
49
+ const base = (0, react_1.useId)();
50
+ const itemCtx = (0, react_1.useMemo)(() => ({
51
+ value,
52
+ contentId: `${base}-content`,
53
+ triggerId: `${base}-trigger`,
54
+ }), [base, value]);
55
+ return ((0, jsx_runtime_1.jsx)(AccordionItemContext.Provider, { value: itemCtx, children: (0, jsx_runtime_1.jsx)("div", { className: ['xfc-accordion-item', className].filter(Boolean).join(' '), ...rest, children: children }) }));
56
+ }
57
+ function AccordionTrigger({ className = '', children, ...rest }) {
58
+ const { value: itemValue, contentId, triggerId } = useAccordionItemContext('AccordionTrigger');
59
+ const { open, toggle } = useAccordionContext('AccordionTrigger');
60
+ const isOpen = open === itemValue;
61
+ return ((0, jsx_runtime_1.jsxs)("button", { type: "button", id: triggerId, className: ['xfc-accordion-trigger', className].filter(Boolean).join(' '), "aria-expanded": isOpen, "aria-controls": contentId, onClick: () => toggle(itemValue), ...rest, children: [(0, jsx_runtime_1.jsx)("span", { style: { minWidth: 0 }, children: children }), (0, jsx_runtime_1.jsx)("svg", { className: "xfc-accordion-trigger__chevron", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", "aria-hidden": true, children: (0, jsx_runtime_1.jsx)("path", { d: "M6 9l6 6 6-6" }) })] }));
62
+ }
63
+ function AccordionContent({ className = '', children, ...rest }) {
64
+ const { value: itemValue, contentId, triggerId } = useAccordionItemContext('AccordionContent');
65
+ const { open } = useAccordionContext('AccordionContent');
66
+ const isOpen = open === itemValue;
67
+ return ((0, jsx_runtime_1.jsx)("div", { id: contentId, role: "region", className: ['xfc-accordion-content', className].filter(Boolean).join(' '), hidden: !isOpen, "aria-labelledby": triggerId, ...rest, children: isOpen ? children : null }));
68
+ }
@@ -0,0 +1,12 @@
1
+ import type { HTMLAttributes, ReactNode } from 'react';
2
+ export type AlertProps = HTMLAttributes<HTMLDivElement> & {
3
+ variant?: 'default' | 'destructive';
4
+ };
5
+ /** shadcn/ui `Alert` 대응. */
6
+ export declare function Alert({ variant, className, role, ...rest }: AlertProps): import("react/jsx-runtime").JSX.Element;
7
+ export type AlertTitleProps = HTMLAttributes<HTMLParagraphElement>;
8
+ export declare function AlertTitle({ className, ...rest }: AlertTitleProps): import("react/jsx-runtime").JSX.Element;
9
+ export type AlertDescriptionProps = HTMLAttributes<HTMLParagraphElement> & {
10
+ children?: ReactNode;
11
+ };
12
+ export declare function AlertDescription({ className, ...rest }: AlertDescriptionProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Alert = Alert;
4
+ exports.AlertTitle = AlertTitle;
5
+ exports.AlertDescription = AlertDescription;
6
+ const jsx_runtime_1 = require("react/jsx-runtime");
7
+ /** shadcn/ui `Alert` 대응. */
8
+ function Alert({ variant = 'default', className = '', role, ...rest }) {
9
+ const cls = [
10
+ 'xfc-alert',
11
+ variant === 'destructive' ? 'xfc-alert--destructive' : '',
12
+ className,
13
+ ]
14
+ .filter(Boolean)
15
+ .join(' ');
16
+ const r = role ?? (variant === 'destructive' ? 'alert' : undefined);
17
+ return (0, jsx_runtime_1.jsx)("div", { className: cls, role: r, ...rest });
18
+ }
19
+ function AlertTitle({ className = '', ...rest }) {
20
+ return (0, jsx_runtime_1.jsx)("p", { className: ['xfc-alert__title', className].filter(Boolean).join(' '), ...rest });
21
+ }
22
+ function AlertDescription({ className = '', ...rest }) {
23
+ return (0, jsx_runtime_1.jsx)("p", { className: ['xfc-alert__description', className].filter(Boolean).join(' '), ...rest });
24
+ }
@@ -0,0 +1,8 @@
1
+ import type { HTMLAttributes, ReactNode } from 'react';
2
+ export type AspectRatioProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {
3
+ /** 가로 / 세로 (예: 16/9) */
4
+ ratio?: number;
5
+ children?: ReactNode;
6
+ };
7
+ /** shadcn/ui `AspectRatio` 대응 — 패딩 트릭 박스. */
8
+ export declare function AspectRatio({ ratio, className, style, children, ...rest }: AspectRatioProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AspectRatio = AspectRatio;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ /** shadcn/ui `AspectRatio` 대응 — 패딩 트릭 박스. */
6
+ function AspectRatio({ ratio = 16 / 9, className = '', style, children, ...rest }) {
7
+ const paddingBottom = `${(1 / ratio) * 100}%`;
8
+ const outerStyle = { ...style, paddingBottom };
9
+ return ((0, jsx_runtime_1.jsx)("div", { className: ['xfc-aspect', className].filter(Boolean).join(' '), style: outerStyle, ...rest, children: (0, jsx_runtime_1.jsx)("div", { className: "xfc-aspect__inner", children: children }) }));
10
+ }
@@ -0,0 +1,22 @@
1
+ import { type HTMLAttributes, type ImgHTMLAttributes, type ReactNode } from 'react';
2
+ export type AvatarProps = HTMLAttributes<HTMLSpanElement>;
3
+ /** shadcn/ui `Avatar` 루트. */
4
+ export declare function Avatar({ className, ...rest }: AvatarProps): import("react/jsx-runtime").JSX.Element;
5
+ export type AvatarImageProps = ImgHTMLAttributes<HTMLImageElement> & {
6
+ onLoadingStatusChange?: (status: 'loaded' | 'error') => void;
7
+ };
8
+ export declare function AvatarImage({ className, onLoad, onError, onLoadingStatusChange, ...rest }: AvatarImageProps): import("react/jsx-runtime").JSX.Element;
9
+ export type AvatarFallbackProps = HTMLAttributes<HTMLSpanElement> & {
10
+ children?: ReactNode;
11
+ };
12
+ export declare function AvatarFallback({ className, ...rest }: AvatarFallbackProps): import("react/jsx-runtime").JSX.Element;
13
+ export type AvatarAutoProps = AvatarProps & {
14
+ src?: string;
15
+ alt?: string;
16
+ fallback: ReactNode;
17
+ };
18
+ /**
19
+ * 이미지 로드 실패 시 fallback만 보이는 합성 아바타.
20
+ * (shadcn 조합을 한 컴포넌트로 쓰기 위한 편의 API)
21
+ */
22
+ export declare function AvatarAuto({ src, alt, fallback, className, ...rest }: AvatarAutoProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Avatar = Avatar;
4
+ exports.AvatarImage = AvatarImage;
5
+ exports.AvatarFallback = AvatarFallback;
6
+ exports.AvatarAuto = AvatarAuto;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const react_1 = require("react");
9
+ /** shadcn/ui `Avatar` 루트. */
10
+ function Avatar({ className = '', ...rest }) {
11
+ return (0, jsx_runtime_1.jsx)("span", { className: ['xfc-avatar', className].filter(Boolean).join(' '), ...rest });
12
+ }
13
+ function AvatarImage({ className = '', onLoad, onError, onLoadingStatusChange, ...rest }) {
14
+ return ((0, jsx_runtime_1.jsx)("img", { className: ['xfc-avatar__image', className].filter(Boolean).join(' '), onLoad: (e) => {
15
+ onLoadingStatusChange?.('loaded');
16
+ onLoad?.(e);
17
+ }, onError: (e) => {
18
+ onLoadingStatusChange?.('error');
19
+ onError?.(e);
20
+ }, ...rest }));
21
+ }
22
+ function AvatarFallback({ className = '', ...rest }) {
23
+ return (0, jsx_runtime_1.jsx)("span", { className: ['xfc-avatar__fallback', className].filter(Boolean).join(' '), ...rest });
24
+ }
25
+ /**
26
+ * 이미지 로드 실패 시 fallback만 보이는 합성 아바타.
27
+ * (shadcn 조합을 한 컴포넌트로 쓰기 위한 편의 API)
28
+ */
29
+ function AvatarAuto({ src, alt = '', fallback, className = '', ...rest }) {
30
+ const [failed, setFailed] = (0, react_1.useState)(!src);
31
+ return ((0, jsx_runtime_1.jsxs)(Avatar, { className: className, ...rest, children: [src && !failed ? ((0, jsx_runtime_1.jsx)(AvatarImage, { src: src, alt: alt, onError: () => setFailed(true) })) : null, (0, jsx_runtime_1.jsx)(AvatarFallback, { children: fallback })] }));
32
+ }
@@ -0,0 +1,15 @@
1
+ import type { AnchorHTMLAttributes, HTMLAttributes, LiHTMLAttributes, OlHTMLAttributes, ReactNode } from 'react';
2
+ export type BreadcrumbProps = HTMLAttributes<HTMLElement>;
3
+ export declare function Breadcrumb({ className, ...rest }: BreadcrumbProps): import("react/jsx-runtime").JSX.Element;
4
+ export type BreadcrumbListProps = OlHTMLAttributes<HTMLOListElement>;
5
+ export declare function BreadcrumbList({ className, ...rest }: BreadcrumbListProps): import("react/jsx-runtime").JSX.Element;
6
+ export type BreadcrumbItemProps = LiHTMLAttributes<HTMLLIElement>;
7
+ export declare function BreadcrumbItem({ className, ...rest }: BreadcrumbItemProps): import("react/jsx-runtime").JSX.Element;
8
+ export type BreadcrumbLinkProps = AnchorHTMLAttributes<HTMLAnchorElement>;
9
+ export declare function BreadcrumbLink({ className, ...rest }: BreadcrumbLinkProps): import("react/jsx-runtime").JSX.Element;
10
+ export type BreadcrumbPageProps = HTMLAttributes<HTMLSpanElement>;
11
+ export declare function BreadcrumbPage({ className, ...rest }: BreadcrumbPageProps): import("react/jsx-runtime").JSX.Element;
12
+ export type BreadcrumbSeparatorProps = HTMLAttributes<HTMLSpanElement> & {
13
+ children?: ReactNode;
14
+ };
15
+ export declare function BreadcrumbSeparator({ className, children, ...rest }: BreadcrumbSeparatorProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Breadcrumb = Breadcrumb;
4
+ exports.BreadcrumbList = BreadcrumbList;
5
+ exports.BreadcrumbItem = BreadcrumbItem;
6
+ exports.BreadcrumbLink = BreadcrumbLink;
7
+ exports.BreadcrumbPage = BreadcrumbPage;
8
+ exports.BreadcrumbSeparator = BreadcrumbSeparator;
9
+ const jsx_runtime_1 = require("react/jsx-runtime");
10
+ function Breadcrumb({ className = '', ...rest }) {
11
+ return (0, jsx_runtime_1.jsx)("nav", { "aria-label": "Breadcrumb", className: ['xfc-breadcrumb', className].filter(Boolean).join(' '), ...rest });
12
+ }
13
+ function BreadcrumbList({ className = '', ...rest }) {
14
+ return (0, jsx_runtime_1.jsx)("ol", { className: ['xfc-breadcrumb-list', className].filter(Boolean).join(' '), ...rest });
15
+ }
16
+ function BreadcrumbItem({ className = '', ...rest }) {
17
+ return (0, jsx_runtime_1.jsx)("li", { className: ['xfc-breadcrumb-item', className].filter(Boolean).join(' '), ...rest });
18
+ }
19
+ function BreadcrumbLink({ className = '', ...rest }) {
20
+ return (0, jsx_runtime_1.jsx)("a", { className: ['xfc-breadcrumb-link', className].filter(Boolean).join(' '), ...rest });
21
+ }
22
+ function BreadcrumbPage({ className = '', ...rest }) {
23
+ return (0, jsx_runtime_1.jsx)("span", { className: ['xfc-breadcrumb-page', className].filter(Boolean).join(' '), "aria-current": "page", ...rest });
24
+ }
25
+ function BreadcrumbSeparator({ className = '', children = '/', ...rest }) {
26
+ return ((0, jsx_runtime_1.jsx)("span", { className: ['xfc-breadcrumb-sep', className].filter(Boolean).join(' '), "aria-hidden": true, ...rest, children: children }));
27
+ }
@@ -0,0 +1,12 @@
1
+ import { type ButtonHTMLAttributes, type HTMLAttributes } from 'react';
2
+ export type CollapsibleProps = HTMLAttributes<HTMLDivElement> & {
3
+ open?: boolean;
4
+ defaultOpen?: boolean;
5
+ onOpenChange?: (open: boolean) => void;
6
+ };
7
+ /** shadcn/ui `Collapsible` 대응. */
8
+ export declare function Collapsible({ open: openProp, defaultOpen, onOpenChange, className, children, ...rest }: CollapsibleProps): import("react/jsx-runtime").JSX.Element;
9
+ export type CollapsibleTriggerProps = ButtonHTMLAttributes<HTMLButtonElement>;
10
+ export declare function CollapsibleTrigger({ className, onClick, children, ...rest }: CollapsibleTriggerProps): import("react/jsx-runtime").JSX.Element;
11
+ export type CollapsibleContentProps = HTMLAttributes<HTMLDivElement>;
12
+ export declare function CollapsibleContent({ className, hidden: _h, children, ...rest }: CollapsibleContentProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Collapsible = Collapsible;
4
+ exports.CollapsibleTrigger = CollapsibleTrigger;
5
+ exports.CollapsibleContent = CollapsibleContent;
6
+ const jsx_runtime_1 = require("react/jsx-runtime");
7
+ const react_1 = require("react");
8
+ const CollapsibleContext = (0, react_1.createContext)(null);
9
+ function useCollapsible(component) {
10
+ const ctx = (0, react_1.useContext)(CollapsibleContext);
11
+ if (!ctx) {
12
+ throw new Error(`${component} must be used inside <Collapsible>`);
13
+ }
14
+ return ctx;
15
+ }
16
+ /** shadcn/ui `Collapsible` 대응. */
17
+ function Collapsible({ open: openProp, defaultOpen = false, onOpenChange, className = '', children, ...rest }) {
18
+ const [uncontrolled, setUncontrolled] = (0, react_1.useState)(defaultOpen);
19
+ const isControlled = openProp !== undefined;
20
+ const open = isControlled ? openProp : uncontrolled;
21
+ const setOpen = (0, react_1.useCallback)((next) => {
22
+ onOpenChange?.(next);
23
+ if (!isControlled) {
24
+ setUncontrolled(next);
25
+ }
26
+ }, [isControlled, onOpenChange]);
27
+ const ctx = (0, react_1.useMemo)(() => ({ open, setOpen }), [open, setOpen]);
28
+ return ((0, jsx_runtime_1.jsx)(CollapsibleContext.Provider, { value: ctx, children: (0, jsx_runtime_1.jsx)("div", { className: className, ...rest, children: children }) }));
29
+ }
30
+ function CollapsibleTrigger({ className = '', onClick, children, ...rest }) {
31
+ const { open, setOpen } = useCollapsible('CollapsibleTrigger');
32
+ return ((0, jsx_runtime_1.jsx)("button", { type: "button", className: ['xfc-collapsible-trigger', className].filter(Boolean).join(' '), "aria-expanded": open, onClick: (e) => {
33
+ onClick?.(e);
34
+ if (!e.defaultPrevented) {
35
+ setOpen(!open);
36
+ }
37
+ }, ...rest, children: children }));
38
+ }
39
+ function CollapsibleContent({ className = '', hidden: _h, children, ...rest }) {
40
+ const { open } = useCollapsible('CollapsibleContent');
41
+ return ((0, jsx_runtime_1.jsx)("div", { className: ['xfc-collapsible-panel', 'xfc-collapsible-content', className].filter(Boolean).join(' '), hidden: !open, ...rest, children: open ? children : null }));
42
+ }
@@ -0,0 +1,8 @@
1
+ import { type LabelHTMLAttributes } from 'react';
2
+ export type LabelProps = LabelHTMLAttributes<HTMLLabelElement> & {
3
+ disabled?: boolean;
4
+ };
5
+ /** shadcn/ui `Label` 대응 — 폼 컨트롤용 라벨. */
6
+ export declare const Label: import("react").ForwardRefExoticComponent<LabelHTMLAttributes<HTMLLabelElement> & {
7
+ disabled?: boolean;
8
+ } & import("react").RefAttributes<HTMLLabelElement>>;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Label = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ /** shadcn/ui `Label` 대응 — 폼 컨트롤용 라벨. */
7
+ exports.Label = (0, react_1.forwardRef)(function Label({ className = '', disabled = false, ...rest }, ref) {
8
+ const cls = ['xfc-label', disabled ? 'xfc-label--disabled' : '', className].filter(Boolean).join(' ');
9
+ return (0, jsx_runtime_1.jsx)("label", { ref: ref, className: cls, "aria-disabled": disabled || undefined, ...rest });
10
+ });
@@ -0,0 +1,13 @@
1
+ import type { ButtonHTMLAttributes, HTMLAttributes, LiHTMLAttributes } from 'react';
2
+ export type PaginationProps = HTMLAttributes<HTMLElement>;
3
+ export declare function Pagination({ className, ...rest }: PaginationProps): import("react/jsx-runtime").JSX.Element;
4
+ export type PaginationContentProps = HTMLAttributes<HTMLUListElement>;
5
+ export declare function PaginationContent({ className, ...rest }: PaginationContentProps): import("react/jsx-runtime").JSX.Element;
6
+ export type PaginationItemProps = LiHTMLAttributes<HTMLLIElement>;
7
+ export declare function PaginationItem({ className, ...rest }: PaginationItemProps): import("react/jsx-runtime").JSX.Element;
8
+ export type PaginationLinkProps = ButtonHTMLAttributes<HTMLButtonElement> & {
9
+ active?: boolean;
10
+ };
11
+ export declare function PaginationLink({ active, className, type, ...rest }: PaginationLinkProps): import("react/jsx-runtime").JSX.Element;
12
+ export type PaginationEllipsisProps = HTMLAttributes<HTMLSpanElement>;
13
+ export declare function PaginationEllipsis({ className, children, ...rest }: PaginationEllipsisProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Pagination = Pagination;
4
+ exports.PaginationContent = PaginationContent;
5
+ exports.PaginationItem = PaginationItem;
6
+ exports.PaginationLink = PaginationLink;
7
+ exports.PaginationEllipsis = PaginationEllipsis;
8
+ const jsx_runtime_1 = require("react/jsx-runtime");
9
+ function Pagination({ className = '', ...rest }) {
10
+ return ((0, jsx_runtime_1.jsx)("nav", { role: "navigation", "aria-label": "Pagination", className: ['xfc-pagination', className].filter(Boolean).join(' '), ...rest }));
11
+ }
12
+ function PaginationContent({ className = '', ...rest }) {
13
+ return (0, jsx_runtime_1.jsx)("ul", { className: ['xfc-pagination__list', className].filter(Boolean).join(' '), ...rest });
14
+ }
15
+ function PaginationItem({ className = '', ...rest }) {
16
+ return (0, jsx_runtime_1.jsx)("li", { className: className, ...rest });
17
+ }
18
+ function PaginationLink({ active, className = '', type = 'button', ...rest }) {
19
+ return ((0, jsx_runtime_1.jsx)("button", { type: type, className: ['xfc-pagination__link', active ? 'xfc-pagination__link--active' : '', className]
20
+ .filter(Boolean)
21
+ .join(' '), ...rest }));
22
+ }
23
+ function PaginationEllipsis({ className = '', children = '…', ...rest }) {
24
+ return ((0, jsx_runtime_1.jsx)("span", { className: ['xfc-pagination__ellipsis', className].filter(Boolean).join(' '), "aria-hidden": true, ...rest, children: children }));
25
+ }
@@ -0,0 +1,8 @@
1
+ import type { HTMLAttributes } from 'react';
2
+ export type ProgressProps = HTMLAttributes<HTMLDivElement> & {
3
+ /** 0 ~ max */
4
+ value: number;
5
+ max?: number;
6
+ };
7
+ /** shadcn/ui `Progress` 대응 — 결정적 진행률 막대. */
8
+ export declare function Progress({ value, max, className, ...rest }: ProgressProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Progress = Progress;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ /** shadcn/ui `Progress` 대응 — 결정적 진행률 막대. */
6
+ function Progress({ value, max = 100, className = '', ...rest }) {
7
+ const pct = max <= 0 ? 0 : Math.min(100, Math.max(0, (value / max) * 100));
8
+ return ((0, jsx_runtime_1.jsx)("div", { role: "progressbar", "aria-valuenow": Math.round(value), "aria-valuemin": 0, "aria-valuemax": max, className: ['xfc-progress', className].filter(Boolean).join(' '), ...rest, children: (0, jsx_runtime_1.jsx)("div", { className: "xfc-progress__indicator", style: { width: `${pct}%` } }) }));
9
+ }
@@ -0,0 +1,15 @@
1
+ import { type FieldsetHTMLAttributes, type InputHTMLAttributes, type ReactNode } from 'react';
2
+ export type RadioGroupProps = FieldsetHTMLAttributes<HTMLFieldSetElement> & {
3
+ legend?: ReactNode;
4
+ name?: string;
5
+ value?: string;
6
+ defaultValue?: string;
7
+ onValueChange?: (value: string) => void;
8
+ };
9
+ /** shadcn/ui `RadioGroup` 대응 — `fieldset` + 네이티브 `radio`. */
10
+ export declare function RadioGroup({ legend, name: nameProp, value: valueProp, defaultValue, onValueChange, disabled, className, children, ...rest }: RadioGroupProps): import("react/jsx-runtime").JSX.Element;
11
+ export type RadioGroupItemProps = Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'name'> & {
12
+ label: ReactNode;
13
+ value: string;
14
+ };
15
+ export declare function RadioGroupItem({ value: itemValue, label, className, id: idProp, disabled: itemDisabled, ...rest }: RadioGroupItemProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RadioGroup = RadioGroup;
4
+ exports.RadioGroupItem = RadioGroupItem;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ const react_1 = require("react");
7
+ const RadioGroupContext = (0, react_1.createContext)(null);
8
+ function useRadioGroup(component) {
9
+ const ctx = (0, react_1.useContext)(RadioGroupContext);
10
+ if (!ctx) {
11
+ throw new Error(`${component} must be used inside <RadioGroup>`);
12
+ }
13
+ return ctx;
14
+ }
15
+ /** shadcn/ui `RadioGroup` 대응 — `fieldset` + 네이티브 `radio`. */
16
+ function RadioGroup({ legend, name: nameProp, value: valueProp, defaultValue = '', onValueChange, disabled, className = '', children, ...rest }) {
17
+ const gen = (0, react_1.useId)();
18
+ const name = nameProp ?? `xfc-rg-${gen}`;
19
+ const [uncontrolled, setUncontrolled] = (0, react_1.useState)(defaultValue);
20
+ const isControlled = valueProp !== undefined;
21
+ const value = isControlled ? valueProp : uncontrolled;
22
+ const setValue = (0, react_1.useCallback)((v) => {
23
+ onValueChange?.(v);
24
+ if (!isControlled) {
25
+ setUncontrolled(v);
26
+ }
27
+ }, [isControlled, onValueChange]);
28
+ const ctx = (0, react_1.useMemo)(() => ({ name, value, setValue, disabled: disabled === true }), [name, value, setValue, disabled]);
29
+ return ((0, jsx_runtime_1.jsxs)("fieldset", { className: ['xfc-radio-group', className].filter(Boolean).join(' '), disabled: disabled, ...rest, children: [legend != null ? (0, jsx_runtime_1.jsx)("legend", { className: "xfc-radio-group__legend", children: legend }) : null, (0, jsx_runtime_1.jsx)(RadioGroupContext.Provider, { value: ctx, children: children })] }));
30
+ }
31
+ function RadioGroupItem({ value: itemValue, label, className = '', id: idProp, disabled: itemDisabled, ...rest }) {
32
+ const ctx = useRadioGroup('RadioGroupItem');
33
+ const autoId = (0, react_1.useId)();
34
+ const inputId = idProp ?? autoId;
35
+ const isDisabled = ctx.disabled || itemDisabled === true;
36
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "xfc-radio-row", children: [(0, jsx_runtime_1.jsx)("input", { type: "radio", id: inputId, className: ['xfc-radio', className].filter(Boolean).join(' '), name: ctx.name, value: itemValue, checked: ctx.value === itemValue, disabled: isDisabled, ...rest, onChange: () => ctx.setValue(itemValue) }), (0, jsx_runtime_1.jsx)("label", { htmlFor: inputId, className: "xfc-radio-label", children: label })] }));
37
+ }
@@ -0,0 +1,8 @@
1
+ import { type HTMLAttributes } from 'react';
2
+ export type ScrollAreaProps = HTMLAttributes<HTMLDivElement> & {
3
+ maxHeight?: number | string;
4
+ };
5
+ /** shadcn/ui `ScrollArea` 단순 대응 — 네이티브 스크롤 + 포커스 링. */
6
+ export declare const ScrollArea: import("react").ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & {
7
+ maxHeight?: number | string;
8
+ } & import("react").RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ScrollArea = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ /** shadcn/ui `ScrollArea` 단순 대응 — 네이티브 스크롤 + 포커스 링. */
7
+ exports.ScrollArea = (0, react_1.forwardRef)(function ScrollArea({ className = '', maxHeight, style, tabIndex = 0, ...rest }, ref) {
8
+ const mh = maxHeight === undefined
9
+ ? undefined
10
+ : typeof maxHeight === 'number'
11
+ ? `${maxHeight}px`
12
+ : maxHeight;
13
+ const merged = { ...style, ...(mh != null ? { maxHeight: mh } : {}) };
14
+ return ((0, jsx_runtime_1.jsx)("div", { ref: ref, className: ['xfc-scroll-area', className].filter(Boolean).join(' '), style: merged, tabIndex: tabIndex, ...rest }));
15
+ });
@@ -0,0 +1,10 @@
1
+ import type { HTMLAttributes } from 'react';
2
+ export type SeparatorProps = HTMLAttributes<HTMLDivElement> & {
3
+ orientation?: 'horizontal' | 'vertical';
4
+ /** true면 스크린리더에서 구분선으로 읽지 않음 */
5
+ decorative?: boolean;
6
+ };
7
+ /**
8
+ * shadcn/ui `Separator` 대응 — 수평·수직 구분선.
9
+ */
10
+ export declare function Separator({ orientation, decorative, className, ...rest }: SeparatorProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Separator = Separator;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ /**
6
+ * shadcn/ui `Separator` 대응 — 수평·수직 구분선.
7
+ */
8
+ function Separator({ orientation = 'horizontal', decorative = true, className = '', ...rest }) {
9
+ const cls = [
10
+ 'xfc-separator',
11
+ orientation === 'vertical' ? 'xfc-separator--vertical' : 'xfc-separator--horizontal',
12
+ className,
13
+ ]
14
+ .filter(Boolean)
15
+ .join(' ');
16
+ return ((0, jsx_runtime_1.jsx)("div", { className: cls, role: decorative ? 'none' : 'separator', "aria-orientation": orientation === 'vertical' ? 'vertical' : 'horizontal', ...rest }));
17
+ }
@@ -0,0 +1,6 @@
1
+ import type { HTMLAttributes } from 'react';
2
+ export type SkeletonProps = HTMLAttributes<HTMLDivElement> & {
3
+ variant?: 'default' | 'circle';
4
+ };
5
+ /** shadcn/ui `Skeleton` 대응 — 로딩 플레이스홀더. */
6
+ export declare function Skeleton({ className, variant, style, ...rest }: SkeletonProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Skeleton = Skeleton;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ /** shadcn/ui `Skeleton` 대응 — 로딩 플레이스홀더. */
6
+ function Skeleton({ className = '', variant = 'default', style, ...rest }) {
7
+ const cls = [
8
+ 'xfc-skeleton',
9
+ variant === 'circle' ? 'xfc-skeleton--circle' : '',
10
+ className,
11
+ ]
12
+ .filter(Boolean)
13
+ .join(' ');
14
+ return (0, jsx_runtime_1.jsx)("div", { className: cls, style: style, ...rest });
15
+ }
@@ -0,0 +1,4 @@
1
+ import { type InputHTMLAttributes } from 'react';
2
+ export type SliderProps = Omit<InputHTMLAttributes<HTMLInputElement>, 'type'>;
3
+ /** shadcn/ui `Slider` 단순 대응 — 네이티브 `range`. */
4
+ export declare const Slider: import("react").ForwardRefExoticComponent<SliderProps & import("react").RefAttributes<HTMLInputElement>>;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Slider = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ /** shadcn/ui `Slider` 단순 대응 — 네이티브 `range`. */
7
+ exports.Slider = (0, react_1.forwardRef)(function Slider({ className = '', ...rest }, ref) {
8
+ return (0, jsx_runtime_1.jsx)("input", { ref: ref, type: "range", className: ['xfc-slider', className].filter(Boolean).join(' '), ...rest });
9
+ });
@@ -0,0 +1,10 @@
1
+ import { type InputHTMLAttributes, type ReactNode } from 'react';
2
+ export type SwitchProps = Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'role'> & {
3
+ /** 트랙 오른쪽 설명 */
4
+ label?: ReactNode;
5
+ };
6
+ /** shadcn/ui `Switch` 대응 — 시각적 토글, 내부는 `checkbox` + `role="switch"`. */
7
+ export declare const Switch: import("react").ForwardRefExoticComponent<Omit<InputHTMLAttributes<HTMLInputElement>, "role" | "type"> & {
8
+ /** 트랙 오른쪽 설명 */
9
+ label?: ReactNode;
10
+ } & import("react").RefAttributes<HTMLInputElement>>;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Switch = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ /** shadcn/ui `Switch` 대응 — 시각적 토글, 내부는 `checkbox` + `role="switch"`. */
7
+ exports.Switch = (0, react_1.forwardRef)(function Switch({ className = '', label, id: idProp, disabled, ...rest }, ref) {
8
+ const genId = (0, react_1.useId)();
9
+ const inputId = idProp ?? genId;
10
+ const rowCls = ['xfc-switch', disabled ? 'xfc-switch--disabled' : '', className].filter(Boolean).join(' ');
11
+ return ((0, jsx_runtime_1.jsxs)("label", { className: rowCls, htmlFor: inputId, children: [(0, jsx_runtime_1.jsx)("input", { ref: ref, id: inputId, type: "checkbox", role: "switch", className: "xfc-switch__input", disabled: disabled, ...rest }), (0, jsx_runtime_1.jsx)("span", { className: "xfc-switch__track", "aria-hidden": true, children: (0, jsx_runtime_1.jsx)("span", { className: "xfc-switch__thumb" }) }), label != null ? (0, jsx_runtime_1.jsx)("span", { className: "xfc-checkbox-label", children: label }) : null] }));
12
+ });
@@ -0,0 +1,20 @@
1
+ import type { HTMLAttributes, TableHTMLAttributes, TdHTMLAttributes, ThHTMLAttributes } from 'react';
2
+ export type TableProps = TableHTMLAttributes<HTMLTableElement>;
3
+ /**
4
+ * shadcn/ui `Table` 대응 — 가로 스크롤 래퍼 포함.
5
+ */
6
+ export declare function Table({ className, children, ...rest }: TableProps): import("react/jsx-runtime").JSX.Element;
7
+ export type TableHeaderProps = HTMLAttributes<HTMLTableSectionElement>;
8
+ export declare function TableHeader({ className, ...rest }: TableHeaderProps): import("react/jsx-runtime").JSX.Element;
9
+ export type TableBodyProps = HTMLAttributes<HTMLTableSectionElement>;
10
+ export declare function TableBody({ className, ...rest }: TableBodyProps): import("react/jsx-runtime").JSX.Element;
11
+ export type TableFooterProps = HTMLAttributes<HTMLTableSectionElement>;
12
+ export declare function TableFooter({ className, ...rest }: TableFooterProps): import("react/jsx-runtime").JSX.Element;
13
+ export type TableRowProps = HTMLAttributes<HTMLTableRowElement>;
14
+ export declare function TableRow({ className, ...rest }: TableRowProps): import("react/jsx-runtime").JSX.Element;
15
+ export type TableHeadProps = ThHTMLAttributes<HTMLTableCellElement>;
16
+ export declare function TableHead({ className, ...rest }: TableHeadProps): import("react/jsx-runtime").JSX.Element;
17
+ export type TableCellProps = TdHTMLAttributes<HTMLTableCellElement>;
18
+ export declare function TableCell({ className, ...rest }: TableCellProps): import("react/jsx-runtime").JSX.Element;
19
+ export type TableCaptionProps = HTMLAttributes<HTMLTableCaptionElement>;
20
+ export declare function TableCaption({ className, ...rest }: TableCaptionProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Table = Table;
4
+ exports.TableHeader = TableHeader;
5
+ exports.TableBody = TableBody;
6
+ exports.TableFooter = TableFooter;
7
+ exports.TableRow = TableRow;
8
+ exports.TableHead = TableHead;
9
+ exports.TableCell = TableCell;
10
+ exports.TableCaption = TableCaption;
11
+ const jsx_runtime_1 = require("react/jsx-runtime");
12
+ /**
13
+ * shadcn/ui `Table` 대응 — 가로 스크롤 래퍼 포함.
14
+ */
15
+ function Table({ className = '', children, ...rest }) {
16
+ return ((0, jsx_runtime_1.jsx)("div", { className: "xfc-table-wrap", children: (0, jsx_runtime_1.jsx)("table", { className: ['xfc-table', className].filter(Boolean).join(' '), ...rest, children: children }) }));
17
+ }
18
+ function TableHeader({ className = '', ...rest }) {
19
+ return (0, jsx_runtime_1.jsx)("thead", { className: ['xfc-table-header', className].filter(Boolean).join(' '), ...rest });
20
+ }
21
+ function TableBody({ className = '', ...rest }) {
22
+ return (0, jsx_runtime_1.jsx)("tbody", { className: className, ...rest });
23
+ }
24
+ function TableFooter({ className = '', ...rest }) {
25
+ return (0, jsx_runtime_1.jsx)("tfoot", { className: ['xfc-table-footer', className].filter(Boolean).join(' '), ...rest });
26
+ }
27
+ function TableRow({ className = '', ...rest }) {
28
+ return (0, jsx_runtime_1.jsx)("tr", { className: ['xfc-table-row', className].filter(Boolean).join(' '), ...rest });
29
+ }
30
+ function TableHead({ className = '', ...rest }) {
31
+ return (0, jsx_runtime_1.jsx)("th", { className: ['xfc-table-head', className].filter(Boolean).join(' '), ...rest });
32
+ }
33
+ function TableCell({ className = '', ...rest }) {
34
+ return (0, jsx_runtime_1.jsx)("td", { className: ['xfc-table-cell', className].filter(Boolean).join(' '), ...rest });
35
+ }
36
+ function TableCaption({ className = '', ...rest }) {
37
+ return (0, jsx_runtime_1.jsx)("caption", { className: ['xfc-table-caption', className].filter(Boolean).join(' '), ...rest });
38
+ }