@metropolle/design-system 1.0.0-beta.2025.8.29.1558.9969927 → 1.0.0-beta.2025.8.31.141.06ee0f3

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.
@@ -42,6 +42,150 @@
42
42
  width: 100%;
43
43
  }
44
44
 
45
+ /* =========================
46
+ Modal Styles
47
+ ========================= */
48
+
49
+ /* Modal overlay styles */
50
+ .mds-modal-overlay,
51
+ .modal-overlay {
52
+ position: fixed !important;
53
+ top: 0 !important;
54
+ left: 0 !important;
55
+ right: 0 !important;
56
+ bottom: 0 !important;
57
+ background-color: transparent !important;
58
+ backdrop-filter: blur(4px) !important;
59
+ z-index: 9999 !important;
60
+ display: flex !important;
61
+ align-items: center !important;
62
+ justify-content: center !important;
63
+ }
64
+
65
+ /* Modal card styles - Liquid Glass Effect */
66
+ .mds-modal-overlay .mds-modal-card,
67
+ .modal-overlay .mds-modal-card {
68
+ background: rgba(255, 255, 255, 0.3) !important;
69
+ backdrop-filter: blur(20px) !important;
70
+ -webkit-backdrop-filter: blur(20px) !important;
71
+ border: 1px solid rgba(255, 255, 255, 0.4) !important;
72
+ box-shadow:
73
+ 0 8px 32px rgba(0, 0, 0, 0.2) !important,
74
+ 0 0 0 1px rgba(255, 255, 255, 0.2) !important,
75
+ inset 0 1px 0 rgba(255, 255, 255, 0.4) !important;
76
+ color: var(--text-primary) !important;
77
+ min-width: 320px !important;
78
+ max-width: 600px !important;
79
+ width: 90vw !important;
80
+ border-radius: 16px !important;
81
+ position: relative !important;
82
+ overflow: hidden !important;
83
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important;
84
+ transform: translate(0, 0) !important;
85
+ }
86
+
87
+ /* Inner glow effect */
88
+ .mds-modal-overlay .mds-modal-card::before,
89
+ .modal-overlay .mds-modal-card::before {
90
+ content: '' !important;
91
+ position: absolute !important;
92
+ top: 0 !important;
93
+ left: 0 !important;
94
+ right: 0 !important;
95
+ bottom: 0 !important;
96
+ background: linear-gradient(
97
+ 135deg,
98
+ rgba(255, 255, 255, 0.1) 0%,
99
+ rgba(255, 255, 255, 0.05) 50%,
100
+ rgba(255, 255, 255, 0.02) 100%
101
+ ) !important;
102
+ border-radius: 16px !important;
103
+ pointer-events: none !important;
104
+ z-index: -1 !important;
105
+ }
106
+
107
+ /* Border glow */
108
+ .mds-modal-overlay .mds-modal-card::after,
109
+ .modal-overlay .mds-modal-card::after {
110
+ content: '' !important;
111
+ position: absolute !important;
112
+ top: -1px !important;
113
+ left: -1px !important;
114
+ right: -1px !important;
115
+ bottom: -1px !important;
116
+ background: linear-gradient(
117
+ 45deg,
118
+ rgba(255, 255, 255, 0.3),
119
+ rgba(255, 255, 255, 0.1),
120
+ rgba(255, 255, 255, 0.05),
121
+ rgba(255, 255, 255, 0.1),
122
+ rgba(255, 255, 255, 0.3)
123
+ ) !important;
124
+ border-radius: 16px !important;
125
+ z-index: -2 !important;
126
+ opacity: 0.6 !important;
127
+ animation: mdsLiquidBorder 3s ease-in-out infinite !important;
128
+ }
129
+
130
+ @keyframes mdsLiquidBorder {
131
+ 0%, 100% { opacity: 0.6; transform: scale(1); }
132
+ 50% { opacity: 0.8; transform: scale(1.02); }
133
+ }
134
+
135
+ /* No hover lift or color change */
136
+ .mds-modal-overlay .mds-modal-card,
137
+ .mds-modal-overlay .mds-modal-card:hover,
138
+ .modal-overlay .mds-modal-card,
139
+ .modal-overlay .mds-modal-card:hover {
140
+ transform: none !important;
141
+ }
142
+ .mds-modal-overlay .mds-modal-card:hover::after,
143
+ .modal-overlay .mds-modal-card:hover::after {
144
+ opacity: 0.6 !important;
145
+ animation-duration: 3s !important;
146
+ }
147
+
148
+ /* Light theme */
149
+ html[data-theme="light"] .mds-modal-overlay .mds-modal-card,
150
+ html[data-theme="light"] .modal-overlay .mds-modal-card {
151
+ background: rgba(255, 255, 255, 0.35) !important;
152
+ border: 1px solid rgba(255, 255, 255, 0.5) !important;
153
+ box-shadow:
154
+ 0 8px 32px rgba(0, 0, 0, 0.15) !important,
155
+ 0 0 0 1px rgba(255, 255, 255, 0.3) !important,
156
+ inset 0 1px 0 rgba(255, 255, 255, 0.5) !important;
157
+ }
158
+
159
+ /* Dark theme */
160
+ html[data-theme="dark"] .mds-modal-overlay .mds-modal-card,
161
+ html:not([data-theme]) .mds-modal-overlay .mds-modal-card,
162
+ html[data-theme="dark"] .modal-overlay .mds-modal-card,
163
+ html:not([data-theme]) .modal-overlay .mds-modal-card {
164
+ background: rgba(30, 41, 59, 0.5) !important;
165
+ border: 1px solid rgba(255, 255, 255, 0.35) !important;
166
+ box-shadow:
167
+ 0 8px 32px rgba(0, 0, 0, 0.5) !important,
168
+ 0 0 0 1px rgba(255, 255, 255, 0.25) !important,
169
+ inset 0 1px 0 rgba(255, 255, 255, 0.3) !important;
170
+ }
171
+
172
+ /* Header button sizing + alignment */
173
+ .mds-modal-header > button[aria-label="Fechar"] {
174
+ font-size: 1rem !important;
175
+ line-height: 1 !important;
176
+ padding: 4px 8px !important;
177
+ }
178
+
179
+ /* Responsive modal */
180
+ @media (max-width: 768px) {
181
+ .mds-modal-overlay .mds-modal-card,
182
+ .modal-overlay .mds-modal-card {
183
+ min-width: 90vw !important;
184
+ max-width: 95vw !important;
185
+ margin: 20px !important;
186
+ }
187
+ }
188
+
45
189
  /* Button Sizes */
46
190
  .mds-button--sm {
47
191
  padding: var(--mds-spacing-sm) var(--mds-spacing-md);
@@ -749,24 +893,23 @@ html[data-theme="light"] .mds-page-header {
749
893
  right: 0;
750
894
  height: 60px;
751
895
  z-index: 1000;
752
- padding: 0 var(--mds-spacing-xl);
753
- backdrop-filter: blur(20px);
754
- -webkit-backdrop-filter: blur(20px);
755
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
896
+ backdrop-filter: blur(10px);
897
+ -webkit-backdrop-filter: blur(10px);
898
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
756
899
  transition: all 0.3s ease;
900
+ font-family: var(--mds-typography-fontFamily-brand);
757
901
  }
758
902
 
759
903
  /* Dark theme navbar */
760
904
  html[data-theme="dark"] .mds-navbar {
761
- background: rgba(255, 255, 255, 0.1);
905
+ background-color: rgba(30, 41, 59, 0.95);
762
906
  border-bottom: 1px solid rgba(255, 255, 255, 0.1);
763
907
  }
764
908
 
765
909
  /* Light theme navbar */
766
910
  html[data-theme="light"] .mds-navbar {
767
- background: rgba(255, 255, 255, 0.8);
911
+ background-color: rgba(255, 255, 255, 0.95);
768
912
  border-bottom: 1px solid rgba(0, 0, 0, 0.1);
769
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
770
913
  }
771
914
 
772
915
  /* Navbar content container */
@@ -856,4 +999,4 @@ html[data-theme="light"] .mds-navbar-user-badge {
856
999
  /* Dark mode support (future) */
857
1000
  @media (prefers-color-scheme: dark) {
858
1001
  /* Enhanced styles for dark mode when implemented */
859
- }
1002
+ }
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ export interface ConfirmDialogProps {
3
+ open: boolean;
4
+ onClose: () => void;
5
+ title: string;
6
+ description?: React.ReactNode;
7
+ confirmText?: string;
8
+ cancelText?: string;
9
+ onConfirm: () => void | Promise<void>;
10
+ loading?: boolean;
11
+ tone?: 'warning' | 'danger' | 'info' | 'success';
12
+ icon?: React.ReactNode;
13
+ disableOverlayClose?: boolean;
14
+ }
15
+ export declare function ConfirmDialog({ open, onClose, title, description, confirmText, cancelText, onConfirm, loading, tone, icon, disableOverlayClose }: ConfirmDialogProps): import("react/jsx-runtime").JSX.Element;
16
+ export default ConfirmDialog;
17
+ //# sourceMappingURL=ConfirmDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfirmDialog.d.ts","sourceRoot":"","sources":["../../../../../src/components/react/Modal/ConfirmDialog.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;IACjD,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AASD,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,OAAO,EACP,KAAK,EACL,WAAW,EACX,WAAyB,EACzB,UAAuB,EACvB,SAAS,EACT,OAAe,EACf,IAAgB,EAChB,IAAI,EACJ,mBAAmB,EACpB,EAAE,kBAAkB,2CA0BpB;AAED,eAAe,aAAa,CAAC"}
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ export interface ModalProps {
3
+ open: boolean;
4
+ onClose: () => void;
5
+ closeOnOverlay?: boolean;
6
+ children: React.ReactNode;
7
+ className?: string;
8
+ style?: React.CSSProperties;
9
+ }
10
+ export declare function Modal({ open, onClose, closeOnOverlay, children, className, style }: ModalProps): React.ReactPortal | null;
11
+ export default Modal;
12
+ //# sourceMappingURL=Modal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../../../../src/components/react/Modal/Modal.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAG3D,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED,wBAAgB,KAAK,CAAC,EACpB,IAAI,EACJ,OAAO,EACP,cAAqB,EACrB,QAAQ,EACR,SAAS,EACT,KAAK,EACN,EAAE,UAAU,4BAyEZ;AAED,eAAe,KAAK,CAAC"}
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ export interface ModalBodyProps {
3
+ children: React.ReactNode;
4
+ style?: React.CSSProperties;
5
+ className?: string;
6
+ }
7
+ export declare function ModalBody({ children, style, className }: ModalBodyProps): import("react/jsx-runtime").JSX.Element;
8
+ export default ModalBody;
9
+ //# sourceMappingURL=ModalBody.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModalBody.d.ts","sourceRoot":"","sources":["../../../../../src/components/react/Modal/ModalBody.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,cAAc,2CAMvE;AAED,eAAe,SAAS,CAAC"}
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ export interface ModalFooterProps {
3
+ children: React.ReactNode;
4
+ align?: 'start' | 'center' | 'end';
5
+ }
6
+ export declare function ModalFooter({ children, align }: ModalFooterProps): import("react/jsx-runtime").JSX.Element;
7
+ export default ModalFooter;
8
+ //# sourceMappingURL=ModalFooter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModalFooter.d.ts","sourceRoot":"","sources":["../../../../../src/components/react/Modal/ModalFooter.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;CACpC;AAED,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,KAAa,EAAE,EAAE,gBAAgB,2CAOxE;AAED,eAAe,WAAW,CAAC"}
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ export interface ModalHeaderProps {
3
+ title: React.ReactNode;
4
+ icon?: React.ReactNode;
5
+ onClose?: () => void;
6
+ closeAriaLabel?: string;
7
+ align?: 'center' | 'start';
8
+ }
9
+ export declare function ModalHeader({ title, icon, onClose, closeAriaLabel, align }: ModalHeaderProps): import("react/jsx-runtime").JSX.Element;
10
+ export default ModalHeader;
11
+ //# sourceMappingURL=ModalHeader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModalHeader.d.ts","sourceRoot":"","sources":["../../../../../src/components/react/Modal/ModalHeader.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;CAC5B;AAED,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,cAAyB,EAAE,KAAgB,EAAE,EAAE,gBAAgB,2CAsDlH;AAED,eAAe,WAAW,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from './Modal';
2
+ export * from './ModalHeader';
3
+ export * from './ModalBody';
4
+ export * from './ModalFooter';
5
+ export * from './ConfirmDialog';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/react/Modal/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC"}
@@ -5,4 +5,9 @@ export { cn } from '../../utils/cn';
5
5
  export * from './GlassCard';
6
6
  export * from './Typography';
7
7
  export * from './Button';
8
+ export * from './Modal/Modal';
9
+ export * from './Modal/ModalHeader';
10
+ export * from './Modal/ModalBody';
11
+ export * from './Modal/ModalFooter';
12
+ export * from './Modal/ConfirmDialog';
8
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/react/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EACL,UAAU,EACV,SAAS,EACT,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAGpD,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAGpC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/react/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EACL,UAAU,EACV,SAAS,EACT,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAGpD,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAGpC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC"}
@@ -5,4 +5,9 @@ export { cn } from '../../utils/cn';
5
5
  export * from './GlassCard';
6
6
  export * from './Typography';
7
7
  export * from './Button';
8
+ export * from './Modal/Modal';
9
+ export * from './Modal/ModalHeader';
10
+ export * from './Modal/ModalBody';
11
+ export * from './Modal/ModalFooter';
12
+ export * from './Modal/ConfirmDialog';
8
13
  //# sourceMappingURL=index.d.ts.map
@@ -1,4 +1,5 @@
1
- import require$$0, { forwardRef } from 'react';
1
+ import require$$0, { forwardRef, useState, useRef, useEffect } from 'react';
2
+ import { createPortal } from 'react-dom';
2
3
 
3
4
  var jsxRuntime = {exports: {}};
4
5
 
@@ -1489,5 +1490,86 @@ Button.displayName = 'Button';
1489
1490
  */
1490
1491
  const LoadingSpinner = () => (jsxRuntimeExports.jsxs("svg", { className: "mds-spinner", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", children: [jsxRuntimeExports.jsx("circle", { className: "mds-spinner__track", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "2", fill: "none", opacity: "0.25" }), jsxRuntimeExports.jsx("circle", { className: "mds-spinner__path", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "2", fill: "none", strokeDasharray: "40 20", strokeLinecap: "round" })] }));
1491
1492
 
1492
- export { BrandLogo, Button, GlassCard, Typography, cn };
1493
+ function Modal({ open, onClose, closeOnOverlay = true, children, className, style }) {
1494
+ const [mounted, setMounted] = useState(false);
1495
+ const [visible, setVisible] = useState(false);
1496
+ const [renderPortal, setRenderPortal] = useState(false);
1497
+ const containerRef = useRef(null);
1498
+ useEffect(() => setMounted(true), []);
1499
+ useEffect(() => {
1500
+ if (!mounted)
1501
+ return;
1502
+ if (open) {
1503
+ setVisible(true);
1504
+ setRenderPortal(true);
1505
+ }
1506
+ else {
1507
+ setVisible(false);
1508
+ const t = setTimeout(() => setRenderPortal(false), 200);
1509
+ return () => clearTimeout(t);
1510
+ }
1511
+ }, [open, mounted]);
1512
+ useEffect(() => {
1513
+ if (!open)
1514
+ return;
1515
+ const onKeyDown = (e) => {
1516
+ if (e.key === 'Escape')
1517
+ onClose();
1518
+ };
1519
+ document.addEventListener('keydown', onKeyDown);
1520
+ return () => document.removeEventListener('keydown', onKeyDown);
1521
+ }, [open, onClose]);
1522
+ if (!mounted || (!renderPortal && !open))
1523
+ return null;
1524
+ const overlayStyle = {
1525
+ position: 'fixed',
1526
+ inset: 0,
1527
+ backgroundColor: 'rgba(0, 0, 0, 0.7)',
1528
+ display: 'flex',
1529
+ alignItems: 'center',
1530
+ justifyContent: 'center',
1531
+ zIndex: 1000,
1532
+ padding: '16px',
1533
+ opacity: visible ? 1 : 0,
1534
+ transition: 'opacity 200ms ease'
1535
+ };
1536
+ const innerStyle = {
1537
+ maxWidth: '640px',
1538
+ width: '100%',
1539
+ transform: visible ? 'scale(1)' : 'scale(0.98)',
1540
+ opacity: visible ? 1 : 0,
1541
+ transition: 'opacity 200ms ease, transform 200ms ease',
1542
+ ...style
1543
+ };
1544
+ const content = (jsxRuntimeExports.jsx("div", { className: "modal-overlay mds-modal-overlay", style: overlayStyle, onClick: closeOnOverlay ? onClose : undefined, "aria-modal": "true", role: "dialog", children: jsxRuntimeExports.jsx("div", { className: className, style: innerStyle, onClick: (e) => e.stopPropagation(), ref: (el) => (containerRef.current = el), children: children }) }));
1545
+ return createPortal(content, document.body);
1546
+ }
1547
+
1548
+ function ModalHeader({ title, icon, onClose, closeAriaLabel = 'Fechar', align = 'center' }) {
1549
+ if (align === 'center') {
1550
+ return (jsxRuntimeExports.jsxs("div", { className: "mds-modal-header", style: { position: 'relative', paddingBottom: 12, marginBottom: 16, borderBottom: '1px solid var(--border-color)' }, children: [icon && (jsxRuntimeExports.jsx("div", { "aria-hidden": true, style: { position: 'absolute', left: 12, top: '50%', transform: 'translateY(-50%)', fontSize: '1.25rem', lineHeight: 1 }, children: icon })), jsxRuntimeExports.jsx("div", { style: { textAlign: 'center' }, children: typeof title === 'string' ? (jsxRuntimeExports.jsx("h3", { style: { margin: 0 }, children: title })) : (title) }), onClose && (jsxRuntimeExports.jsx("button", { type: "button", "aria-label": closeAriaLabel, onClick: onClose, style: { position: 'absolute', right: 12, top: '50%', transform: 'translateY(-50%)', background: 'transparent', border: 'none', padding: '4px 8px', cursor: 'pointer', lineHeight: 1 }, children: "\u00D7" }))] }));
1551
+ }
1552
+ return (jsxRuntimeExports.jsxs("div", { className: "mds-modal-header", style: { display: 'flex', alignItems: 'center', gap: 12, paddingBottom: 12, marginBottom: 16, borderBottom: '1px solid var(--border-color)' }, children: [icon && (jsxRuntimeExports.jsx("div", { "aria-hidden": true, style: { fontSize: '1.25rem', lineHeight: 1 }, children: icon })), jsxRuntimeExports.jsx("div", { style: { margin: 0, fontSize: '1.125rem', fontWeight: 600, flex: 1 }, children: typeof title === 'string' ? (jsxRuntimeExports.jsx("h3", { style: { margin: 0 }, children: title })) : (title) }), onClose && (jsxRuntimeExports.jsx("button", { type: "button", "aria-label": closeAriaLabel, onClick: onClose, style: { marginLeft: 'auto', background: 'transparent', border: 'none', padding: '4px 8px', cursor: 'pointer', lineHeight: 1 }, children: "\u00D7" }))] }));
1553
+ }
1554
+
1555
+ function ModalBody({ children, style, className }) {
1556
+ return (jsxRuntimeExports.jsx("div", { className: className, style: { padding: '16px 24px', ...style }, children: children }));
1557
+ }
1558
+
1559
+ function ModalFooter({ children, align = 'end' }) {
1560
+ const justify = align === 'start' ? 'flex-start' : align === 'center' ? 'center' : 'flex-end';
1561
+ return (jsxRuntimeExports.jsx("div", { style: { display: 'flex', gap: 12, justifyContent: justify, borderTop: '1px solid var(--border-color)', padding: '16px 24px', marginTop: 8 }, children: children }));
1562
+ }
1563
+
1564
+ const toneIcon = {
1565
+ warning: '⚠️',
1566
+ danger: '🛑',
1567
+ info: 'ℹ️',
1568
+ success: '✅'
1569
+ };
1570
+ function ConfirmDialog({ open, onClose, title, description, confirmText = 'Confirmar', cancelText = 'Cancelar', onConfirm, loading = false, tone = 'warning', icon, disableOverlayClose }) {
1571
+ return (jsxRuntimeExports.jsx(Modal, { open: open, onClose: onClose, closeOnOverlay: !disableOverlayClose, children: jsxRuntimeExports.jsxs("div", { className: "mds-modal-card", style: { maxWidth: 480, width: '100%' }, children: [jsxRuntimeExports.jsx(ModalHeader, { title: title, icon: icon ?? toneIcon[tone], onClose: onClose, align: "center" }), description && (jsxRuntimeExports.jsx("div", { style: { padding: '0 24px 16px 24px' }, children: description })), jsxRuntimeExports.jsxs("div", { style: { display: 'flex', gap: 12, justifyContent: 'flex-end', borderTop: '1px solid var(--border-color)', padding: '16px 24px', marginTop: 8 }, children: [jsxRuntimeExports.jsx("button", { type: "button", onClick: onClose, className: "mds-button mds-button--secondary", children: cancelText }), jsxRuntimeExports.jsx("button", { type: "button", onClick: onConfirm, disabled: loading, className: "mds-button mds-button--primary", children: loading ? 'Processando...' : confirmText })] })] }) }));
1572
+ }
1573
+
1574
+ export { BrandLogo, Button, ConfirmDialog, GlassCard, Modal, ModalBody, ModalFooter, ModalHeader, Typography, cn };
1493
1575
  //# sourceMappingURL=index.esm.js.map