@metropolle/design-system 1.2026.0-1.1.1728 → 1.2026.0-1.13.2314

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 (50) hide show
  1. package/dist/css/compat/back.css +12 -0
  2. package/dist/css/components.css +2181 -2
  3. package/dist/react/components/react/Button/Button.d.ts +1 -1
  4. package/dist/react/components/react/Button/Button.d.ts.map +1 -1
  5. package/dist/react/components/react/DataTable/DataTable.d.ts.map +1 -1
  6. package/dist/react/components/react/DataTable/TableHeader.d.ts.map +1 -1
  7. package/dist/react/components/react/DataTable/TableRow.d.ts.map +1 -1
  8. package/dist/react/components/react/DataTable/types.d.ts +2 -1
  9. package/dist/react/components/react/DataTable/types.d.ts.map +1 -1
  10. package/dist/react/components/react/DetailModal/DetailModal.d.ts +55 -0
  11. package/dist/react/components/react/DetailModal/DetailModal.d.ts.map +1 -0
  12. package/dist/react/components/react/DetailModal/index.d.ts +3 -0
  13. package/dist/react/components/react/DetailModal/index.d.ts.map +1 -0
  14. package/dist/react/components/react/FormField/FormField.d.ts +26 -0
  15. package/dist/react/components/react/FormField/FormField.d.ts.map +1 -0
  16. package/dist/react/components/react/FormField/index.d.ts +3 -0
  17. package/dist/react/components/react/FormField/index.d.ts.map +1 -0
  18. package/dist/react/components/react/FormGrid/FormGrid.d.ts +20 -0
  19. package/dist/react/components/react/FormGrid/FormGrid.d.ts.map +1 -0
  20. package/dist/react/components/react/FormGrid/index.d.ts +3 -0
  21. package/dist/react/components/react/FormGrid/index.d.ts.map +1 -0
  22. package/dist/react/components/react/FormModal/FormModal.d.ts +58 -0
  23. package/dist/react/components/react/FormModal/FormModal.d.ts.map +1 -0
  24. package/dist/react/components/react/FormModal/index.d.ts +3 -0
  25. package/dist/react/components/react/FormModal/index.d.ts.map +1 -0
  26. package/dist/react/components/react/FormSection/FormSection.d.ts +20 -0
  27. package/dist/react/components/react/FormSection/FormSection.d.ts.map +1 -0
  28. package/dist/react/components/react/FormSection/index.d.ts +3 -0
  29. package/dist/react/components/react/FormSection/index.d.ts.map +1 -0
  30. package/dist/react/components/react/GlassCard/GlassCard.d.ts +10 -0
  31. package/dist/react/components/react/GlassCard/GlassCard.d.ts.map +1 -1
  32. package/dist/react/components/react/GlassCard/index.d.ts +1 -1
  33. package/dist/react/components/react/GlassCard/index.d.ts.map +1 -1
  34. package/dist/react/components/react/InfoBox/InfoBox.d.ts +46 -0
  35. package/dist/react/components/react/InfoBox/InfoBox.d.ts.map +1 -0
  36. package/dist/react/components/react/InfoBox/index.d.ts +3 -0
  37. package/dist/react/components/react/InfoBox/index.d.ts.map +1 -0
  38. package/dist/react/components/react/Modal/ModalHeader.d.ts.map +1 -1
  39. package/dist/react/components/react/ProfileCard/ProfileCard.d.ts +55 -0
  40. package/dist/react/components/react/ProfileCard/ProfileCard.d.ts.map +1 -0
  41. package/dist/react/components/react/ProfileCard/index.d.ts +3 -0
  42. package/dist/react/components/react/ProfileCard/index.d.ts.map +1 -0
  43. package/dist/react/components/react/index.d.ts +14 -0
  44. package/dist/react/components/react/index.d.ts.map +1 -1
  45. package/dist/react/index.d.ts +32 -18
  46. package/dist/react/index.esm.js +485 -38
  47. package/dist/react/index.esm.js.map +1 -1
  48. package/dist/react/index.js +492 -37
  49. package/dist/react/index.js.map +1 -1
  50. package/package.json +2 -1
@@ -1385,14 +1385,26 @@ function cn(...classes) {
1385
1385
  * </GlassCard>
1386
1386
  * ```
1387
1387
  */
1388
- const GlassCard = forwardRef(({ glassStyle = 'liquid', intensity = 'md', theme, variant = 'light', blur, opacity, children, className, enableHover = true, style, ...props }, ref) => {
1388
+ const GlassCard = forwardRef(({ glassStyle = 'liquid', intensity = 'md', theme, variant = 'light', blur, opacity, children, className, enableHover = true, cardVariant = 'default', style, ...props }, ref) => {
1389
1389
  // Resolve theme from new prop or deprecated variant
1390
1390
  const resolvedTheme = theme ?? variant;
1391
1391
  // =====================
1392
1392
  // LIQUID GLASS MODE
1393
1393
  // =====================
1394
1394
  if (glassStyle === 'liquid') {
1395
- return (jsxRuntimeExports.jsx("div", { ref: ref, className: cn('mds-liquid-glass', `mds-liquid-glass--${intensity}`, !enableHover && 'mds-liquid-glass--no-hover', className), style: style, ...props, children: children }));
1395
+ // PROC-007: Card variant styles
1396
+ const variantStyles = {
1397
+ default: {},
1398
+ highlight: {
1399
+ borderLeft: '4px solid var(--mds-color-brand-primary, #0055FF)',
1400
+ boxShadow: '0 4px 20px rgba(0, 85, 255, 0.15)'
1401
+ },
1402
+ subtle: {
1403
+ background: 'rgba(255, 255, 255, 0.02)',
1404
+ border: '1px solid rgba(255, 255, 255, 0.05)'
1405
+ }
1406
+ };
1407
+ return (jsxRuntimeExports.jsx("div", { ref: ref, className: cn('mds-liquid-glass', `mds-liquid-glass--${intensity}`, `mds-liquid-glass--${cardVariant}`, !enableHover && 'mds-liquid-glass--no-hover', className), style: { ...variantStyles[cardVariant], ...style }, ...props, children: children }));
1396
1408
  }
1397
1409
  // =====================
1398
1410
  // GLASS MODE (legacy)
@@ -1456,6 +1468,133 @@ const GlassCard = forwardRef(({ glassStyle = 'liquid', intensity = 'md', theme,
1456
1468
  });
1457
1469
  GlassCard.displayName = 'GlassCard';
1458
1470
 
1471
+ // Default placeholder avatar - adapts to theme with high transparency
1472
+ const getPlaceholderAvatar = (isDark) => {
1473
+ const bgColor = isDark ? 'rgba(26, 26, 46, 0.15)' : 'rgba(255, 255, 255, 0.1)';
1474
+ const fgColor = isDark ? 'rgba(255, 255, 255, 0.08)' : 'rgba(0, 0, 0, 0.06)';
1475
+ return 'data:image/svg+xml,' + encodeURIComponent(`
1476
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200" fill="none">
1477
+ <rect width="200" height="200" fill="${bgColor}"/>
1478
+ <circle cx="100" cy="80" r="40" fill="${fgColor}"/>
1479
+ <ellipse cx="100" cy="180" rx="60" ry="50" fill="${fgColor}"/>
1480
+ </svg>
1481
+ `);
1482
+ };
1483
+ // =============================================================================
1484
+ // Icons
1485
+ // =============================================================================
1486
+ const Icons = {
1487
+ shield: (jsxRuntimeExports.jsx("svg", { viewBox: "0 0 24 24", children: jsxRuntimeExports.jsx("path", { d: "M12 1L3 5v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V5l-9-4zm-2 16l-4-4 1.41-1.41L10 14.17l6.59-6.59L18 9l-8 8z", fill: "currentColor" }) })),
1488
+ plus: (jsxRuntimeExports.jsx("svg", { viewBox: "0 0 24 24", children: jsxRuntimeExports.jsx("path", { d: "M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z", fill: "currentColor" }) })),
1489
+ instagram: jsxRuntimeExports.jsx("path", { d: "M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zM12 0C8.741 0 8.333.014 7.053.072 2.695.272.273 2.69.073 7.052.014 8.333 0 8.741 0 12c0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98C8.333 23.986 8.741 24 12 24c3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98C15.668.014 15.259 0 12 0zm0 5.838a6.162 6.162 0 100 12.324 6.162 6.162 0 000-12.324zM12 16a4 4 0 110-8 4 4 0 010 8zm6.406-11.845a1.44 1.44 0 100 2.881 1.44 1.44 0 000-2.881z" }),
1490
+ x: jsxRuntimeExports.jsx("path", { d: "M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z" }),
1491
+ linkedin: jsxRuntimeExports.jsx("path", { d: "M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z" }),
1492
+ website: jsxRuntimeExports.jsx("path", { d: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39z" }),
1493
+ };
1494
+ function SocialLink({ href, title, icon }) {
1495
+ const iconPath = Icons[icon];
1496
+ if (!iconPath || typeof iconPath === 'object')
1497
+ return null;
1498
+ return (jsxRuntimeExports.jsx("a", { href: href, className: "mds-profile-card__social-link", title: title, target: "_blank", rel: "noopener noreferrer", children: jsxRuntimeExports.jsx("svg", { viewBox: "0 0 24 24", children: iconPath }) }));
1499
+ }
1500
+ function UsernameLinks({ username, className }) {
1501
+ const segments = username.split('.');
1502
+ return (jsxRuntimeExports.jsx("span", { className: className, children: segments.map((segment, index) => {
1503
+ const path = '/' + segments.slice(0, index + 1).join('.');
1504
+ const isLast = index === segments.length - 1;
1505
+ return (jsxRuntimeExports.jsxs(require$$0.Fragment, { children: [jsxRuntimeExports.jsx("a", { href: path, className: "mds-profile-card__username-link", title: path, children: segment }), !isLast && jsxRuntimeExports.jsx("span", { className: "mds-profile-card__username-separator", children: "." })] }, index));
1506
+ }) }));
1507
+ }
1508
+ function StatItem({ label, verified }) {
1509
+ return (jsxRuntimeExports.jsxs("div", { className: "mds-profile-card__stat-item", children: [jsxRuntimeExports.jsx("span", { className: "mds-profile-card__stat-label", children: label }), jsxRuntimeExports.jsx("span", { className: `mds-profile-card__stat-value ${verified ? 'mds-profile-card__stat-value--verified' : ''}`, children: verified ? 'Verified' : 'Not Verified' })] }));
1510
+ }
1511
+ // =============================================================================
1512
+ // Main Component
1513
+ // =============================================================================
1514
+ function ProfileCard({ user, variant = 'full', photoWidth, showSocial = false, socialLinks, showRotatingInfo = false, photoSlot, className = '', onSocialClick, }) {
1515
+ const [showVerifiedPopup, setShowVerifiedPopup] = useState(false);
1516
+ const [showSocialPopup, setShowSocialPopup] = useState(false);
1517
+ const [currentInfoIndex, setCurrentInfoIndex] = useState(0);
1518
+ const [isDarkTheme, setIsDarkTheme] = useState(true);
1519
+ const verifiedRef = useRef(null);
1520
+ const socialRef = useRef(null);
1521
+ // Calculate photo width based on variant
1522
+ const computedPhotoWidth = photoWidth ?? (variant === 'full' ? 280 : 200);
1523
+ // Detect theme
1524
+ useEffect(() => {
1525
+ const checkTheme = () => {
1526
+ const theme = document.documentElement.getAttribute('data-theme');
1527
+ setIsDarkTheme(theme !== 'light');
1528
+ };
1529
+ checkTheme();
1530
+ const observer = new MutationObserver((mutations) => {
1531
+ mutations.forEach((mutation) => {
1532
+ if (mutation.attributeName === 'data-theme') {
1533
+ checkTheme();
1534
+ }
1535
+ });
1536
+ });
1537
+ observer.observe(document.documentElement, { attributes: true, attributeFilter: ['data-theme'] });
1538
+ return () => observer.disconnect();
1539
+ }, []);
1540
+ // Dynamic info texts for rotating display
1541
+ const infoTexts = [
1542
+ `Member since ${new Date(user.created_at).getFullYear()}`,
1543
+ ...(user.verified >= 1 ? ['Email Verified'] : []),
1544
+ ...(user.verified >= 2 ? ['Identity Verified'] : []),
1545
+ ...(user.verified >= 3 ? ['Professional Verified'] : []),
1546
+ ];
1547
+ // Rotate info text
1548
+ useEffect(() => {
1549
+ if (!showRotatingInfo)
1550
+ return;
1551
+ const interval = setInterval(() => {
1552
+ setCurrentInfoIndex((prev) => (prev + 1) % infoTexts.length);
1553
+ }, 10000);
1554
+ return () => clearInterval(interval);
1555
+ }, [infoTexts.length, showRotatingInfo]);
1556
+ // Close popups on click outside
1557
+ useEffect(() => {
1558
+ const handleClickOutside = (e) => {
1559
+ if (verifiedRef.current && !verifiedRef.current.contains(e.target)) {
1560
+ setShowVerifiedPopup(false);
1561
+ }
1562
+ if (socialRef.current && !socialRef.current.contains(e.target)) {
1563
+ setShowSocialPopup(false);
1564
+ }
1565
+ };
1566
+ document.addEventListener('click', handleClickOutside);
1567
+ return () => document.removeEventListener('click', handleClickOutside);
1568
+ }, []);
1569
+ // Get display values
1570
+ const displayName = user.full_name || user.username || 'User';
1571
+ const profession = user.profession_name || user.profession_code || '';
1572
+ const getLocation = () => {
1573
+ if (!user.city_code && !user.state_code && !user.country_code)
1574
+ return null;
1575
+ const city = user.city_name || user.city_code?.toUpperCase() || '';
1576
+ const state = user.state_code?.toUpperCase() || '';
1577
+ const country = user.country_name || user.country_code?.toUpperCase() || '';
1578
+ const parts = [city, state, country].filter(Boolean);
1579
+ return parts.join(', ');
1580
+ };
1581
+ const memberSince = new Date(user.created_at).getFullYear().toString();
1582
+ const photoUrl = user.photo_url_medium || user.photo_url_full || getPlaceholderAvatar(isDarkTheme);
1583
+ return (jsxRuntimeExports.jsxs("article", { className: `mds-profile-card ${className}`, style: { '--mds-profile-card-photo-width': `${computedPhotoWidth}px` }, children: [jsxRuntimeExports.jsx("div", { className: "mds-profile-card__grain" }), jsxRuntimeExports.jsx("div", { className: "mds-profile-card__photo", children: photoSlot ? (jsxRuntimeExports.jsx("div", { className: "mds-profile-card__photo-slot", children: photoSlot })) : (jsxRuntimeExports.jsx("img", { src: photoUrl, alt: displayName, className: "mds-profile-card__avatar" })) }), jsxRuntimeExports.jsxs("div", { className: "mds-profile-card__content", children: [jsxRuntimeExports.jsxs("div", { className: "mds-profile-card__identity", children: [jsxRuntimeExports.jsx("h1", { className: "mds-profile-card__name", children: displayName.toUpperCase() }), variant === 'full' && profession && (jsxRuntimeExports.jsx("p", { className: "mds-profile-card__profession", children: profession.toUpperCase() })), variant === 'compact' && (jsxRuntimeExports.jsx(UsernameLinks, { username: user.username, className: "mds-profile-card__username" }))] }), jsxRuntimeExports.jsxs("div", { className: "mds-profile-card__details", children: [variant === 'full' && getLocation() && (jsxRuntimeExports.jsx("p", { className: "mds-profile-card__location", children: getLocation() })), variant === 'full' && (jsxRuntimeExports.jsx(UsernameLinks, { username: user.username, className: "mds-profile-card__username-detail" })), variant === 'compact' && user.email && (jsxRuntimeExports.jsx("p", { className: "mds-profile-card__email", children: user.email })), variant === 'compact' && (jsxRuntimeExports.jsxs("span", { className: "mds-profile-card__member", children: ["Member since ", memberSince] }))] }), variant === 'compact' && (jsxRuntimeExports.jsxs("div", { className: "mds-profile-card__verification", children: [jsxRuntimeExports.jsxs("button", { className: "mds-profile-card__verified-badge", title: `Verification Level ${user.verified}`, onClick: (e) => {
1584
+ e.stopPropagation();
1585
+ setShowVerifiedPopup(!showVerifiedPopup);
1586
+ }, children: [Icons.shield, jsxRuntimeExports.jsxs("span", { children: ["Level ", user.verified] })] }), jsxRuntimeExports.jsxs("div", { className: "mds-profile-card__dots", children: [jsxRuntimeExports.jsx("span", { className: `mds-profile-card__dot ${user.verified >= 1 ? 'active' : ''}`, title: "Email Verified" }), jsxRuntimeExports.jsx("span", { className: `mds-profile-card__dot ${user.verified >= 2 ? 'active' : ''}`, title: "Identity Verified" }), jsxRuntimeExports.jsx("span", { className: `mds-profile-card__dot ${user.verified >= 3 ? 'active' : ''}`, title: "Professional Verified" })] })] })), showSocial && (jsxRuntimeExports.jsxs("div", { ref: socialRef, className: "mds-profile-card__social", children: [jsxRuntimeExports.jsx("button", { className: "mds-profile-card__social-trigger", onClick: (e) => {
1587
+ e.stopPropagation();
1588
+ setShowSocialPopup(!showSocialPopup);
1589
+ setShowVerifiedPopup(false);
1590
+ onSocialClick?.();
1591
+ }, "aria-label": "Show social links", children: Icons.plus }), showSocialPopup && socialLinks && (jsxRuntimeExports.jsxs("div", { className: "mds-profile-card__social-popup", children: [socialLinks.instagram && jsxRuntimeExports.jsx(SocialLink, { href: socialLinks.instagram, title: "Instagram", icon: "instagram" }), socialLinks.x && jsxRuntimeExports.jsx(SocialLink, { href: socialLinks.x, title: "X", icon: "x" }), socialLinks.linkedin && jsxRuntimeExports.jsx(SocialLink, { href: socialLinks.linkedin, title: "LinkedIn", icon: "linkedin" }), socialLinks.website && jsxRuntimeExports.jsx(SocialLink, { href: socialLinks.website, title: "Website", icon: "website" })] }))] })), variant === 'full' && (jsxRuntimeExports.jsxs("div", { className: "mds-profile-card__dynamic-group", children: [showRotatingInfo && (jsxRuntimeExports.jsx("span", { className: "mds-profile-card__dynamic-info", children: infoTexts[currentInfoIndex] })), jsxRuntimeExports.jsxs("div", { ref: verifiedRef, className: "mds-profile-card__verified-section", children: [jsxRuntimeExports.jsx("button", { className: "mds-profile-card__verified-trigger", onClick: (e) => {
1592
+ e.stopPropagation();
1593
+ setShowVerifiedPopup(!showVerifiedPopup);
1594
+ setShowSocialPopup(false);
1595
+ }, title: "Verification Status", children: Icons.shield }), showVerifiedPopup && (jsxRuntimeExports.jsxs("div", { className: "mds-profile-card__verified-popup", children: [jsxRuntimeExports.jsxs("div", { className: "mds-profile-card__verified-header", children: ["Verification Level ", user.verified] }), jsxRuntimeExports.jsxs("div", { className: "mds-profile-card__verified-stats", children: [jsxRuntimeExports.jsx(StatItem, { label: "Email", verified: user.verified >= 1 }), jsxRuntimeExports.jsx(StatItem, { label: "Identity", verified: user.verified >= 2 }), jsxRuntimeExports.jsx(StatItem, { label: "Professional", verified: user.verified >= 3 })] }), jsxRuntimeExports.jsxs("div", { className: "mds-profile-card__verified-date", children: ["Since ", memberSince] })] }))] }), showRotatingInfo && (jsxRuntimeExports.jsx("div", { className: "mds-profile-card__info-dots", children: infoTexts.map((_, index) => (jsxRuntimeExports.jsx("span", { className: `mds-profile-card__info-dot ${index === currentInfoIndex ? 'active' : ''}` }, index))) }))] }))] })] }));
1596
+ }
1597
+
1459
1598
  const variantElementMap = {
1460
1599
  h1: 'h1',
1461
1600
  h2: 'h2',
@@ -1827,36 +1966,43 @@ function ThemeToggle({ size = 'md', className = '', disabled = false, onChange,
1827
1966
  return (jsxRuntimeExports.jsx("button", { onClick: toggleTheme, className: buttonClasses, disabled: disabled, type: "button", "aria-pressed": isDark, "aria-label": `Switch to ${isDark ? 'light' : 'dark'} mode`, title: `Switch to ${isDark ? 'light' : 'dark'} mode`, "data-theme": isDark ? 'dark' : 'light', style: buttonStyle }));
1828
1967
  }
1829
1968
 
1830
- const TableHeader = ({ columns, gridTemplate, onSort, sortColumn, sortDirection }) => {
1831
- return (jsxRuntimeExports.jsx("div", { role: "rowgroup", style: {
1969
+ const TableHeader = ({ columns, gridTemplate, onSort, sortColumn, sortDirection, hasActions = false }) => {
1970
+ return (jsxRuntimeExports.jsxs("div", { role: "rowgroup", style: {
1832
1971
  display: 'grid',
1833
1972
  gridTemplateColumns: gridTemplate,
1834
1973
  gap: '16px',
1835
1974
  padding: '16px 20px',
1836
1975
  borderBottom: '1px solid var(--border-color)',
1837
1976
  backgroundColor: 'rgba(255, 255, 255, 0.05)'
1838
- }, children: columns.map((column) => (jsxRuntimeExports.jsxs("div", { role: "columnheader", style: {
1839
- color: 'var(--text-primary)',
1840
- fontWeight: '500',
1841
- fontSize: '14px',
1842
- display: 'flex',
1843
- alignItems: 'center',
1844
- justifyContent: column.align === 'center' ? 'center' :
1845
- column.align === 'right' ? 'flex-end' : 'flex-start',
1846
- cursor: column.sortable && onSort ? 'pointer' : 'default',
1847
- gap: '4px',
1848
- transition: 'color 0.2s ease'
1849
- }, onClick: () => column.sortable && onSort && onSort(column.key), onMouseEnter: (e) => {
1850
- if (column.sortable && onSort) {
1851
- e.currentTarget.style.color = '#ffffff';
1852
- }
1853
- }, onMouseLeave: (e) => {
1854
- e.currentTarget.style.color = 'var(--text-primary)';
1855
- }, children: [column.label, column.sortable && onSort && (jsxRuntimeExports.jsx("span", { style: {
1856
- fontSize: '12px',
1857
- opacity: sortColumn === column.key ? 1 : 0.5
1858
- }, children: sortColumn === column.key ?
1859
- (sortDirection === 'asc' ? '↑' : '↓') : '↕' }))] }, column.key))) }));
1977
+ }, children: [columns.map((column) => (jsxRuntimeExports.jsxs("div", { role: "columnheader", style: {
1978
+ color: 'var(--text-primary)',
1979
+ fontWeight: '500',
1980
+ fontSize: '14px',
1981
+ display: 'flex',
1982
+ alignItems: 'center',
1983
+ justifyContent: column.align === 'center' ? 'center' :
1984
+ column.align === 'right' ? 'flex-end' : 'flex-start',
1985
+ cursor: column.sortable && onSort ? 'pointer' : 'default',
1986
+ gap: '4px',
1987
+ transition: 'color 0.2s ease'
1988
+ }, onClick: () => column.sortable && onSort && onSort(column.key), onMouseEnter: (e) => {
1989
+ if (column.sortable && onSort) {
1990
+ e.currentTarget.style.color = '#ffffff';
1991
+ }
1992
+ }, onMouseLeave: (e) => {
1993
+ e.currentTarget.style.color = 'var(--text-primary)';
1994
+ }, children: [column.label, column.sortable && onSort && (jsxRuntimeExports.jsx("span", { style: {
1995
+ fontSize: '12px',
1996
+ opacity: sortColumn === column.key ? 1 : 0.5
1997
+ }, children: sortColumn === column.key ?
1998
+ (sortDirection === 'asc' ? '↑' : '↓') : '↕' }))] }, column.key))), hasActions && (jsxRuntimeExports.jsx("div", { role: "columnheader", style: {
1999
+ color: 'var(--text-primary)',
2000
+ fontWeight: '500',
2001
+ fontSize: '14px',
2002
+ display: 'flex',
2003
+ alignItems: 'center',
2004
+ justifyContent: 'center'
2005
+ }, children: "Actions" }))] }));
1860
2006
  };
1861
2007
 
1862
2008
  const TableRow = ({ item, index, columns, actions = [], gridTemplate, isLast, variant, onActionClick }) => {
@@ -1894,10 +2040,9 @@ const TableRow = ({ item, index, columns, actions = [], gridTemplate, isLast, va
1894
2040
  const isLoading = action.loading?.(item) || false;
1895
2041
  return (jsxRuntimeExports.jsxs("button", { onClick: () => !isDisabled && !isLoading && onActionClick(action, item), disabled: isDisabled || isLoading, style: {
1896
2042
  background: 'none',
1897
- border: action.variant === 'danger' ? '1px solid rgba(239, 68, 68, 0.3)' :
1898
- '1px solid var(--border-color)',
2043
+ border: 'none',
1899
2044
  borderRadius: '6px',
1900
- padding: '6px 12px',
2045
+ padding: '6px 8px',
1901
2046
  color: action.variant === 'danger' ? '#f87171' : 'var(--text-primary)',
1902
2047
  fontSize: '12px',
1903
2048
  cursor: isDisabled || isLoading ? 'not-allowed' : 'pointer',
@@ -1911,18 +2056,14 @@ const TableRow = ({ item, index, columns, actions = [], gridTemplate, isLast, va
1911
2056
  if (!isDisabled && !isLoading) {
1912
2057
  if (action.variant === 'danger') {
1913
2058
  e.currentTarget.style.backgroundColor = 'rgba(239, 68, 68, 0.1)';
1914
- e.currentTarget.style.borderColor = 'rgba(239, 68, 68, 0.5)';
1915
2059
  }
1916
2060
  else {
1917
2061
  e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.1)';
1918
- e.currentTarget.style.borderColor = 'var(--text-primary)';
1919
2062
  }
1920
2063
  }
1921
2064
  }, onMouseLeave: (e) => {
1922
2065
  if (!isDisabled && !isLoading) {
1923
2066
  e.currentTarget.style.backgroundColor = 'transparent';
1924
- e.currentTarget.style.borderColor = action.variant === 'danger' ?
1925
- 'rgba(239, 68, 68, 0.3)' : 'var(--border-color)';
1926
2067
  }
1927
2068
  }, children: [action.icon && action.icon, action.label] }, action.key));
1928
2069
  }) }))] }));
@@ -2022,7 +2163,7 @@ const DataTable = ({ data, columns, loading = false, searchTerm = '', actions =
2022
2163
  color: 'var(--text-secondary)',
2023
2164
  fontSize: '14px',
2024
2165
  borderBottom: '1px solid var(--border-color)'
2025
- }, children: ["Mostrando", ' ', jsxRuntimeExports.jsx("span", { style: { fontWeight: '500', color: 'var(--text-primary)' }, children: filteredData.length }), ' ', "de", ' ', jsxRuntimeExports.jsx("span", { style: { fontWeight: '500', color: 'var(--text-primary)' }, children: data.length }), ' ', "itens"] })), jsxRuntimeExports.jsx(TableHeader, { columns: columns, gridTemplate: gridTemplate, onSort: onSort ? handleSort : undefined, sortColumn: sortColumn, sortDirection: sortDirection }), jsxRuntimeExports.jsx("div", { role: "rowgroup", style: {
2166
+ }, children: ["Mostrando", ' ', jsxRuntimeExports.jsx("span", { style: { fontWeight: '500', color: 'var(--text-primary)' }, children: filteredData.length }), ' ', "de", ' ', jsxRuntimeExports.jsx("span", { style: { fontWeight: '500', color: 'var(--text-primary)' }, children: data.length }), ' ', "itens"] })), jsxRuntimeExports.jsx(TableHeader, { columns: columns, gridTemplate: gridTemplate, onSort: onSort ? handleSort : undefined, sortColumn: sortColumn, sortDirection: sortDirection, hasActions: actions.length > 0 }), jsxRuntimeExports.jsx("div", { role: "rowgroup", style: {
2026
2167
  maxHeight,
2027
2168
  overflowY: 'auto'
2028
2169
  }, children: filteredData.map((item, index) => (jsxRuntimeExports.jsx(TableRow, { item: item, index: index, columns: columns, actions: actions, gridTemplate: gridTemplate, isLast: index === filteredData.length - 1, variant: variant, onActionClick: handleActionClick }, item.id || index))) })] }));
@@ -2430,6 +2571,157 @@ const getTableConfig = (type) => {
2430
2571
  }
2431
2572
  };
2432
2573
 
2574
+ /**
2575
+ * FormField - Normalized wrapper for form inputs
2576
+ *
2577
+ * Pattern extracted from AdminUserModal.tsx (backoffice/users)
2578
+ * Provides consistent label, error, and helper text styling
2579
+ */
2580
+ function FormField({ label, required = false, error, helper, disabled = false, children, className = '' }) {
2581
+ return (jsxRuntimeExports.jsxs("div", { className: `mds-form-field ${className}`, style: { opacity: disabled ? 0.6 : 1 }, children: [jsxRuntimeExports.jsxs("label", { style: {
2582
+ display: 'block',
2583
+ marginBottom: '6px',
2584
+ color: 'var(--mds-color-text-primary, var(--text-primary))',
2585
+ fontSize: '0.9rem',
2586
+ fontWeight: 500
2587
+ }, children: [label, required && (jsxRuntimeExports.jsx("span", { style: { color: 'var(--mds-color-error, #ef4444)', marginLeft: '4px' }, children: "*" }))] }), children, error && (jsxRuntimeExports.jsx("span", { style: {
2588
+ color: 'var(--mds-color-error, #ef4444)',
2589
+ fontSize: '0.8rem',
2590
+ marginTop: '4px',
2591
+ display: 'block'
2592
+ }, children: error })), helper && !error && (jsxRuntimeExports.jsx("span", { style: {
2593
+ color: 'var(--mds-color-text-secondary, var(--text-secondary))',
2594
+ fontSize: '0.75rem',
2595
+ marginTop: '4px',
2596
+ display: 'block'
2597
+ }, children: helper }))] }));
2598
+ }
2599
+
2600
+ const gapValues = {
2601
+ sm: '12px',
2602
+ md: '16px',
2603
+ lg: '24px'
2604
+ };
2605
+ /**
2606
+ * FormGrid - Normalized grid layout for form fields
2607
+ *
2608
+ * Pattern extracted from AdminUserModal.tsx (backoffice/users)
2609
+ * Provides consistent 1 or 2 column layouts with proper gap
2610
+ */
2611
+ function FormGrid({ columns = 1, gap = 'md', children, className = '' }) {
2612
+ return (jsxRuntimeExports.jsx("div", { className: `mds-form-grid ${className}`, style: {
2613
+ display: 'grid',
2614
+ gridTemplateColumns: columns === 2 ? 'repeat(2, 1fr)' : '1fr',
2615
+ gap: gapValues[gap]
2616
+ }, children: children }));
2617
+ }
2618
+
2619
+ /**
2620
+ * FormSection - Normalized section wrapper for grouping form fields
2621
+ *
2622
+ * Pattern extracted from AdminUserModal.tsx (backoffice/users)
2623
+ * Provides consistent section headers and spacing
2624
+ */
2625
+ function FormSection({ title, description, children, className = '' }) {
2626
+ return (jsxRuntimeExports.jsxs("div", { className: `mds-form-section ${className}`, style: {
2627
+ marginBottom: '24px'
2628
+ }, children: [title && (jsxRuntimeExports.jsx("h4", { style: {
2629
+ margin: '0 0 8px 0',
2630
+ color: 'var(--mds-color-text-primary, var(--text-primary))',
2631
+ fontSize: '1rem',
2632
+ fontWeight: 600,
2633
+ letterSpacing: '-0.02em'
2634
+ }, children: title })), description && (jsxRuntimeExports.jsx("p", { style: {
2635
+ margin: '0 0 16px 0',
2636
+ color: 'var(--mds-color-text-secondary, var(--text-secondary))',
2637
+ fontSize: '0.85rem',
2638
+ lineHeight: 1.5
2639
+ }, children: description })), jsxRuntimeExports.jsx("div", { style: { display: 'flex', flexDirection: 'column', gap: '16px' }, children: children })] }));
2640
+ }
2641
+
2642
+ const variantColors = {
2643
+ default: {
2644
+ bg: 'rgba(255, 255, 255, 0.03)',
2645
+ border: 'rgba(255, 255, 255, 0.1)',
2646
+ accent: 'var(--mds-color-text-secondary, #888)'
2647
+ },
2648
+ info: {
2649
+ bg: 'rgba(59, 130, 246, 0.1)',
2650
+ border: 'rgba(59, 130, 246, 0.2)',
2651
+ accent: 'var(--mds-color-info, #3b82f6)'
2652
+ },
2653
+ success: {
2654
+ bg: 'rgba(16, 185, 129, 0.1)',
2655
+ border: 'rgba(16, 185, 129, 0.2)',
2656
+ accent: 'var(--mds-color-success, #10b981)'
2657
+ },
2658
+ warning: {
2659
+ bg: 'rgba(245, 158, 11, 0.1)',
2660
+ border: 'rgba(245, 158, 11, 0.2)',
2661
+ accent: 'var(--mds-color-warning, #f59e0b)'
2662
+ },
2663
+ danger: {
2664
+ bg: 'rgba(239, 68, 68, 0.1)',
2665
+ border: 'rgba(239, 68, 68, 0.2)',
2666
+ accent: 'var(--mds-color-error, #ef4444)'
2667
+ }
2668
+ };
2669
+ /**
2670
+ * InfoBox - Normalized info/alert box for read-only information
2671
+ *
2672
+ * Pattern extracted from AdminUserModal.tsx (backoffice/users)
2673
+ * Provides consistent info boxes for alerts, status displays, and read-only data
2674
+ *
2675
+ * @example
2676
+ * // Alert style (with accent)
2677
+ * <InfoBox variant="info" accent>
2678
+ * An invitation email will be sent...
2679
+ * </InfoBox>
2680
+ *
2681
+ * @example
2682
+ * // Status display (default)
2683
+ * <InfoBox title="User Information">
2684
+ * <InfoRow label="Status" value="Active" />
2685
+ * <InfoRow label="Created" value="Jan 1, 2024" />
2686
+ * </InfoBox>
2687
+ */
2688
+ function InfoBox({ title, variant = 'default', accent = false, copyable = false, children, className = '' }) {
2689
+ const colors = variantColors[variant];
2690
+ const handleCopy = () => {
2691
+ if (!copyable)
2692
+ return;
2693
+ const text = typeof children === 'string' ? children : '';
2694
+ if (text) {
2695
+ navigator.clipboard.writeText(text);
2696
+ }
2697
+ };
2698
+ return (jsxRuntimeExports.jsxs("div", { className: `mds-info-box ${className}`, style: {
2699
+ padding: '12px 16px',
2700
+ backgroundColor: colors.bg,
2701
+ borderRadius: '8px',
2702
+ border: `1px solid ${colors.border}`,
2703
+ borderLeft: accent ? `4px solid ${colors.accent}` : `1px solid ${colors.border}`,
2704
+ cursor: copyable ? 'pointer' : 'default'
2705
+ }, onClick: copyable ? handleCopy : undefined, title: copyable ? 'Click to copy' : undefined, children: [title && (jsxRuntimeExports.jsx("div", { style: {
2706
+ color: 'var(--mds-color-text-secondary, var(--text-secondary))',
2707
+ fontSize: '0.85rem',
2708
+ marginBottom: '8px',
2709
+ fontWeight: 500
2710
+ }, children: title })), jsxRuntimeExports.jsx("div", { style: {
2711
+ color: 'var(--mds-color-text-primary, var(--text-primary))',
2712
+ fontSize: '0.9rem',
2713
+ lineHeight: 1.5
2714
+ }, children: children })] }));
2715
+ }
2716
+ function InfoRow({ label, value, valueColor }) {
2717
+ return (jsxRuntimeExports.jsxs("div", { style: {
2718
+ display: 'flex',
2719
+ justifyContent: 'space-between',
2720
+ fontSize: '0.85rem',
2721
+ padding: '2px 0'
2722
+ }, children: [jsxRuntimeExports.jsxs("span", { style: { color: 'var(--mds-color-text-secondary, var(--text-secondary))' }, children: [label, ":"] }), jsxRuntimeExports.jsx("span", { style: { color: valueColor || 'var(--mds-color-text-primary, var(--text-primary))' }, children: value })] }));
2723
+ }
2724
+
2433
2725
  /**
2434
2726
  * Theme-aware styles generator - Liquid Glass pattern
2435
2727
  *
@@ -2464,7 +2756,7 @@ function getStyles(isDark) {
2464
2756
  // Dark theme: subtle glass effect
2465
2757
  background: isDark
2466
2758
  ? 'rgba(255, 255, 255, 0.03)'
2467
- : 'rgba(255, 255, 255, 0.55)',
2759
+ : 'rgba(255, 255, 255, 0.45)',
2468
2760
  // Liquid Glass: Strong blur + saturation
2469
2761
  backdropFilter: 'blur(var(--mds-liquid-blur-xl, 24px)) saturate(var(--mds-liquid-saturate-vibrant, 140%))',
2470
2762
  WebkitBackdropFilter: 'blur(var(--mds-liquid-blur-xl, 24px)) saturate(var(--mds-liquid-saturate-vibrant, 140%))',
@@ -2549,6 +2841,160 @@ function Modal({ open, onClose, closeOnOverlay = true, children, className, styl
2549
2841
  return createPortal(content, document.body);
2550
2842
  }
2551
2843
 
2844
+ const sizeMap$1 = {
2845
+ sm: '400px',
2846
+ md: '480px',
2847
+ lg: '600px',
2848
+ xl: '800px'
2849
+ };
2850
+ /**
2851
+ * FormModal - Normalized template for CRUD modal forms
2852
+ *
2853
+ * Pattern extracted from AdminUserModal.tsx (backoffice/users)
2854
+ * Provides consistent structure for create/edit entity modals
2855
+ *
2856
+ * @example
2857
+ * <FormModal
2858
+ * open={showModal}
2859
+ * onClose={() => setShowModal(false)}
2860
+ * onSubmit={handleSubmit}
2861
+ * title="Edit User"
2862
+ * info="Changes will be saved immediately."
2863
+ * infoVariant="info"
2864
+ * loading={isSaving}
2865
+ * submitText="Save"
2866
+ * >
2867
+ * <FormField label="Name" required error={errors.name}>
2868
+ * <input className="mds-input" value={name} onChange={...} />
2869
+ * </FormField>
2870
+ * </FormModal>
2871
+ */
2872
+ function FormModal({ open, onClose, onSubmit, title, icon, subtitle, info, infoVariant = 'info', children, submitText = 'Save', cancelText = 'Cancel', loading = false, submitDisabled = false, size = 'md', className = '' }) {
2873
+ const handleSubmit = (e) => {
2874
+ e.preventDefault();
2875
+ onSubmit(e);
2876
+ };
2877
+ return (jsxRuntimeExports.jsxs(Modal, { open: open, onClose: onClose, closeOnOverlay: !loading, className: className, style: {
2878
+ maxWidth: sizeMap$1[size],
2879
+ maxHeight: '90vh',
2880
+ overflowY: 'auto',
2881
+ padding: '24px'
2882
+ }, children: [jsxRuntimeExports.jsxs("div", { style: {
2883
+ display: 'flex',
2884
+ alignItems: 'center',
2885
+ justifyContent: 'space-between',
2886
+ marginBottom: subtitle ? '8px' : '24px'
2887
+ }, children: [jsxRuntimeExports.jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '12px' }, children: [icon && (jsxRuntimeExports.jsx("div", { style: {
2888
+ display: 'flex',
2889
+ alignItems: 'center',
2890
+ justifyContent: 'center',
2891
+ width: 32,
2892
+ height: 32,
2893
+ fontSize: '1.25rem',
2894
+ lineHeight: 0,
2895
+ opacity: 0.5
2896
+ }, children: icon })), jsxRuntimeExports.jsx(Typography, { variant: "h3", color: "primary", style: { margin: 0 }, children: title })] }), jsxRuntimeExports.jsx("button", { type: "button", onClick: onClose, disabled: loading, style: {
2897
+ background: 'none',
2898
+ border: 'none',
2899
+ padding: '8px',
2900
+ cursor: loading ? 'not-allowed' : 'pointer',
2901
+ color: 'var(--mds-color-text-secondary)',
2902
+ opacity: loading ? 0.5 : 1,
2903
+ borderRadius: '6px',
2904
+ display: 'flex',
2905
+ alignItems: 'center',
2906
+ justifyContent: 'center',
2907
+ transition: 'all 0.2s ease'
2908
+ }, onMouseEnter: (e) => {
2909
+ if (!loading)
2910
+ e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.1)';
2911
+ }, onMouseLeave: (e) => {
2912
+ e.currentTarget.style.backgroundColor = 'transparent';
2913
+ }, "aria-label": "Close modal", children: jsxRuntimeExports.jsxs("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [jsxRuntimeExports.jsx("line", { x1: "18", y1: "6", x2: "6", y2: "18" }), jsxRuntimeExports.jsx("line", { x1: "6", y1: "6", x2: "18", y2: "18" })] }) })] }), subtitle && (jsxRuntimeExports.jsx(Typography, { variant: "body", color: "secondary", style: { marginBottom: '24px', fontSize: '0.9rem' }, children: subtitle })), info && (jsxRuntimeExports.jsx("div", { style: { marginBottom: '20px' }, children: jsxRuntimeExports.jsx(InfoBox, { variant: infoVariant, accent: true, children: info }) })), jsxRuntimeExports.jsxs("form", { onSubmit: handleSubmit, style: { display: 'flex', flexDirection: 'column', gap: '16px' }, children: [children, jsxRuntimeExports.jsxs("div", { style: {
2914
+ display: 'flex',
2915
+ gap: '12px',
2916
+ justifyContent: 'flex-end',
2917
+ marginTop: '16px',
2918
+ paddingTop: '16px',
2919
+ borderTop: '1px solid rgba(255, 255, 255, 0.1)'
2920
+ }, children: [jsxRuntimeExports.jsx(Button, { variant: "secondary", size: "sm", type: "button", onClick: onClose, disabled: loading, style: { minWidth: '90px' }, children: cancelText }), jsxRuntimeExports.jsx(Button, { variant: "primary", size: "sm", type: "submit", loading: loading, disabled: loading || submitDisabled, style: { minWidth: '110px' }, children: submitText })] })] })] }));
2921
+ }
2922
+
2923
+ const sizeMap = {
2924
+ sm: '400px',
2925
+ md: '480px',
2926
+ lg: '600px',
2927
+ xl: '800px'
2928
+ };
2929
+ /**
2930
+ * DetailModal - Normalized template for read-only detail modals
2931
+ *
2932
+ * Pattern extracted from GeographyDetailsModal, AuditLogDetailModal (backoffice)
2933
+ * Provides consistent structure for viewing entity details
2934
+ *
2935
+ * @example
2936
+ * <DetailModal
2937
+ * open={showDetails}
2938
+ * onClose={() => setShowDetails(false)}
2939
+ * title="User Details"
2940
+ * subtitle="Created on Jan 1, 2024"
2941
+ * action={{
2942
+ * label: 'Edit',
2943
+ * onClick: handleEdit,
2944
+ * variant: 'primary'
2945
+ * }}
2946
+ * >
2947
+ * <InfoBox title="Basic Information">
2948
+ * <InfoRow label="Name" value={user.name} />
2949
+ * <InfoRow label="Email" value={user.email} />
2950
+ * </InfoBox>
2951
+ * </DetailModal>
2952
+ */
2953
+ function DetailModal({ open, onClose, title, icon, subtitle, children, closeText = 'Close', action, size = 'md', className = '' }) {
2954
+ return (jsxRuntimeExports.jsxs(Modal, { open: open, onClose: onClose, closeOnOverlay: true, className: className, style: {
2955
+ maxWidth: sizeMap[size],
2956
+ maxHeight: '90vh',
2957
+ overflowY: 'auto',
2958
+ padding: '24px'
2959
+ }, children: [jsxRuntimeExports.jsxs("div", { style: {
2960
+ display: 'flex',
2961
+ alignItems: 'center',
2962
+ justifyContent: 'space-between',
2963
+ marginBottom: subtitle ? '8px' : '24px'
2964
+ }, children: [jsxRuntimeExports.jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '12px' }, children: [icon && (jsxRuntimeExports.jsx("div", { style: {
2965
+ display: 'flex',
2966
+ alignItems: 'center',
2967
+ justifyContent: 'center',
2968
+ width: 32,
2969
+ height: 32,
2970
+ fontSize: '1.25rem',
2971
+ lineHeight: 0,
2972
+ opacity: 0.5
2973
+ }, children: icon })), jsxRuntimeExports.jsx(Typography, { variant: "h3", color: "primary", style: { margin: 0 }, children: title })] }), jsxRuntimeExports.jsx("button", { type: "button", onClick: onClose, style: {
2974
+ background: 'none',
2975
+ border: 'none',
2976
+ padding: '8px',
2977
+ cursor: 'pointer',
2978
+ color: 'var(--mds-color-text-secondary)',
2979
+ borderRadius: '6px',
2980
+ display: 'flex',
2981
+ alignItems: 'center',
2982
+ justifyContent: 'center',
2983
+ transition: 'all 0.2s ease'
2984
+ }, onMouseEnter: (e) => {
2985
+ e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.1)';
2986
+ }, onMouseLeave: (e) => {
2987
+ e.currentTarget.style.backgroundColor = 'transparent';
2988
+ }, "aria-label": "Close modal", children: jsxRuntimeExports.jsxs("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [jsxRuntimeExports.jsx("line", { x1: "18", y1: "6", x2: "6", y2: "18" }), jsxRuntimeExports.jsx("line", { x1: "6", y1: "6", x2: "18", y2: "18" })] }) })] }), subtitle && (jsxRuntimeExports.jsx(Typography, { variant: "body", color: "secondary", style: { marginBottom: '24px', fontSize: '0.9rem' }, children: subtitle })), jsxRuntimeExports.jsx("div", { style: { display: 'flex', flexDirection: 'column', gap: '16px' }, children: children }), jsxRuntimeExports.jsxs("div", { style: {
2989
+ display: 'flex',
2990
+ gap: '12px',
2991
+ justifyContent: 'flex-end',
2992
+ marginTop: '24px',
2993
+ paddingTop: '16px',
2994
+ borderTop: '1px solid rgba(255, 255, 255, 0.1)'
2995
+ }, children: [jsxRuntimeExports.jsx(Button, { variant: "secondary", size: "sm", onClick: onClose, children: closeText }), action && (jsxRuntimeExports.jsx(Button, { variant: action.variant || 'primary', size: "sm", onClick: action.onClick, disabled: action.disabled, children: action.label }))] })] }));
2996
+ }
2997
+
2552
2998
  function ModalHeader({ title, icon, onClose, closeAriaLabel = 'Fechar', align = 'center' }) {
2553
2999
  const CloseIcon = (jsxRuntimeExports.jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "currentColor", "aria-hidden": true, children: jsxRuntimeExports.jsx("path", { d: "M18.3 5.71a1 1 0 00-1.41 0L12 10.59 7.11 5.7A1 1 0 105.7 7.11L10.59 12l-4.9 4.89a1 1 0 101.42 1.42L12 13.41l4.89 4.9a1 1 0 001.42-1.42L13.41 12l4.9-4.89a1 1 0 000-1.4z" }) }));
2554
3000
  if (align === 'center') {
@@ -2563,7 +3009,8 @@ function ModalHeader({ title, icon, onClose, closeAriaLabel = 'Fechar', align =
2563
3009
  alignItems: 'center',
2564
3010
  justifyContent: 'center',
2565
3011
  fontSize: '1.25rem',
2566
- lineHeight: 0
3012
+ lineHeight: 0,
3013
+ opacity: 0.5
2567
3014
  };
2568
3015
  const closeBox = {
2569
3016
  position: 'absolute',
@@ -2595,7 +3042,7 @@ function ModalHeader({ title, icon, onClose, closeAriaLabel = 'Fechar', align =
2595
3042
  padding: '16px 24px',
2596
3043
  marginBottom: 16,
2597
3044
  borderBottom: '1px solid var(--border-color)'
2598
- }, children: [icon && (jsxRuntimeExports.jsx("div", { "aria-hidden": true, style: { display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: 32, height: 32, fontSize: '1.25rem', lineHeight: 0 }, 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', width: 32, height: 32, display: 'inline-flex', alignItems: 'center', justifyContent: 'center', cursor: 'pointer', lineHeight: 0 }, children: CloseIcon }))] }));
3045
+ }, children: [icon && (jsxRuntimeExports.jsx("div", { "aria-hidden": true, style: { display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: 32, height: 32, fontSize: '1.25rem', lineHeight: 0, opacity: 0.5 }, 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', width: 32, height: 32, display: 'inline-flex', alignItems: 'center', justifyContent: 'center', cursor: 'pointer', lineHeight: 0 }, children: CloseIcon }))] }));
2599
3046
  }
2600
3047
 
2601
3048
  function ModalBody({ children, style, className }) {
@@ -2621,5 +3068,5 @@ function ConfirmDialog({ open, onClose, title, description, confirmText = 'Confi
2621
3068
  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 })] })] }) }));
2622
3069
  }
2623
3070
 
2624
- export { ActionIcons, BrandLogo, Button, CellRenderers, ConfirmDialog, DataTable, GlassCard, Modal, ModalBody, ModalFooter, ModalHeader, Select, TableHeader, TableRow, ThemeToggle, Typography, auditLogTableConfig, citiesTableConfig, cn, countriesTableConfig, getTableConfig, parametersTableConfig, regionsTableConfig, statesTableConfig };
3071
+ export { ActionIcons, BrandLogo, Button, CellRenderers, ConfirmDialog, DataTable, DetailModal, FormField, FormGrid, FormModal, FormSection, GlassCard, InfoBox, InfoRow, Modal, ModalBody, ModalFooter, ModalHeader, ProfileCard, Select, TableHeader, TableRow, ThemeToggle, Typography, auditLogTableConfig, citiesTableConfig, cn, countriesTableConfig, getTableConfig, parametersTableConfig, regionsTableConfig, statesTableConfig };
2625
3072
  //# sourceMappingURL=index.esm.js.map