@xfilecom/front-core 0.2.14 → 0.2.15

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/dist/base.css CHANGED
@@ -516,3 +516,156 @@ a:hover {
516
516
  box-shadow: var(--xfc-focus-ring);
517
517
  border-radius: var(--xfc-radius-xs);
518
518
  }
519
+
520
+ /* —— Dialog / Bottom sheet (toast·inline error 위, loading 과 겹치면 이쪽이 위) —— */
521
+
522
+ @keyframes xfc-dialog-backdrop-in {
523
+ from {
524
+ opacity: 0;
525
+ }
526
+ to {
527
+ opacity: 1;
528
+ }
529
+ }
530
+
531
+ @keyframes xfc-dialog-panel-in {
532
+ from {
533
+ opacity: 0;
534
+ transform: translateY(8px) scale(0.98);
535
+ }
536
+ to {
537
+ opacity: 1;
538
+ transform: translateY(0) scale(1);
539
+ }
540
+ }
541
+
542
+ @keyframes xfc-bottom-sheet-in {
543
+ from {
544
+ transform: translateY(100%);
545
+ }
546
+ to {
547
+ transform: translateY(0);
548
+ }
549
+ }
550
+
551
+ .xfc-dialog-backdrop {
552
+ position: fixed;
553
+ inset: 0;
554
+ z-index: 10050;
555
+ display: flex;
556
+ align-items: center;
557
+ justify-content: center;
558
+ padding: var(--xfc-space-lg);
559
+ box-sizing: border-box;
560
+ background: color-mix(in srgb, var(--xfc-fg) 42%, transparent);
561
+ animation: xfc-dialog-backdrop-in 0.18s ease-out;
562
+ }
563
+
564
+ .xfc-dialog-backdrop--bottom {
565
+ align-items: flex-end;
566
+ padding: 0;
567
+ }
568
+
569
+ .xfc-dialog-panel {
570
+ position: relative;
571
+ z-index: 1;
572
+ width: 100%;
573
+ max-width: min(440px, 100%);
574
+ max-height: min(88dvh, 720px);
575
+ overflow: auto;
576
+ box-sizing: border-box;
577
+ padding: var(--xfc-space-xl);
578
+ border-radius: var(--xfc-radius-md);
579
+ background: var(--xfc-bg-elevated);
580
+ color: var(--xfc-fg);
581
+ border: 1px solid var(--xfc-border);
582
+ box-shadow:
583
+ 0 24px 48px color-mix(in srgb, var(--xfc-fg) 12%, transparent),
584
+ var(--xfc-card-shadow);
585
+ font-family: var(--xfc-font-sans);
586
+ animation: xfc-dialog-panel-in 0.22s ease-out;
587
+ }
588
+
589
+ .xfc-dialog-panel__title {
590
+ font-size: var(--xfc-text-section);
591
+ font-weight: 700;
592
+ line-height: var(--xfc-leading-tight);
593
+ margin: 0 0 var(--xfc-space-md);
594
+ color: var(--xfc-fg-strong);
595
+ }
596
+
597
+ .xfc-dialog-panel__description {
598
+ font-size: var(--xfc-text-body);
599
+ line-height: var(--xfc-leading-normal);
600
+ margin: 0 0 var(--xfc-space-lg);
601
+ color: var(--xfc-fg);
602
+ }
603
+
604
+ .xfc-dialog-panel__body {
605
+ min-width: 0;
606
+ }
607
+
608
+ .xfc-dialog-footer {
609
+ display: flex;
610
+ flex-wrap: wrap;
611
+ justify-content: flex-end;
612
+ align-items: center;
613
+ gap: var(--xfc-space-sm);
614
+ margin-top: var(--xfc-space-lg);
615
+ }
616
+
617
+ .xfc-confirm-dialog .xfc-dialog-panel__description:last-of-type {
618
+ margin-bottom: 0;
619
+ }
620
+
621
+ .xfc-confirm-dialog .xfc-dialog-footer {
622
+ margin-top: var(--xfc-space-xl);
623
+ }
624
+
625
+ button.xfc-btn.xfc-btn--primary.xfc-confirm-dialog__confirm--danger {
626
+ background: var(--xfc-danger);
627
+ color: var(--xfc-accent-fg);
628
+ border-color: transparent;
629
+ }
630
+
631
+ button.xfc-btn.xfc-btn--primary.xfc-confirm-dialog__confirm--danger:hover:not(:disabled) {
632
+ filter: brightness(0.94);
633
+ }
634
+
635
+ .xfc-bottom-sheet-panel {
636
+ width: 100%;
637
+ max-width: 100%;
638
+ max-height: min(92dvh, 900px);
639
+ margin: 0;
640
+ padding: var(--xfc-space-md) var(--xfc-space-xl) calc(var(--xfc-space-xl) + env(safe-area-inset-bottom, 0px));
641
+ border-radius: var(--xfc-radius-lg) var(--xfc-radius-lg) 0 0;
642
+ animation: xfc-bottom-sheet-in 0.28s cubic-bezier(0.22, 1, 0.36, 1);
643
+ }
644
+
645
+ .xfc-bottom-sheet-handle {
646
+ width: 40px;
647
+ height: 4px;
648
+ margin: 0 auto var(--xfc-space-md);
649
+ border-radius: var(--xfc-radius-full);
650
+ background: var(--xfc-border-strong);
651
+ flex-shrink: 0;
652
+ }
653
+
654
+ .xfc-bottom-sheet-panel__title {
655
+ font-size: var(--xfc-text-section);
656
+ font-weight: 700;
657
+ margin: 0 0 var(--xfc-space-md);
658
+ color: var(--xfc-fg-strong);
659
+ }
660
+
661
+ .xfc-bottom-sheet-panel__body {
662
+ min-width: 0;
663
+ }
664
+
665
+ @media (prefers-reduced-motion: reduce) {
666
+ .xfc-dialog-backdrop,
667
+ .xfc-dialog-panel,
668
+ .xfc-bottom-sheet-panel {
669
+ animation: none;
670
+ }
671
+ }
@@ -1 +1,2 @@
1
1
  export * from './atoms';
2
+ export * from './overlays';
@@ -15,3 +15,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./atoms"), exports);
18
+ __exportStar(require("./overlays"), exports);
@@ -0,0 +1,14 @@
1
+ import { type HTMLAttributes, type ReactNode } from 'react';
2
+ export type BottomSheetProps = {
3
+ open: boolean;
4
+ onOpenChange?: (open: boolean) => void;
5
+ children?: ReactNode;
6
+ title?: ReactNode;
7
+ /** 상단 드래그 핸들 막대(시각용) */
8
+ showHandle?: boolean;
9
+ closeOnBackdropClick?: boolean;
10
+ closeOnEscape?: boolean;
11
+ backdropClassName?: string;
12
+ panelClassName?: string;
13
+ } & Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'title'>;
14
+ export declare function BottomSheet({ open, onOpenChange, children, title, showHandle, closeOnBackdropClick, closeOnEscape, backdropClassName, panelClassName, className, onMouseDown: onPanelMouseDown, ...panelRest }: BottomSheetProps): import("react").ReactPortal | null;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BottomSheet = BottomSheet;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const react_dom_1 = require("react-dom");
7
+ const overlayHooks_1 = require("./overlayHooks");
8
+ function BottomSheet({ open, onOpenChange, children, title, showHandle = true, closeOnBackdropClick = true, closeOnEscape = true, backdropClassName = '', panelClassName = '', className = '', onMouseDown: onPanelMouseDown, ...panelRest }) {
9
+ const titleId = (0, react_1.useId)();
10
+ const panelRef = (0, react_1.useRef)(null);
11
+ const prevFocusRef = (0, react_1.useRef)(null);
12
+ const requestClose = (0, react_1.useCallback)(() => {
13
+ onOpenChange?.(false);
14
+ }, [onOpenChange]);
15
+ (0, overlayHooks_1.useBodyScrollLock)(open);
16
+ (0, overlayHooks_1.useEscapeKey)(open && closeOnEscape, requestClose);
17
+ (0, react_1.useEffect)(() => {
18
+ if (!open || typeof document === 'undefined')
19
+ return;
20
+ prevFocusRef.current = document.activeElement;
21
+ const t = window.setTimeout(() => {
22
+ panelRef.current?.focus();
23
+ }, 0);
24
+ return () => {
25
+ window.clearTimeout(t);
26
+ prevFocusRef.current?.focus?.();
27
+ prevFocusRef.current = null;
28
+ };
29
+ }, [open]);
30
+ if (!open || typeof document === 'undefined')
31
+ return null;
32
+ const backdropCls = ['xfc-dialog-backdrop', 'xfc-dialog-backdrop--bottom', backdropClassName]
33
+ .filter(Boolean)
34
+ .join(' ');
35
+ const panelCls = [
36
+ 'xfc-dialog-panel',
37
+ 'xfc-bottom-sheet-panel',
38
+ panelClassName,
39
+ className,
40
+ ]
41
+ .filter(Boolean)
42
+ .join(' ');
43
+ return (0, react_dom_1.createPortal)((0, jsx_runtime_1.jsx)("div", { className: backdropCls, role: "presentation", onMouseDown: (e) => {
44
+ if (e.target === e.currentTarget && closeOnBackdropClick)
45
+ requestClose();
46
+ }, children: (0, jsx_runtime_1.jsxs)("div", { ref: panelRef, ...panelRest, className: panelCls, role: "dialog", "aria-modal": "true", "aria-labelledby": title ? titleId : undefined, tabIndex: -1, onMouseDown: (e) => {
47
+ onPanelMouseDown?.(e);
48
+ e.stopPropagation();
49
+ }, children: [showHandle ? (0, jsx_runtime_1.jsx)("div", { className: "xfc-bottom-sheet-handle", "aria-hidden": true }) : null, title ? ((0, jsx_runtime_1.jsx)("div", { id: titleId, className: "xfc-bottom-sheet-panel__title", children: title })) : null, (0, jsx_runtime_1.jsx)("div", { className: "xfc-bottom-sheet-panel__body", children: children })] }) }), document.body);
50
+ }
@@ -0,0 +1,17 @@
1
+ import type { ReactNode } from 'react';
2
+ export type ConfirmDialogProps = {
3
+ open: boolean;
4
+ onOpenChange?: (open: boolean) => void;
5
+ onConfirm?: () => void;
6
+ onCancel?: () => void;
7
+ title?: ReactNode;
8
+ message?: ReactNode;
9
+ confirmLabel?: string;
10
+ cancelLabel?: string;
11
+ /** true 이면 확인 버튼을 위험 액션 스타일로 */
12
+ destructive?: boolean;
13
+ confirmLoading?: boolean;
14
+ closeOnBackdropClick?: boolean;
15
+ panelClassName?: string;
16
+ };
17
+ export declare function ConfirmDialog({ open, onOpenChange, onConfirm, onCancel, title, message, confirmLabel, cancelLabel, destructive, confirmLoading, closeOnBackdropClick, panelClassName, }: ConfirmDialogProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConfirmDialog = ConfirmDialog;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const Button_1 = require("../atoms/Button");
6
+ const Dialog_1 = require("./Dialog");
7
+ function ConfirmDialog({ open, onOpenChange, onConfirm, onCancel, title, message, confirmLabel = '확인', cancelLabel = '취소', destructive = false, confirmLoading = false, closeOnBackdropClick = true, panelClassName = '', }) {
8
+ const handleCancel = () => {
9
+ onCancel?.();
10
+ onOpenChange?.(false);
11
+ };
12
+ const handleConfirm = () => {
13
+ if (confirmLoading)
14
+ return;
15
+ onConfirm?.();
16
+ };
17
+ return ((0, jsx_runtime_1.jsx)(Dialog_1.Dialog, { open: open, onOpenChange: onOpenChange, title: title, description: message, closeOnBackdropClick: closeOnBackdropClick, panelClassName: ['xfc-confirm-dialog', panelClassName].filter(Boolean).join(' '), children: (0, jsx_runtime_1.jsxs)("div", { className: "xfc-dialog-footer", children: [(0, jsx_runtime_1.jsx)(Button_1.Button, { type: "button", variant: "muted", onClick: handleCancel, disabled: confirmLoading, children: cancelLabel }), (0, jsx_runtime_1.jsx)(Button_1.Button, { type: "button", variant: "primary", className: destructive ? 'xfc-confirm-dialog__confirm--danger' : '', onClick: handleConfirm, disabled: confirmLoading, "aria-busy": confirmLoading, children: confirmLoading ? '…' : confirmLabel })] }) }));
18
+ }
@@ -0,0 +1,15 @@
1
+ import { type HTMLAttributes, type ReactNode } from 'react';
2
+ export type DialogProps = {
3
+ open: boolean;
4
+ onOpenChange?: (open: boolean) => void;
5
+ children?: ReactNode;
6
+ /** 보이는 제목(패널 상단). 스크린 리더용 id 자동 연결 */
7
+ title?: ReactNode;
8
+ /** 부가 설명 */
9
+ description?: ReactNode;
10
+ closeOnBackdropClick?: boolean;
11
+ closeOnEscape?: boolean;
12
+ backdropClassName?: string;
13
+ panelClassName?: string;
14
+ } & Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'title'>;
15
+ export declare function Dialog({ open, onOpenChange, children, title, description, closeOnBackdropClick, closeOnEscape, backdropClassName, panelClassName, className, onMouseDown: onPanelMouseDown, ...panelRest }: DialogProps): import("react").ReactPortal | null;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Dialog = Dialog;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const react_dom_1 = require("react-dom");
7
+ const overlayHooks_1 = require("./overlayHooks");
8
+ function Dialog({ open, onOpenChange, children, title, description, closeOnBackdropClick = true, closeOnEscape = true, backdropClassName = '', panelClassName = '', className = '', onMouseDown: onPanelMouseDown, ...panelRest }) {
9
+ const titleId = (0, react_1.useId)();
10
+ const descriptionId = (0, react_1.useId)();
11
+ const panelRef = (0, react_1.useRef)(null);
12
+ const prevFocusRef = (0, react_1.useRef)(null);
13
+ const requestClose = (0, react_1.useCallback)(() => {
14
+ onOpenChange?.(false);
15
+ }, [onOpenChange]);
16
+ (0, overlayHooks_1.useBodyScrollLock)(open);
17
+ (0, overlayHooks_1.useEscapeKey)(open && closeOnEscape, requestClose);
18
+ (0, react_1.useEffect)(() => {
19
+ if (!open || typeof document === 'undefined')
20
+ return;
21
+ prevFocusRef.current = document.activeElement;
22
+ const t = window.setTimeout(() => {
23
+ panelRef.current?.focus();
24
+ }, 0);
25
+ return () => {
26
+ window.clearTimeout(t);
27
+ prevFocusRef.current?.focus?.();
28
+ prevFocusRef.current = null;
29
+ };
30
+ }, [open]);
31
+ if (!open || typeof document === 'undefined')
32
+ return null;
33
+ const backdropCls = ['xfc-dialog-backdrop', backdropClassName].filter(Boolean).join(' ');
34
+ const panelCls = ['xfc-dialog-panel', panelClassName, className].filter(Boolean).join(' ');
35
+ return (0, react_dom_1.createPortal)((0, jsx_runtime_1.jsx)("div", { className: backdropCls, role: "presentation", onMouseDown: (e) => {
36
+ if (e.target === e.currentTarget && closeOnBackdropClick)
37
+ requestClose();
38
+ }, children: (0, jsx_runtime_1.jsxs)("div", { ref: panelRef, ...panelRest, className: panelCls, role: "dialog", "aria-modal": "true", "aria-labelledby": title ? titleId : undefined, "aria-describedby": description ? descriptionId : undefined, tabIndex: -1, onMouseDown: (e) => {
39
+ onPanelMouseDown?.(e);
40
+ e.stopPropagation();
41
+ }, children: [title ? ((0, jsx_runtime_1.jsx)("div", { id: titleId, className: "xfc-dialog-panel__title", children: title })) : null, description ? ((0, jsx_runtime_1.jsx)("div", { id: descriptionId, className: "xfc-dialog-panel__description", children: description })) : null, (0, jsx_runtime_1.jsx)("div", { className: "xfc-dialog-panel__body", children: children })] }) }), document.body);
42
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * 오버레이·다이얼로그 — atoms 위 레벨. `base.css` 의 `.xfc-dialog-*` / `.xfc-bottom-sheet-*` 와 짝.
3
+ * 패키지 루트 또는 `@xfilecom/front-core/overlays`.
4
+ */
5
+ export { BottomSheet, type BottomSheetProps } from './BottomSheet';
6
+ export { ConfirmDialog, type ConfirmDialogProps } from './ConfirmDialog';
7
+ export { Dialog, type DialogProps } from './Dialog';
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Dialog = exports.ConfirmDialog = exports.BottomSheet = void 0;
4
+ /**
5
+ * 오버레이·다이얼로그 — atoms 위 레벨. `base.css` 의 `.xfc-dialog-*` / `.xfc-bottom-sheet-*` 와 짝.
6
+ * 패키지 루트 또는 `@xfilecom/front-core/overlays`.
7
+ */
8
+ var BottomSheet_1 = require("./BottomSheet");
9
+ Object.defineProperty(exports, "BottomSheet", { enumerable: true, get: function () { return BottomSheet_1.BottomSheet; } });
10
+ var ConfirmDialog_1 = require("./ConfirmDialog");
11
+ Object.defineProperty(exports, "ConfirmDialog", { enumerable: true, get: function () { return ConfirmDialog_1.ConfirmDialog; } });
12
+ var Dialog_1 = require("./Dialog");
13
+ Object.defineProperty(exports, "Dialog", { enumerable: true, get: function () { return Dialog_1.Dialog; } });
@@ -0,0 +1,2 @@
1
+ export declare function useBodyScrollLock(active: boolean): void;
2
+ export declare function useEscapeKey(active: boolean, onEscape: () => void): void;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useBodyScrollLock = useBodyScrollLock;
4
+ exports.useEscapeKey = useEscapeKey;
5
+ const react_1 = require("react");
6
+ function useBodyScrollLock(active) {
7
+ (0, react_1.useEffect)(() => {
8
+ if (!active || typeof document === 'undefined')
9
+ return;
10
+ const { body } = document;
11
+ const prev = body.style.overflow;
12
+ body.style.overflow = 'hidden';
13
+ return () => {
14
+ body.style.overflow = prev;
15
+ };
16
+ }, [active]);
17
+ }
18
+ function useEscapeKey(active, onEscape) {
19
+ (0, react_1.useEffect)(() => {
20
+ if (!active || typeof document === 'undefined')
21
+ return;
22
+ const onKey = (e) => {
23
+ if (e.key === 'Escape')
24
+ onEscape();
25
+ };
26
+ document.addEventListener('keydown', onKey);
27
+ return () => document.removeEventListener('keydown', onKey);
28
+ }, [active, onEscape]);
29
+ }
package/dist/index.d.ts CHANGED
@@ -7,7 +7,7 @@
7
7
  * import '<shared>/styles/xfc-theme.css'; // :root + .xfc-* (base 이후, 선택)
8
8
  * import '<shared>/styles/app.css'; // 레이아웃 + 추가 오버라이드
9
9
  *
10
- * React atoms: 패키지 루트 또는 `@xfilecom/front-core/atoms`.
10
+ * React: atoms `@xfilecom/front-core/atoms`, 오버레이 `@xfilecom/front-core/overlays` 또는 루트 export.
11
11
  */
12
12
  export declare const XFRAME_FRONT_CORE_VERSION = "0.2.4";
13
13
  /** CSS 커스텀 프로퍼티 이름 (-- 제외 시 var()와 함께 사용) */
@@ -43,4 +43,4 @@ export declare const tokenVars: {
43
43
  readonly toastWarnBg: "--xfc-toast-warn-bg";
44
44
  readonly toastErrorBg: "--xfc-toast-error-bg";
45
45
  };
46
- export { Badge, Box, Button, Card, InlineErrorList, Input, LoadingOverlay, Stack, Text, Toast, ToastList, ToastSeverityIcon, type BadgeProps, type BoxProps, type ButtonProps, type CardProps, type InlineErrorEntry, type InlineErrorListProps, type InputProps, type LoadingOverlayProps, type StackProps, type TextProps, type TextVariant, type ToastEntry, type ToastListProps, type ToastProps, type ToastSeverity, } from './components';
46
+ export { Badge, BottomSheet, Box, Button, Card, ConfirmDialog, Dialog, InlineErrorList, Input, LoadingOverlay, Stack, Text, Toast, ToastList, ToastSeverityIcon, type BadgeProps, type BottomSheetProps, type BoxProps, type ButtonProps, type CardProps, type ConfirmDialogProps, type DialogProps, type InlineErrorEntry, type InlineErrorListProps, type InputProps, type LoadingOverlayProps, type StackProps, type TextProps, type TextVariant, type ToastEntry, type ToastListProps, type ToastProps, type ToastSeverity, } from './components';
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ToastSeverityIcon = exports.ToastList = exports.Toast = exports.Text = exports.Stack = exports.LoadingOverlay = exports.Input = exports.InlineErrorList = exports.Card = exports.Button = exports.Box = exports.Badge = exports.tokenVars = exports.XFRAME_FRONT_CORE_VERSION = void 0;
3
+ exports.ToastSeverityIcon = exports.ToastList = exports.Toast = exports.Text = exports.Stack = exports.LoadingOverlay = exports.Input = exports.InlineErrorList = exports.Dialog = exports.ConfirmDialog = exports.Card = exports.Button = exports.Box = exports.BottomSheet = exports.Badge = exports.tokenVars = exports.XFRAME_FRONT_CORE_VERSION = void 0;
4
4
  /**
5
5
  * @xfilecom/front-core — design tokens + atomic React components (browser-only).
6
6
  *
@@ -10,7 +10,7 @@ exports.ToastSeverityIcon = exports.ToastList = exports.Toast = exports.Text = e
10
10
  * import '<shared>/styles/xfc-theme.css'; // :root + .xfc-* (base 이후, 선택)
11
11
  * import '<shared>/styles/app.css'; // 레이아웃 + 추가 오버라이드
12
12
  *
13
- * React atoms: 패키지 루트 또는 `@xfilecom/front-core/atoms`.
13
+ * React: atoms `@xfilecom/front-core/atoms`, 오버레이 `@xfilecom/front-core/overlays` 또는 루트 export.
14
14
  */
15
15
  exports.XFRAME_FRONT_CORE_VERSION = '0.2.4';
16
16
  /** CSS 커스텀 프로퍼티 이름 (-- 제외 시 var()와 함께 사용) */
@@ -48,9 +48,12 @@ exports.tokenVars = {
48
48
  };
49
49
  var components_1 = require("./components");
50
50
  Object.defineProperty(exports, "Badge", { enumerable: true, get: function () { return components_1.Badge; } });
51
+ Object.defineProperty(exports, "BottomSheet", { enumerable: true, get: function () { return components_1.BottomSheet; } });
51
52
  Object.defineProperty(exports, "Box", { enumerable: true, get: function () { return components_1.Box; } });
52
53
  Object.defineProperty(exports, "Button", { enumerable: true, get: function () { return components_1.Button; } });
53
54
  Object.defineProperty(exports, "Card", { enumerable: true, get: function () { return components_1.Card; } });
55
+ Object.defineProperty(exports, "ConfirmDialog", { enumerable: true, get: function () { return components_1.ConfirmDialog; } });
56
+ Object.defineProperty(exports, "Dialog", { enumerable: true, get: function () { return components_1.Dialog; } });
54
57
  Object.defineProperty(exports, "InlineErrorList", { enumerable: true, get: function () { return components_1.InlineErrorList; } });
55
58
  Object.defineProperty(exports, "Input", { enumerable: true, get: function () { return components_1.Input; } });
56
59
  Object.defineProperty(exports, "LoadingOverlay", { enumerable: true, get: function () { return components_1.LoadingOverlay; } });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xfilecom/front-core",
3
- "version": "0.2.14",
3
+ "version": "0.2.15",
4
4
  "description": "Shared design tokens, base CSS, and atomic React components (browser-only; no Nest dependency)",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -14,6 +14,10 @@
14
14
  "./atoms": {
15
15
  "types": "./dist/components/atoms/index.d.ts",
16
16
  "default": "./dist/components/atoms/index.js"
17
+ },
18
+ "./overlays": {
19
+ "types": "./dist/components/overlays/index.d.ts",
20
+ "default": "./dist/components/overlays/index.js"
17
21
  }
18
22
  },
19
23
  "files": [
@@ -39,6 +43,7 @@
39
43
  },
40
44
  "devDependencies": {
41
45
  "@types/react": "^18.2.0",
46
+ "@types/react-dom": "^18.2.0",
42
47
  "typescript": "^5.0.0"
43
48
  },
44
49
  "publishConfig": {