@metropolle/design-system 1.2026.0-1.2.1231 → 1.2026.0-1.22.1449

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 (51) hide show
  1. package/README.md +2 -0
  2. package/dist/css/compat/back.css +12 -0
  3. package/dist/css/components.css +2285 -3
  4. package/dist/react/components/react/Button/Button.d.ts +1 -1
  5. package/dist/react/components/react/Button/Button.d.ts.map +1 -1
  6. package/dist/react/components/react/DataTable/DataTable.d.ts.map +1 -1
  7. package/dist/react/components/react/DataTable/TableHeader.d.ts.map +1 -1
  8. package/dist/react/components/react/DataTable/TableRow.d.ts.map +1 -1
  9. package/dist/react/components/react/DataTable/types.d.ts +2 -1
  10. package/dist/react/components/react/DataTable/types.d.ts.map +1 -1
  11. package/dist/react/components/react/DetailModal/DetailModal.d.ts +55 -0
  12. package/dist/react/components/react/DetailModal/DetailModal.d.ts.map +1 -0
  13. package/dist/react/components/react/DetailModal/index.d.ts +3 -0
  14. package/dist/react/components/react/DetailModal/index.d.ts.map +1 -0
  15. package/dist/react/components/react/FormField/FormField.d.ts +26 -0
  16. package/dist/react/components/react/FormField/FormField.d.ts.map +1 -0
  17. package/dist/react/components/react/FormField/index.d.ts +3 -0
  18. package/dist/react/components/react/FormField/index.d.ts.map +1 -0
  19. package/dist/react/components/react/FormGrid/FormGrid.d.ts +20 -0
  20. package/dist/react/components/react/FormGrid/FormGrid.d.ts.map +1 -0
  21. package/dist/react/components/react/FormGrid/index.d.ts +3 -0
  22. package/dist/react/components/react/FormGrid/index.d.ts.map +1 -0
  23. package/dist/react/components/react/FormModal/FormModal.d.ts +58 -0
  24. package/dist/react/components/react/FormModal/FormModal.d.ts.map +1 -0
  25. package/dist/react/components/react/FormModal/index.d.ts +3 -0
  26. package/dist/react/components/react/FormModal/index.d.ts.map +1 -0
  27. package/dist/react/components/react/FormSection/FormSection.d.ts +20 -0
  28. package/dist/react/components/react/FormSection/FormSection.d.ts.map +1 -0
  29. package/dist/react/components/react/FormSection/index.d.ts +3 -0
  30. package/dist/react/components/react/FormSection/index.d.ts.map +1 -0
  31. package/dist/react/components/react/GlassCard/GlassCard.d.ts +10 -0
  32. package/dist/react/components/react/GlassCard/GlassCard.d.ts.map +1 -1
  33. package/dist/react/components/react/GlassCard/index.d.ts +1 -1
  34. package/dist/react/components/react/GlassCard/index.d.ts.map +1 -1
  35. package/dist/react/components/react/InfoBox/InfoBox.d.ts +46 -0
  36. package/dist/react/components/react/InfoBox/InfoBox.d.ts.map +1 -0
  37. package/dist/react/components/react/InfoBox/index.d.ts +3 -0
  38. package/dist/react/components/react/InfoBox/index.d.ts.map +1 -0
  39. package/dist/react/components/react/Modal/ModalHeader.d.ts.map +1 -1
  40. package/dist/react/components/react/ProfileCard/ProfileCard.d.ts +57 -0
  41. package/dist/react/components/react/ProfileCard/ProfileCard.d.ts.map +1 -0
  42. package/dist/react/components/react/ProfileCard/index.d.ts +3 -0
  43. package/dist/react/components/react/ProfileCard/index.d.ts.map +1 -0
  44. package/dist/react/components/react/index.d.ts +14 -0
  45. package/dist/react/components/react/index.d.ts.map +1 -1
  46. package/dist/react/index.d.ts +32 -18
  47. package/dist/react/index.esm.js +492 -37
  48. package/dist/react/index.esm.js.map +1 -1
  49. package/dist/react/index.js +499 -36
  50. package/dist/react/index.js.map +1 -1
  51. package/package.json +2 -1
@@ -1387,14 +1387,26 @@ function cn(...classes) {
1387
1387
  * </GlassCard>
1388
1388
  * ```
1389
1389
  */
1390
- const GlassCard = require$$0.forwardRef(({ glassStyle = 'liquid', intensity = 'md', theme, variant = 'light', blur, opacity, children, className, enableHover = true, style, ...props }, ref) => {
1390
+ const GlassCard = require$$0.forwardRef(({ glassStyle = 'liquid', intensity = 'md', theme, variant = 'light', blur, opacity, children, className, enableHover = true, cardVariant = 'default', style, ...props }, ref) => {
1391
1391
  // Resolve theme from new prop or deprecated variant
1392
1392
  const resolvedTheme = theme ?? variant;
1393
1393
  // =====================
1394
1394
  // LIQUID GLASS MODE
1395
1395
  // =====================
1396
1396
  if (glassStyle === 'liquid') {
1397
- 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 }));
1397
+ // PROC-007: Card variant styles
1398
+ const variantStyles = {
1399
+ default: {},
1400
+ highlight: {
1401
+ borderLeft: '4px solid var(--mds-color-brand-primary, #0055FF)',
1402
+ boxShadow: '0 4px 20px rgba(0, 85, 255, 0.15)'
1403
+ },
1404
+ subtle: {
1405
+ background: 'rgba(255, 255, 255, 0.02)',
1406
+ border: '1px solid rgba(255, 255, 255, 0.05)'
1407
+ }
1408
+ };
1409
+ 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 }));
1398
1410
  }
1399
1411
  // =====================
1400
1412
  // GLASS MODE (legacy)
@@ -1458,6 +1470,141 @@ const GlassCard = require$$0.forwardRef(({ glassStyle = 'liquid', intensity = 'm
1458
1470
  });
1459
1471
  GlassCard.displayName = 'GlassCard';
1460
1472
 
1473
+ // Default placeholder avatar - adapts to theme with high transparency
1474
+ const getPlaceholderAvatar = (isDark) => {
1475
+ const bgColor = isDark ? 'rgba(26, 26, 46, 0.15)' : 'rgba(255, 255, 255, 0.1)';
1476
+ const fgColor = isDark ? 'rgba(255, 255, 255, 0.08)' : 'rgba(0, 0, 0, 0.06)';
1477
+ return 'data:image/svg+xml,' + encodeURIComponent(`
1478
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200" fill="none">
1479
+ <rect width="200" height="200" fill="${bgColor}"/>
1480
+ <circle cx="100" cy="80" r="40" fill="${fgColor}"/>
1481
+ <ellipse cx="100" cy="180" rx="60" ry="50" fill="${fgColor}"/>
1482
+ </svg>
1483
+ `);
1484
+ };
1485
+ // =============================================================================
1486
+ // Icons
1487
+ // =============================================================================
1488
+ const Icons = {
1489
+ 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" }) })),
1490
+ plus: (jsxRuntimeExports.jsx("svg", { viewBox: "0 0 24 24", children: jsxRuntimeExports.jsx("path", { d: "M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z", fill: "currentColor" }) })),
1491
+ 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" }),
1492
+ 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" }),
1493
+ 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" }),
1494
+ 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" }),
1495
+ };
1496
+ function SocialLink({ href, title, icon }) {
1497
+ const iconPath = Icons[icon];
1498
+ if (!iconPath || typeof iconPath === 'object')
1499
+ return null;
1500
+ 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 }) }));
1501
+ }
1502
+ function UsernameLinks({ username, className }) {
1503
+ const segments = username.split('.');
1504
+ return (jsxRuntimeExports.jsx("span", { className: className, children: segments.map((segment, index) => {
1505
+ const path = '/' + segments.slice(0, index + 1).join('.');
1506
+ const isLast = index === segments.length - 1;
1507
+ 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));
1508
+ }) }));
1509
+ }
1510
+ function StatItem({ label, verified }) {
1511
+ 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' })] }));
1512
+ }
1513
+ // =============================================================================
1514
+ // Main Component
1515
+ // =============================================================================
1516
+ function ProfileCard({ user, variant = 'full', photoWidth, showSocial = false, socialLinks, showRotatingInfo = false, photoSlot, className = '', onSocialClick, }) {
1517
+ const [showVerifiedPopup, setShowVerifiedPopup] = require$$0.useState(false);
1518
+ const [showSocialPopup, setShowSocialPopup] = require$$0.useState(false);
1519
+ const [showPhotoModal, setShowPhotoModal] = require$$0.useState(false);
1520
+ const [currentInfoIndex, setCurrentInfoIndex] = require$$0.useState(0);
1521
+ const [isDarkTheme, setIsDarkTheme] = require$$0.useState(true);
1522
+ const verifiedRef = require$$0.useRef(null);
1523
+ const socialRef = require$$0.useRef(null);
1524
+ // Calculate photo width based on variant
1525
+ const computedPhotoWidth = photoWidth ?? (variant === 'full' ? 280 : 200);
1526
+ // Detect theme
1527
+ require$$0.useEffect(() => {
1528
+ const checkTheme = () => {
1529
+ const theme = document.documentElement.getAttribute('data-theme');
1530
+ setIsDarkTheme(theme !== 'light');
1531
+ };
1532
+ checkTheme();
1533
+ const observer = new MutationObserver((mutations) => {
1534
+ mutations.forEach((mutation) => {
1535
+ if (mutation.attributeName === 'data-theme') {
1536
+ checkTheme();
1537
+ }
1538
+ });
1539
+ });
1540
+ observer.observe(document.documentElement, { attributes: true, attributeFilter: ['data-theme'] });
1541
+ return () => observer.disconnect();
1542
+ }, []);
1543
+ // Dynamic info texts for rotating display
1544
+ const infoTexts = [
1545
+ `Member since ${new Date(user.created_at).getFullYear()}`,
1546
+ ...(user.registration_sequence ? [`User #${user.registration_sequence.toLocaleString()}`] : []),
1547
+ ...(user.verified >= 1 ? ['Email Verified'] : []),
1548
+ ...(user.verified >= 2 ? ['Identity Verified'] : []),
1549
+ ...(user.verified >= 3 ? ['Area Verified'] : []),
1550
+ // PROC-013: Show MFA status when enabled (highlight security-conscious users)
1551
+ ...(user.mfa_enabled === true ? ['2FA Ativado'] : []),
1552
+ ];
1553
+ // Rotate info text
1554
+ require$$0.useEffect(() => {
1555
+ if (!showRotatingInfo)
1556
+ return;
1557
+ const interval = setInterval(() => {
1558
+ setCurrentInfoIndex((prev) => (prev + 1) % infoTexts.length);
1559
+ }, 10000);
1560
+ return () => clearInterval(interval);
1561
+ }, [infoTexts.length, showRotatingInfo]);
1562
+ // Close popups on click outside
1563
+ require$$0.useEffect(() => {
1564
+ const handleClickOutside = (e) => {
1565
+ if (verifiedRef.current && !verifiedRef.current.contains(e.target)) {
1566
+ setShowVerifiedPopup(false);
1567
+ }
1568
+ if (socialRef.current && !socialRef.current.contains(e.target)) {
1569
+ setShowSocialPopup(false);
1570
+ }
1571
+ };
1572
+ document.addEventListener('click', handleClickOutside);
1573
+ return () => document.removeEventListener('click', handleClickOutside);
1574
+ }, []);
1575
+ // Get display values
1576
+ const displayName = user.full_name || user.username || 'User';
1577
+ // Always show profession_name (full name like "Developer") instead of code (like "DEV")
1578
+ const profession = user.profession_name || '';
1579
+ const getLocation = () => {
1580
+ if (!user.city_code && !user.state_code && !user.country_code)
1581
+ return null;
1582
+ const city = user.city_name || user.city_code?.toUpperCase() || '';
1583
+ const state = user.state_code?.toUpperCase() || '';
1584
+ const country = user.country_name || user.country_code?.toUpperCase() || '';
1585
+ const parts = [city, state, country].filter(Boolean);
1586
+ return parts.join(', ');
1587
+ };
1588
+ const memberSince = new Date(user.created_at).getFullYear().toString();
1589
+ const photoUrl = user.photo_url_medium || user.photo_url_full || getPlaceholderAvatar(isDarkTheme);
1590
+ // Full size photo for modal (prioritize full, then medium)
1591
+ const photoUrlFull = user.photo_url_full || user.photo_url_medium;
1592
+ const hasRealPhoto = !!(user.photo_url_medium || user.photo_url_full);
1593
+ 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 ${hasRealPhoto ? 'mds-profile-card__avatar--clickable' : ''}`, onClick: hasRealPhoto ? () => setShowPhotoModal(true) : undefined, role: hasRealPhoto ? 'button' : undefined, tabIndex: hasRealPhoto ? 0 : undefined, onKeyDown: hasRealPhoto ? (e) => e.key === 'Enter' && setShowPhotoModal(true) : undefined })) }), showPhotoModal && photoUrlFull && (jsxRuntimeExports.jsxs("div", { className: "mds-profile-card__photo-modal", onClick: () => setShowPhotoModal(false), role: "dialog", "aria-modal": "true", "aria-label": "Enlarged photo - click anywhere to close", children: [jsxRuntimeExports.jsx("div", { className: "mds-profile-card__photo-modal-backdrop" }), jsxRuntimeExports.jsx("div", { className: "mds-profile-card__photo-modal-content", children: jsxRuntimeExports.jsx("img", { src: photoUrlFull, alt: displayName, className: "mds-profile-card__photo-modal-image" }) })] })), 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) => {
1594
+ e.stopPropagation();
1595
+ setShowVerifiedPopup(!showVerifiedPopup);
1596
+ }, 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: "Area Verified" })] })] })), showSocial && (jsxRuntimeExports.jsxs("div", { ref: socialRef, className: "mds-profile-card__social", children: [jsxRuntimeExports.jsx("button", { className: "mds-profile-card__social-trigger", onClick: (e) => {
1597
+ e.stopPropagation();
1598
+ setShowSocialPopup(!showSocialPopup);
1599
+ setShowVerifiedPopup(false);
1600
+ onSocialClick?.();
1601
+ }, "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) => {
1602
+ e.stopPropagation();
1603
+ setShowVerifiedPopup(!showVerifiedPopup);
1604
+ setShowSocialPopup(false);
1605
+ }, 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: "Area", 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))) }))] }))] })] }));
1606
+ }
1607
+
1461
1608
  const variantElementMap = {
1462
1609
  h1: 'h1',
1463
1610
  h2: 'h2',
@@ -1829,36 +1976,43 @@ function ThemeToggle({ size = 'md', className = '', disabled = false, onChange,
1829
1976
  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 }));
1830
1977
  }
1831
1978
 
1832
- const TableHeader = ({ columns, gridTemplate, onSort, sortColumn, sortDirection }) => {
1833
- return (jsxRuntimeExports.jsx("div", { role: "rowgroup", style: {
1979
+ const TableHeader = ({ columns, gridTemplate, onSort, sortColumn, sortDirection, hasActions = false }) => {
1980
+ return (jsxRuntimeExports.jsxs("div", { role: "rowgroup", style: {
1834
1981
  display: 'grid',
1835
1982
  gridTemplateColumns: gridTemplate,
1836
1983
  gap: '16px',
1837
1984
  padding: '16px 20px',
1838
1985
  borderBottom: '1px solid var(--border-color)',
1839
1986
  backgroundColor: 'rgba(255, 255, 255, 0.05)'
1840
- }, children: columns.map((column) => (jsxRuntimeExports.jsxs("div", { role: "columnheader", style: {
1841
- color: 'var(--text-primary)',
1842
- fontWeight: '500',
1843
- fontSize: '14px',
1844
- display: 'flex',
1845
- alignItems: 'center',
1846
- justifyContent: column.align === 'center' ? 'center' :
1847
- column.align === 'right' ? 'flex-end' : 'flex-start',
1848
- cursor: column.sortable && onSort ? 'pointer' : 'default',
1849
- gap: '4px',
1850
- transition: 'color 0.2s ease'
1851
- }, onClick: () => column.sortable && onSort && onSort(column.key), onMouseEnter: (e) => {
1852
- if (column.sortable && onSort) {
1853
- e.currentTarget.style.color = '#ffffff';
1854
- }
1855
- }, onMouseLeave: (e) => {
1856
- e.currentTarget.style.color = 'var(--text-primary)';
1857
- }, children: [column.label, column.sortable && onSort && (jsxRuntimeExports.jsx("span", { style: {
1858
- fontSize: '12px',
1859
- opacity: sortColumn === column.key ? 1 : 0.5
1860
- }, children: sortColumn === column.key ?
1861
- (sortDirection === 'asc' ? '↑' : '↓') : '↕' }))] }, column.key))) }));
1987
+ }, children: [columns.map((column) => (jsxRuntimeExports.jsxs("div", { role: "columnheader", style: {
1988
+ color: 'var(--text-primary)',
1989
+ fontWeight: '500',
1990
+ fontSize: '14px',
1991
+ display: 'flex',
1992
+ alignItems: 'center',
1993
+ justifyContent: column.align === 'center' ? 'center' :
1994
+ column.align === 'right' ? 'flex-end' : 'flex-start',
1995
+ cursor: column.sortable && onSort ? 'pointer' : 'default',
1996
+ gap: '4px',
1997
+ transition: 'color 0.2s ease'
1998
+ }, onClick: () => column.sortable && onSort && onSort(column.key), onMouseEnter: (e) => {
1999
+ if (column.sortable && onSort) {
2000
+ e.currentTarget.style.color = '#ffffff';
2001
+ }
2002
+ }, onMouseLeave: (e) => {
2003
+ e.currentTarget.style.color = 'var(--text-primary)';
2004
+ }, children: [column.label, column.sortable && onSort && (jsxRuntimeExports.jsx("span", { style: {
2005
+ fontSize: '12px',
2006
+ opacity: sortColumn === column.key ? 1 : 0.5
2007
+ }, children: sortColumn === column.key ?
2008
+ (sortDirection === 'asc' ? '↑' : '↓') : '↕' }))] }, column.key))), hasActions && (jsxRuntimeExports.jsx("div", { role: "columnheader", style: {
2009
+ color: 'var(--text-primary)',
2010
+ fontWeight: '500',
2011
+ fontSize: '14px',
2012
+ display: 'flex',
2013
+ alignItems: 'center',
2014
+ justifyContent: 'center'
2015
+ }, children: "Actions" }))] }));
1862
2016
  };
1863
2017
 
1864
2018
  const TableRow = ({ item, index, columns, actions = [], gridTemplate, isLast, variant, onActionClick }) => {
@@ -1896,10 +2050,9 @@ const TableRow = ({ item, index, columns, actions = [], gridTemplate, isLast, va
1896
2050
  const isLoading = action.loading?.(item) || false;
1897
2051
  return (jsxRuntimeExports.jsxs("button", { onClick: () => !isDisabled && !isLoading && onActionClick(action, item), disabled: isDisabled || isLoading, style: {
1898
2052
  background: 'none',
1899
- border: action.variant === 'danger' ? '1px solid rgba(239, 68, 68, 0.3)' :
1900
- '1px solid var(--border-color)',
2053
+ border: 'none',
1901
2054
  borderRadius: '6px',
1902
- padding: '6px 12px',
2055
+ padding: '6px 8px',
1903
2056
  color: action.variant === 'danger' ? '#f87171' : 'var(--text-primary)',
1904
2057
  fontSize: '12px',
1905
2058
  cursor: isDisabled || isLoading ? 'not-allowed' : 'pointer',
@@ -1913,18 +2066,14 @@ const TableRow = ({ item, index, columns, actions = [], gridTemplate, isLast, va
1913
2066
  if (!isDisabled && !isLoading) {
1914
2067
  if (action.variant === 'danger') {
1915
2068
  e.currentTarget.style.backgroundColor = 'rgba(239, 68, 68, 0.1)';
1916
- e.currentTarget.style.borderColor = 'rgba(239, 68, 68, 0.5)';
1917
2069
  }
1918
2070
  else {
1919
2071
  e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.1)';
1920
- e.currentTarget.style.borderColor = 'var(--text-primary)';
1921
2072
  }
1922
2073
  }
1923
2074
  }, onMouseLeave: (e) => {
1924
2075
  if (!isDisabled && !isLoading) {
1925
2076
  e.currentTarget.style.backgroundColor = 'transparent';
1926
- e.currentTarget.style.borderColor = action.variant === 'danger' ?
1927
- 'rgba(239, 68, 68, 0.3)' : 'var(--border-color)';
1928
2077
  }
1929
2078
  }, children: [action.icon && action.icon, action.label] }, action.key));
1930
2079
  }) }))] }));
@@ -2024,7 +2173,7 @@ const DataTable = ({ data, columns, loading = false, searchTerm = '', actions =
2024
2173
  color: 'var(--text-secondary)',
2025
2174
  fontSize: '14px',
2026
2175
  borderBottom: '1px solid var(--border-color)'
2027
- }, 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: {
2176
+ }, 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: {
2028
2177
  maxHeight,
2029
2178
  overflowY: 'auto'
2030
2179
  }, 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))) })] }));
@@ -2432,6 +2581,157 @@ const getTableConfig = (type) => {
2432
2581
  }
2433
2582
  };
2434
2583
 
2584
+ /**
2585
+ * FormField - Normalized wrapper for form inputs
2586
+ *
2587
+ * Pattern extracted from AdminUserModal.tsx (backoffice/users)
2588
+ * Provides consistent label, error, and helper text styling
2589
+ */
2590
+ function FormField({ label, required = false, error, helper, disabled = false, children, className = '' }) {
2591
+ return (jsxRuntimeExports.jsxs("div", { className: `mds-form-field ${className}`, style: { opacity: disabled ? 0.6 : 1 }, children: [jsxRuntimeExports.jsxs("label", { style: {
2592
+ display: 'block',
2593
+ marginBottom: '6px',
2594
+ color: 'var(--mds-color-text-primary, var(--text-primary))',
2595
+ fontSize: '0.9rem',
2596
+ fontWeight: 500
2597
+ }, children: [label, required && (jsxRuntimeExports.jsx("span", { style: { color: 'var(--mds-color-error, #ef4444)', marginLeft: '4px' }, children: "*" }))] }), children, error && (jsxRuntimeExports.jsx("span", { style: {
2598
+ color: 'var(--mds-color-error, #ef4444)',
2599
+ fontSize: '0.8rem',
2600
+ marginTop: '4px',
2601
+ display: 'block'
2602
+ }, children: error })), helper && !error && (jsxRuntimeExports.jsx("span", { style: {
2603
+ color: 'var(--mds-color-text-secondary, var(--text-secondary))',
2604
+ fontSize: '0.75rem',
2605
+ marginTop: '4px',
2606
+ display: 'block'
2607
+ }, children: helper }))] }));
2608
+ }
2609
+
2610
+ const gapValues = {
2611
+ sm: '12px',
2612
+ md: '16px',
2613
+ lg: '24px'
2614
+ };
2615
+ /**
2616
+ * FormGrid - Normalized grid layout for form fields
2617
+ *
2618
+ * Pattern extracted from AdminUserModal.tsx (backoffice/users)
2619
+ * Provides consistent 1 or 2 column layouts with proper gap
2620
+ */
2621
+ function FormGrid({ columns = 1, gap = 'md', children, className = '' }) {
2622
+ return (jsxRuntimeExports.jsx("div", { className: `mds-form-grid ${className}`, style: {
2623
+ display: 'grid',
2624
+ gridTemplateColumns: columns === 2 ? 'repeat(2, 1fr)' : '1fr',
2625
+ gap: gapValues[gap]
2626
+ }, children: children }));
2627
+ }
2628
+
2629
+ /**
2630
+ * FormSection - Normalized section wrapper for grouping form fields
2631
+ *
2632
+ * Pattern extracted from AdminUserModal.tsx (backoffice/users)
2633
+ * Provides consistent section headers and spacing
2634
+ */
2635
+ function FormSection({ title, description, children, className = '' }) {
2636
+ return (jsxRuntimeExports.jsxs("div", { className: `mds-form-section ${className}`, style: {
2637
+ marginBottom: '24px'
2638
+ }, children: [title && (jsxRuntimeExports.jsx("h4", { style: {
2639
+ margin: '0 0 8px 0',
2640
+ color: 'var(--mds-color-text-primary, var(--text-primary))',
2641
+ fontSize: '1rem',
2642
+ fontWeight: 600,
2643
+ letterSpacing: '-0.02em'
2644
+ }, children: title })), description && (jsxRuntimeExports.jsx("p", { style: {
2645
+ margin: '0 0 16px 0',
2646
+ color: 'var(--mds-color-text-secondary, var(--text-secondary))',
2647
+ fontSize: '0.85rem',
2648
+ lineHeight: 1.5
2649
+ }, children: description })), jsxRuntimeExports.jsx("div", { style: { display: 'flex', flexDirection: 'column', gap: '16px' }, children: children })] }));
2650
+ }
2651
+
2652
+ const variantColors = {
2653
+ default: {
2654
+ bg: 'rgba(255, 255, 255, 0.03)',
2655
+ border: 'rgba(255, 255, 255, 0.1)',
2656
+ accent: 'var(--mds-color-text-secondary, #888)'
2657
+ },
2658
+ info: {
2659
+ bg: 'rgba(59, 130, 246, 0.1)',
2660
+ border: 'rgba(59, 130, 246, 0.2)',
2661
+ accent: 'var(--mds-color-info, #3b82f6)'
2662
+ },
2663
+ success: {
2664
+ bg: 'rgba(16, 185, 129, 0.1)',
2665
+ border: 'rgba(16, 185, 129, 0.2)',
2666
+ accent: 'var(--mds-color-success, #10b981)'
2667
+ },
2668
+ warning: {
2669
+ bg: 'rgba(245, 158, 11, 0.1)',
2670
+ border: 'rgba(245, 158, 11, 0.2)',
2671
+ accent: 'var(--mds-color-warning, #f59e0b)'
2672
+ },
2673
+ danger: {
2674
+ bg: 'rgba(239, 68, 68, 0.1)',
2675
+ border: 'rgba(239, 68, 68, 0.2)',
2676
+ accent: 'var(--mds-color-error, #ef4444)'
2677
+ }
2678
+ };
2679
+ /**
2680
+ * InfoBox - Normalized info/alert box for read-only information
2681
+ *
2682
+ * Pattern extracted from AdminUserModal.tsx (backoffice/users)
2683
+ * Provides consistent info boxes for alerts, status displays, and read-only data
2684
+ *
2685
+ * @example
2686
+ * // Alert style (with accent)
2687
+ * <InfoBox variant="info" accent>
2688
+ * An invitation email will be sent...
2689
+ * </InfoBox>
2690
+ *
2691
+ * @example
2692
+ * // Status display (default)
2693
+ * <InfoBox title="User Information">
2694
+ * <InfoRow label="Status" value="Active" />
2695
+ * <InfoRow label="Created" value="Jan 1, 2024" />
2696
+ * </InfoBox>
2697
+ */
2698
+ function InfoBox({ title, variant = 'default', accent = false, copyable = false, children, className = '' }) {
2699
+ const colors = variantColors[variant];
2700
+ const handleCopy = () => {
2701
+ if (!copyable)
2702
+ return;
2703
+ const text = typeof children === 'string' ? children : '';
2704
+ if (text) {
2705
+ navigator.clipboard.writeText(text);
2706
+ }
2707
+ };
2708
+ return (jsxRuntimeExports.jsxs("div", { className: `mds-info-box ${className}`, style: {
2709
+ padding: '12px 16px',
2710
+ backgroundColor: colors.bg,
2711
+ borderRadius: '8px',
2712
+ border: `1px solid ${colors.border}`,
2713
+ borderLeft: accent ? `4px solid ${colors.accent}` : `1px solid ${colors.border}`,
2714
+ cursor: copyable ? 'pointer' : 'default'
2715
+ }, onClick: copyable ? handleCopy : undefined, title: copyable ? 'Click to copy' : undefined, children: [title && (jsxRuntimeExports.jsx("div", { style: {
2716
+ color: 'var(--mds-color-text-secondary, var(--text-secondary))',
2717
+ fontSize: '0.85rem',
2718
+ marginBottom: '8px',
2719
+ fontWeight: 500
2720
+ }, children: title })), jsxRuntimeExports.jsx("div", { style: {
2721
+ color: 'var(--mds-color-text-primary, var(--text-primary))',
2722
+ fontSize: '0.9rem',
2723
+ lineHeight: 1.5
2724
+ }, children: children })] }));
2725
+ }
2726
+ function InfoRow({ label, value, valueColor }) {
2727
+ return (jsxRuntimeExports.jsxs("div", { style: {
2728
+ display: 'flex',
2729
+ justifyContent: 'space-between',
2730
+ fontSize: '0.85rem',
2731
+ padding: '2px 0'
2732
+ }, 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 })] }));
2733
+ }
2734
+
2435
2735
  /**
2436
2736
  * Theme-aware styles generator - Liquid Glass pattern
2437
2737
  *
@@ -2551,6 +2851,160 @@ function Modal({ open, onClose, closeOnOverlay = true, children, className, styl
2551
2851
  return reactDom.createPortal(content, document.body);
2552
2852
  }
2553
2853
 
2854
+ const sizeMap$1 = {
2855
+ sm: '400px',
2856
+ md: '480px',
2857
+ lg: '600px',
2858
+ xl: '800px'
2859
+ };
2860
+ /**
2861
+ * FormModal - Normalized template for CRUD modal forms
2862
+ *
2863
+ * Pattern extracted from AdminUserModal.tsx (backoffice/users)
2864
+ * Provides consistent structure for create/edit entity modals
2865
+ *
2866
+ * @example
2867
+ * <FormModal
2868
+ * open={showModal}
2869
+ * onClose={() => setShowModal(false)}
2870
+ * onSubmit={handleSubmit}
2871
+ * title="Edit User"
2872
+ * info="Changes will be saved immediately."
2873
+ * infoVariant="info"
2874
+ * loading={isSaving}
2875
+ * submitText="Save"
2876
+ * >
2877
+ * <FormField label="Name" required error={errors.name}>
2878
+ * <input className="mds-input" value={name} onChange={...} />
2879
+ * </FormField>
2880
+ * </FormModal>
2881
+ */
2882
+ function FormModal({ open, onClose, onSubmit, title, icon, subtitle, info, infoVariant = 'info', children, submitText = 'Save', cancelText = 'Cancel', loading = false, submitDisabled = false, size = 'md', className = '' }) {
2883
+ const handleSubmit = (e) => {
2884
+ e.preventDefault();
2885
+ onSubmit(e);
2886
+ };
2887
+ return (jsxRuntimeExports.jsxs(Modal, { open: open, onClose: onClose, closeOnOverlay: !loading, className: className, style: {
2888
+ maxWidth: sizeMap$1[size],
2889
+ maxHeight: '90vh',
2890
+ overflowY: 'auto',
2891
+ padding: '24px'
2892
+ }, children: [jsxRuntimeExports.jsxs("div", { style: {
2893
+ display: 'flex',
2894
+ alignItems: 'center',
2895
+ justifyContent: 'space-between',
2896
+ marginBottom: subtitle ? '8px' : '24px'
2897
+ }, children: [jsxRuntimeExports.jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '12px' }, children: [icon && (jsxRuntimeExports.jsx("div", { style: {
2898
+ display: 'flex',
2899
+ alignItems: 'center',
2900
+ justifyContent: 'center',
2901
+ width: 32,
2902
+ height: 32,
2903
+ fontSize: '1.25rem',
2904
+ lineHeight: 0,
2905
+ opacity: 0.5
2906
+ }, children: icon })), jsxRuntimeExports.jsx(Typography, { variant: "h3", color: "primary", style: { margin: 0 }, children: title })] }), jsxRuntimeExports.jsx("button", { type: "button", onClick: onClose, disabled: loading, style: {
2907
+ background: 'none',
2908
+ border: 'none',
2909
+ padding: '8px',
2910
+ cursor: loading ? 'not-allowed' : 'pointer',
2911
+ color: 'var(--mds-color-text-secondary)',
2912
+ opacity: loading ? 0.5 : 1,
2913
+ borderRadius: '6px',
2914
+ display: 'flex',
2915
+ alignItems: 'center',
2916
+ justifyContent: 'center',
2917
+ transition: 'all 0.2s ease'
2918
+ }, onMouseEnter: (e) => {
2919
+ if (!loading)
2920
+ e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.1)';
2921
+ }, onMouseLeave: (e) => {
2922
+ e.currentTarget.style.backgroundColor = 'transparent';
2923
+ }, "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: {
2924
+ display: 'flex',
2925
+ gap: '12px',
2926
+ justifyContent: 'flex-end',
2927
+ marginTop: '16px',
2928
+ paddingTop: '16px',
2929
+ borderTop: '1px solid rgba(255, 255, 255, 0.1)'
2930
+ }, 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 })] })] })] }));
2931
+ }
2932
+
2933
+ const sizeMap = {
2934
+ sm: '400px',
2935
+ md: '480px',
2936
+ lg: '600px',
2937
+ xl: '800px'
2938
+ };
2939
+ /**
2940
+ * DetailModal - Normalized template for read-only detail modals
2941
+ *
2942
+ * Pattern extracted from GeographyDetailsModal, AuditLogDetailModal (backoffice)
2943
+ * Provides consistent structure for viewing entity details
2944
+ *
2945
+ * @example
2946
+ * <DetailModal
2947
+ * open={showDetails}
2948
+ * onClose={() => setShowDetails(false)}
2949
+ * title="User Details"
2950
+ * subtitle="Created on Jan 1, 2024"
2951
+ * action={{
2952
+ * label: 'Edit',
2953
+ * onClick: handleEdit,
2954
+ * variant: 'primary'
2955
+ * }}
2956
+ * >
2957
+ * <InfoBox title="Basic Information">
2958
+ * <InfoRow label="Name" value={user.name} />
2959
+ * <InfoRow label="Email" value={user.email} />
2960
+ * </InfoBox>
2961
+ * </DetailModal>
2962
+ */
2963
+ function DetailModal({ open, onClose, title, icon, subtitle, children, closeText = 'Close', action, size = 'md', className = '' }) {
2964
+ return (jsxRuntimeExports.jsxs(Modal, { open: open, onClose: onClose, closeOnOverlay: true, className: className, style: {
2965
+ maxWidth: sizeMap[size],
2966
+ maxHeight: '90vh',
2967
+ overflowY: 'auto',
2968
+ padding: '24px'
2969
+ }, children: [jsxRuntimeExports.jsxs("div", { style: {
2970
+ display: 'flex',
2971
+ alignItems: 'center',
2972
+ justifyContent: 'space-between',
2973
+ marginBottom: subtitle ? '8px' : '24px'
2974
+ }, children: [jsxRuntimeExports.jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '12px' }, children: [icon && (jsxRuntimeExports.jsx("div", { style: {
2975
+ display: 'flex',
2976
+ alignItems: 'center',
2977
+ justifyContent: 'center',
2978
+ width: 32,
2979
+ height: 32,
2980
+ fontSize: '1.25rem',
2981
+ lineHeight: 0,
2982
+ opacity: 0.5
2983
+ }, children: icon })), jsxRuntimeExports.jsx(Typography, { variant: "h3", color: "primary", style: { margin: 0 }, children: title })] }), jsxRuntimeExports.jsx("button", { type: "button", onClick: onClose, style: {
2984
+ background: 'none',
2985
+ border: 'none',
2986
+ padding: '8px',
2987
+ cursor: 'pointer',
2988
+ color: 'var(--mds-color-text-secondary)',
2989
+ borderRadius: '6px',
2990
+ display: 'flex',
2991
+ alignItems: 'center',
2992
+ justifyContent: 'center',
2993
+ transition: 'all 0.2s ease'
2994
+ }, onMouseEnter: (e) => {
2995
+ e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.1)';
2996
+ }, onMouseLeave: (e) => {
2997
+ e.currentTarget.style.backgroundColor = 'transparent';
2998
+ }, "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: {
2999
+ display: 'flex',
3000
+ gap: '12px',
3001
+ justifyContent: 'flex-end',
3002
+ marginTop: '24px',
3003
+ paddingTop: '16px',
3004
+ borderTop: '1px solid rgba(255, 255, 255, 0.1)'
3005
+ }, 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 }))] })] }));
3006
+ }
3007
+
2554
3008
  function ModalHeader({ title, icon, onClose, closeAriaLabel = 'Fechar', align = 'center' }) {
2555
3009
  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" }) }));
2556
3010
  if (align === 'center') {
@@ -2565,7 +3019,8 @@ function ModalHeader({ title, icon, onClose, closeAriaLabel = 'Fechar', align =
2565
3019
  alignItems: 'center',
2566
3020
  justifyContent: 'center',
2567
3021
  fontSize: '1.25rem',
2568
- lineHeight: 0
3022
+ lineHeight: 0,
3023
+ opacity: 0.5
2569
3024
  };
2570
3025
  const closeBox = {
2571
3026
  position: 'absolute',
@@ -2597,7 +3052,7 @@ function ModalHeader({ title, icon, onClose, closeAriaLabel = 'Fechar', align =
2597
3052
  padding: '16px 24px',
2598
3053
  marginBottom: 16,
2599
3054
  borderBottom: '1px solid var(--border-color)'
2600
- }, 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 }))] }));
3055
+ }, 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 }))] }));
2601
3056
  }
2602
3057
 
2603
3058
  function ModalBody({ children, style, className }) {
@@ -2629,11 +3084,19 @@ exports.Button = Button;
2629
3084
  exports.CellRenderers = CellRenderers;
2630
3085
  exports.ConfirmDialog = ConfirmDialog;
2631
3086
  exports.DataTable = DataTable;
3087
+ exports.DetailModal = DetailModal;
3088
+ exports.FormField = FormField;
3089
+ exports.FormGrid = FormGrid;
3090
+ exports.FormModal = FormModal;
3091
+ exports.FormSection = FormSection;
2632
3092
  exports.GlassCard = GlassCard;
3093
+ exports.InfoBox = InfoBox;
3094
+ exports.InfoRow = InfoRow;
2633
3095
  exports.Modal = Modal;
2634
3096
  exports.ModalBody = ModalBody;
2635
3097
  exports.ModalFooter = ModalFooter;
2636
3098
  exports.ModalHeader = ModalHeader;
3099
+ exports.ProfileCard = ProfileCard;
2637
3100
  exports.Select = Select;
2638
3101
  exports.TableHeader = TableHeader;
2639
3102
  exports.TableRow = TableRow;