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

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 +56 -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 +490 -37
  48. package/dist/react/index.esm.js.map +1 -1
  49. package/dist/react/index.js +497 -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,139 @@ 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
+ ];
1551
+ // Rotate info text
1552
+ require$$0.useEffect(() => {
1553
+ if (!showRotatingInfo)
1554
+ return;
1555
+ const interval = setInterval(() => {
1556
+ setCurrentInfoIndex((prev) => (prev + 1) % infoTexts.length);
1557
+ }, 10000);
1558
+ return () => clearInterval(interval);
1559
+ }, [infoTexts.length, showRotatingInfo]);
1560
+ // Close popups on click outside
1561
+ require$$0.useEffect(() => {
1562
+ const handleClickOutside = (e) => {
1563
+ if (verifiedRef.current && !verifiedRef.current.contains(e.target)) {
1564
+ setShowVerifiedPopup(false);
1565
+ }
1566
+ if (socialRef.current && !socialRef.current.contains(e.target)) {
1567
+ setShowSocialPopup(false);
1568
+ }
1569
+ };
1570
+ document.addEventListener('click', handleClickOutside);
1571
+ return () => document.removeEventListener('click', handleClickOutside);
1572
+ }, []);
1573
+ // Get display values
1574
+ const displayName = user.full_name || user.username || 'User';
1575
+ // Always show profession_name (full name like "Developer") instead of code (like "DEV")
1576
+ const profession = user.profession_name || '';
1577
+ const getLocation = () => {
1578
+ if (!user.city_code && !user.state_code && !user.country_code)
1579
+ return null;
1580
+ const city = user.city_name || user.city_code?.toUpperCase() || '';
1581
+ const state = user.state_code?.toUpperCase() || '';
1582
+ const country = user.country_name || user.country_code?.toUpperCase() || '';
1583
+ const parts = [city, state, country].filter(Boolean);
1584
+ return parts.join(', ');
1585
+ };
1586
+ const memberSince = new Date(user.created_at).getFullYear().toString();
1587
+ const photoUrl = user.photo_url_medium || user.photo_url_full || getPlaceholderAvatar(isDarkTheme);
1588
+ // Full size photo for modal (prioritize full, then medium)
1589
+ const photoUrlFull = user.photo_url_full || user.photo_url_medium;
1590
+ const hasRealPhoto = !!(user.photo_url_medium || user.photo_url_full);
1591
+ 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) => {
1592
+ e.stopPropagation();
1593
+ setShowVerifiedPopup(!showVerifiedPopup);
1594
+ }, 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) => {
1595
+ e.stopPropagation();
1596
+ setShowSocialPopup(!showSocialPopup);
1597
+ setShowVerifiedPopup(false);
1598
+ onSocialClick?.();
1599
+ }, "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) => {
1600
+ e.stopPropagation();
1601
+ setShowVerifiedPopup(!showVerifiedPopup);
1602
+ setShowSocialPopup(false);
1603
+ }, 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))) }))] }))] })] }));
1604
+ }
1605
+
1461
1606
  const variantElementMap = {
1462
1607
  h1: 'h1',
1463
1608
  h2: 'h2',
@@ -1829,36 +1974,43 @@ function ThemeToggle({ size = 'md', className = '', disabled = false, onChange,
1829
1974
  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
1975
  }
1831
1976
 
1832
- const TableHeader = ({ columns, gridTemplate, onSort, sortColumn, sortDirection }) => {
1833
- return (jsxRuntimeExports.jsx("div", { role: "rowgroup", style: {
1977
+ const TableHeader = ({ columns, gridTemplate, onSort, sortColumn, sortDirection, hasActions = false }) => {
1978
+ return (jsxRuntimeExports.jsxs("div", { role: "rowgroup", style: {
1834
1979
  display: 'grid',
1835
1980
  gridTemplateColumns: gridTemplate,
1836
1981
  gap: '16px',
1837
1982
  padding: '16px 20px',
1838
1983
  borderBottom: '1px solid var(--border-color)',
1839
1984
  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))) }));
1985
+ }, children: [columns.map((column) => (jsxRuntimeExports.jsxs("div", { role: "columnheader", style: {
1986
+ color: 'var(--text-primary)',
1987
+ fontWeight: '500',
1988
+ fontSize: '14px',
1989
+ display: 'flex',
1990
+ alignItems: 'center',
1991
+ justifyContent: column.align === 'center' ? 'center' :
1992
+ column.align === 'right' ? 'flex-end' : 'flex-start',
1993
+ cursor: column.sortable && onSort ? 'pointer' : 'default',
1994
+ gap: '4px',
1995
+ transition: 'color 0.2s ease'
1996
+ }, onClick: () => column.sortable && onSort && onSort(column.key), onMouseEnter: (e) => {
1997
+ if (column.sortable && onSort) {
1998
+ e.currentTarget.style.color = '#ffffff';
1999
+ }
2000
+ }, onMouseLeave: (e) => {
2001
+ e.currentTarget.style.color = 'var(--text-primary)';
2002
+ }, children: [column.label, column.sortable && onSort && (jsxRuntimeExports.jsx("span", { style: {
2003
+ fontSize: '12px',
2004
+ opacity: sortColumn === column.key ? 1 : 0.5
2005
+ }, children: sortColumn === column.key ?
2006
+ (sortDirection === 'asc' ? '↑' : '↓') : '↕' }))] }, column.key))), hasActions && (jsxRuntimeExports.jsx("div", { role: "columnheader", style: {
2007
+ color: 'var(--text-primary)',
2008
+ fontWeight: '500',
2009
+ fontSize: '14px',
2010
+ display: 'flex',
2011
+ alignItems: 'center',
2012
+ justifyContent: 'center'
2013
+ }, children: "Actions" }))] }));
1862
2014
  };
1863
2015
 
1864
2016
  const TableRow = ({ item, index, columns, actions = [], gridTemplate, isLast, variant, onActionClick }) => {
@@ -1896,10 +2048,9 @@ const TableRow = ({ item, index, columns, actions = [], gridTemplate, isLast, va
1896
2048
  const isLoading = action.loading?.(item) || false;
1897
2049
  return (jsxRuntimeExports.jsxs("button", { onClick: () => !isDisabled && !isLoading && onActionClick(action, item), disabled: isDisabled || isLoading, style: {
1898
2050
  background: 'none',
1899
- border: action.variant === 'danger' ? '1px solid rgba(239, 68, 68, 0.3)' :
1900
- '1px solid var(--border-color)',
2051
+ border: 'none',
1901
2052
  borderRadius: '6px',
1902
- padding: '6px 12px',
2053
+ padding: '6px 8px',
1903
2054
  color: action.variant === 'danger' ? '#f87171' : 'var(--text-primary)',
1904
2055
  fontSize: '12px',
1905
2056
  cursor: isDisabled || isLoading ? 'not-allowed' : 'pointer',
@@ -1913,18 +2064,14 @@ const TableRow = ({ item, index, columns, actions = [], gridTemplate, isLast, va
1913
2064
  if (!isDisabled && !isLoading) {
1914
2065
  if (action.variant === 'danger') {
1915
2066
  e.currentTarget.style.backgroundColor = 'rgba(239, 68, 68, 0.1)';
1916
- e.currentTarget.style.borderColor = 'rgba(239, 68, 68, 0.5)';
1917
2067
  }
1918
2068
  else {
1919
2069
  e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.1)';
1920
- e.currentTarget.style.borderColor = 'var(--text-primary)';
1921
2070
  }
1922
2071
  }
1923
2072
  }, onMouseLeave: (e) => {
1924
2073
  if (!isDisabled && !isLoading) {
1925
2074
  e.currentTarget.style.backgroundColor = 'transparent';
1926
- e.currentTarget.style.borderColor = action.variant === 'danger' ?
1927
- 'rgba(239, 68, 68, 0.3)' : 'var(--border-color)';
1928
2075
  }
1929
2076
  }, children: [action.icon && action.icon, action.label] }, action.key));
1930
2077
  }) }))] }));
@@ -2024,7 +2171,7 @@ const DataTable = ({ data, columns, loading = false, searchTerm = '', actions =
2024
2171
  color: 'var(--text-secondary)',
2025
2172
  fontSize: '14px',
2026
2173
  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: {
2174
+ }, 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
2175
  maxHeight,
2029
2176
  overflowY: 'auto'
2030
2177
  }, 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 +2579,157 @@ const getTableConfig = (type) => {
2432
2579
  }
2433
2580
  };
2434
2581
 
2582
+ /**
2583
+ * FormField - Normalized wrapper for form inputs
2584
+ *
2585
+ * Pattern extracted from AdminUserModal.tsx (backoffice/users)
2586
+ * Provides consistent label, error, and helper text styling
2587
+ */
2588
+ function FormField({ label, required = false, error, helper, disabled = false, children, className = '' }) {
2589
+ return (jsxRuntimeExports.jsxs("div", { className: `mds-form-field ${className}`, style: { opacity: disabled ? 0.6 : 1 }, children: [jsxRuntimeExports.jsxs("label", { style: {
2590
+ display: 'block',
2591
+ marginBottom: '6px',
2592
+ color: 'var(--mds-color-text-primary, var(--text-primary))',
2593
+ fontSize: '0.9rem',
2594
+ fontWeight: 500
2595
+ }, children: [label, required && (jsxRuntimeExports.jsx("span", { style: { color: 'var(--mds-color-error, #ef4444)', marginLeft: '4px' }, children: "*" }))] }), children, error && (jsxRuntimeExports.jsx("span", { style: {
2596
+ color: 'var(--mds-color-error, #ef4444)',
2597
+ fontSize: '0.8rem',
2598
+ marginTop: '4px',
2599
+ display: 'block'
2600
+ }, children: error })), helper && !error && (jsxRuntimeExports.jsx("span", { style: {
2601
+ color: 'var(--mds-color-text-secondary, var(--text-secondary))',
2602
+ fontSize: '0.75rem',
2603
+ marginTop: '4px',
2604
+ display: 'block'
2605
+ }, children: helper }))] }));
2606
+ }
2607
+
2608
+ const gapValues = {
2609
+ sm: '12px',
2610
+ md: '16px',
2611
+ lg: '24px'
2612
+ };
2613
+ /**
2614
+ * FormGrid - Normalized grid layout for form fields
2615
+ *
2616
+ * Pattern extracted from AdminUserModal.tsx (backoffice/users)
2617
+ * Provides consistent 1 or 2 column layouts with proper gap
2618
+ */
2619
+ function FormGrid({ columns = 1, gap = 'md', children, className = '' }) {
2620
+ return (jsxRuntimeExports.jsx("div", { className: `mds-form-grid ${className}`, style: {
2621
+ display: 'grid',
2622
+ gridTemplateColumns: columns === 2 ? 'repeat(2, 1fr)' : '1fr',
2623
+ gap: gapValues[gap]
2624
+ }, children: children }));
2625
+ }
2626
+
2627
+ /**
2628
+ * FormSection - Normalized section wrapper for grouping form fields
2629
+ *
2630
+ * Pattern extracted from AdminUserModal.tsx (backoffice/users)
2631
+ * Provides consistent section headers and spacing
2632
+ */
2633
+ function FormSection({ title, description, children, className = '' }) {
2634
+ return (jsxRuntimeExports.jsxs("div", { className: `mds-form-section ${className}`, style: {
2635
+ marginBottom: '24px'
2636
+ }, children: [title && (jsxRuntimeExports.jsx("h4", { style: {
2637
+ margin: '0 0 8px 0',
2638
+ color: 'var(--mds-color-text-primary, var(--text-primary))',
2639
+ fontSize: '1rem',
2640
+ fontWeight: 600,
2641
+ letterSpacing: '-0.02em'
2642
+ }, children: title })), description && (jsxRuntimeExports.jsx("p", { style: {
2643
+ margin: '0 0 16px 0',
2644
+ color: 'var(--mds-color-text-secondary, var(--text-secondary))',
2645
+ fontSize: '0.85rem',
2646
+ lineHeight: 1.5
2647
+ }, children: description })), jsxRuntimeExports.jsx("div", { style: { display: 'flex', flexDirection: 'column', gap: '16px' }, children: children })] }));
2648
+ }
2649
+
2650
+ const variantColors = {
2651
+ default: {
2652
+ bg: 'rgba(255, 255, 255, 0.03)',
2653
+ border: 'rgba(255, 255, 255, 0.1)',
2654
+ accent: 'var(--mds-color-text-secondary, #888)'
2655
+ },
2656
+ info: {
2657
+ bg: 'rgba(59, 130, 246, 0.1)',
2658
+ border: 'rgba(59, 130, 246, 0.2)',
2659
+ accent: 'var(--mds-color-info, #3b82f6)'
2660
+ },
2661
+ success: {
2662
+ bg: 'rgba(16, 185, 129, 0.1)',
2663
+ border: 'rgba(16, 185, 129, 0.2)',
2664
+ accent: 'var(--mds-color-success, #10b981)'
2665
+ },
2666
+ warning: {
2667
+ bg: 'rgba(245, 158, 11, 0.1)',
2668
+ border: 'rgba(245, 158, 11, 0.2)',
2669
+ accent: 'var(--mds-color-warning, #f59e0b)'
2670
+ },
2671
+ danger: {
2672
+ bg: 'rgba(239, 68, 68, 0.1)',
2673
+ border: 'rgba(239, 68, 68, 0.2)',
2674
+ accent: 'var(--mds-color-error, #ef4444)'
2675
+ }
2676
+ };
2677
+ /**
2678
+ * InfoBox - Normalized info/alert box for read-only information
2679
+ *
2680
+ * Pattern extracted from AdminUserModal.tsx (backoffice/users)
2681
+ * Provides consistent info boxes for alerts, status displays, and read-only data
2682
+ *
2683
+ * @example
2684
+ * // Alert style (with accent)
2685
+ * <InfoBox variant="info" accent>
2686
+ * An invitation email will be sent...
2687
+ * </InfoBox>
2688
+ *
2689
+ * @example
2690
+ * // Status display (default)
2691
+ * <InfoBox title="User Information">
2692
+ * <InfoRow label="Status" value="Active" />
2693
+ * <InfoRow label="Created" value="Jan 1, 2024" />
2694
+ * </InfoBox>
2695
+ */
2696
+ function InfoBox({ title, variant = 'default', accent = false, copyable = false, children, className = '' }) {
2697
+ const colors = variantColors[variant];
2698
+ const handleCopy = () => {
2699
+ if (!copyable)
2700
+ return;
2701
+ const text = typeof children === 'string' ? children : '';
2702
+ if (text) {
2703
+ navigator.clipboard.writeText(text);
2704
+ }
2705
+ };
2706
+ return (jsxRuntimeExports.jsxs("div", { className: `mds-info-box ${className}`, style: {
2707
+ padding: '12px 16px',
2708
+ backgroundColor: colors.bg,
2709
+ borderRadius: '8px',
2710
+ border: `1px solid ${colors.border}`,
2711
+ borderLeft: accent ? `4px solid ${colors.accent}` : `1px solid ${colors.border}`,
2712
+ cursor: copyable ? 'pointer' : 'default'
2713
+ }, onClick: copyable ? handleCopy : undefined, title: copyable ? 'Click to copy' : undefined, children: [title && (jsxRuntimeExports.jsx("div", { style: {
2714
+ color: 'var(--mds-color-text-secondary, var(--text-secondary))',
2715
+ fontSize: '0.85rem',
2716
+ marginBottom: '8px',
2717
+ fontWeight: 500
2718
+ }, children: title })), jsxRuntimeExports.jsx("div", { style: {
2719
+ color: 'var(--mds-color-text-primary, var(--text-primary))',
2720
+ fontSize: '0.9rem',
2721
+ lineHeight: 1.5
2722
+ }, children: children })] }));
2723
+ }
2724
+ function InfoRow({ label, value, valueColor }) {
2725
+ return (jsxRuntimeExports.jsxs("div", { style: {
2726
+ display: 'flex',
2727
+ justifyContent: 'space-between',
2728
+ fontSize: '0.85rem',
2729
+ padding: '2px 0'
2730
+ }, 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 })] }));
2731
+ }
2732
+
2435
2733
  /**
2436
2734
  * Theme-aware styles generator - Liquid Glass pattern
2437
2735
  *
@@ -2551,6 +2849,160 @@ function Modal({ open, onClose, closeOnOverlay = true, children, className, styl
2551
2849
  return reactDom.createPortal(content, document.body);
2552
2850
  }
2553
2851
 
2852
+ const sizeMap$1 = {
2853
+ sm: '400px',
2854
+ md: '480px',
2855
+ lg: '600px',
2856
+ xl: '800px'
2857
+ };
2858
+ /**
2859
+ * FormModal - Normalized template for CRUD modal forms
2860
+ *
2861
+ * Pattern extracted from AdminUserModal.tsx (backoffice/users)
2862
+ * Provides consistent structure for create/edit entity modals
2863
+ *
2864
+ * @example
2865
+ * <FormModal
2866
+ * open={showModal}
2867
+ * onClose={() => setShowModal(false)}
2868
+ * onSubmit={handleSubmit}
2869
+ * title="Edit User"
2870
+ * info="Changes will be saved immediately."
2871
+ * infoVariant="info"
2872
+ * loading={isSaving}
2873
+ * submitText="Save"
2874
+ * >
2875
+ * <FormField label="Name" required error={errors.name}>
2876
+ * <input className="mds-input" value={name} onChange={...} />
2877
+ * </FormField>
2878
+ * </FormModal>
2879
+ */
2880
+ function FormModal({ open, onClose, onSubmit, title, icon, subtitle, info, infoVariant = 'info', children, submitText = 'Save', cancelText = 'Cancel', loading = false, submitDisabled = false, size = 'md', className = '' }) {
2881
+ const handleSubmit = (e) => {
2882
+ e.preventDefault();
2883
+ onSubmit(e);
2884
+ };
2885
+ return (jsxRuntimeExports.jsxs(Modal, { open: open, onClose: onClose, closeOnOverlay: !loading, className: className, style: {
2886
+ maxWidth: sizeMap$1[size],
2887
+ maxHeight: '90vh',
2888
+ overflowY: 'auto',
2889
+ padding: '24px'
2890
+ }, children: [jsxRuntimeExports.jsxs("div", { style: {
2891
+ display: 'flex',
2892
+ alignItems: 'center',
2893
+ justifyContent: 'space-between',
2894
+ marginBottom: subtitle ? '8px' : '24px'
2895
+ }, children: [jsxRuntimeExports.jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '12px' }, children: [icon && (jsxRuntimeExports.jsx("div", { style: {
2896
+ display: 'flex',
2897
+ alignItems: 'center',
2898
+ justifyContent: 'center',
2899
+ width: 32,
2900
+ height: 32,
2901
+ fontSize: '1.25rem',
2902
+ lineHeight: 0,
2903
+ opacity: 0.5
2904
+ }, children: icon })), jsxRuntimeExports.jsx(Typography, { variant: "h3", color: "primary", style: { margin: 0 }, children: title })] }), jsxRuntimeExports.jsx("button", { type: "button", onClick: onClose, disabled: loading, style: {
2905
+ background: 'none',
2906
+ border: 'none',
2907
+ padding: '8px',
2908
+ cursor: loading ? 'not-allowed' : 'pointer',
2909
+ color: 'var(--mds-color-text-secondary)',
2910
+ opacity: loading ? 0.5 : 1,
2911
+ borderRadius: '6px',
2912
+ display: 'flex',
2913
+ alignItems: 'center',
2914
+ justifyContent: 'center',
2915
+ transition: 'all 0.2s ease'
2916
+ }, onMouseEnter: (e) => {
2917
+ if (!loading)
2918
+ e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.1)';
2919
+ }, onMouseLeave: (e) => {
2920
+ e.currentTarget.style.backgroundColor = 'transparent';
2921
+ }, "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: {
2922
+ display: 'flex',
2923
+ gap: '12px',
2924
+ justifyContent: 'flex-end',
2925
+ marginTop: '16px',
2926
+ paddingTop: '16px',
2927
+ borderTop: '1px solid rgba(255, 255, 255, 0.1)'
2928
+ }, 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 })] })] })] }));
2929
+ }
2930
+
2931
+ const sizeMap = {
2932
+ sm: '400px',
2933
+ md: '480px',
2934
+ lg: '600px',
2935
+ xl: '800px'
2936
+ };
2937
+ /**
2938
+ * DetailModal - Normalized template for read-only detail modals
2939
+ *
2940
+ * Pattern extracted from GeographyDetailsModal, AuditLogDetailModal (backoffice)
2941
+ * Provides consistent structure for viewing entity details
2942
+ *
2943
+ * @example
2944
+ * <DetailModal
2945
+ * open={showDetails}
2946
+ * onClose={() => setShowDetails(false)}
2947
+ * title="User Details"
2948
+ * subtitle="Created on Jan 1, 2024"
2949
+ * action={{
2950
+ * label: 'Edit',
2951
+ * onClick: handleEdit,
2952
+ * variant: 'primary'
2953
+ * }}
2954
+ * >
2955
+ * <InfoBox title="Basic Information">
2956
+ * <InfoRow label="Name" value={user.name} />
2957
+ * <InfoRow label="Email" value={user.email} />
2958
+ * </InfoBox>
2959
+ * </DetailModal>
2960
+ */
2961
+ function DetailModal({ open, onClose, title, icon, subtitle, children, closeText = 'Close', action, size = 'md', className = '' }) {
2962
+ return (jsxRuntimeExports.jsxs(Modal, { open: open, onClose: onClose, closeOnOverlay: true, className: className, style: {
2963
+ maxWidth: sizeMap[size],
2964
+ maxHeight: '90vh',
2965
+ overflowY: 'auto',
2966
+ padding: '24px'
2967
+ }, children: [jsxRuntimeExports.jsxs("div", { style: {
2968
+ display: 'flex',
2969
+ alignItems: 'center',
2970
+ justifyContent: 'space-between',
2971
+ marginBottom: subtitle ? '8px' : '24px'
2972
+ }, children: [jsxRuntimeExports.jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '12px' }, children: [icon && (jsxRuntimeExports.jsx("div", { style: {
2973
+ display: 'flex',
2974
+ alignItems: 'center',
2975
+ justifyContent: 'center',
2976
+ width: 32,
2977
+ height: 32,
2978
+ fontSize: '1.25rem',
2979
+ lineHeight: 0,
2980
+ opacity: 0.5
2981
+ }, children: icon })), jsxRuntimeExports.jsx(Typography, { variant: "h3", color: "primary", style: { margin: 0 }, children: title })] }), jsxRuntimeExports.jsx("button", { type: "button", onClick: onClose, style: {
2982
+ background: 'none',
2983
+ border: 'none',
2984
+ padding: '8px',
2985
+ cursor: 'pointer',
2986
+ color: 'var(--mds-color-text-secondary)',
2987
+ borderRadius: '6px',
2988
+ display: 'flex',
2989
+ alignItems: 'center',
2990
+ justifyContent: 'center',
2991
+ transition: 'all 0.2s ease'
2992
+ }, onMouseEnter: (e) => {
2993
+ e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.1)';
2994
+ }, onMouseLeave: (e) => {
2995
+ e.currentTarget.style.backgroundColor = 'transparent';
2996
+ }, "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: {
2997
+ display: 'flex',
2998
+ gap: '12px',
2999
+ justifyContent: 'flex-end',
3000
+ marginTop: '24px',
3001
+ paddingTop: '16px',
3002
+ borderTop: '1px solid rgba(255, 255, 255, 0.1)'
3003
+ }, 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 }))] })] }));
3004
+ }
3005
+
2554
3006
  function ModalHeader({ title, icon, onClose, closeAriaLabel = 'Fechar', align = 'center' }) {
2555
3007
  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
3008
  if (align === 'center') {
@@ -2565,7 +3017,8 @@ function ModalHeader({ title, icon, onClose, closeAriaLabel = 'Fechar', align =
2565
3017
  alignItems: 'center',
2566
3018
  justifyContent: 'center',
2567
3019
  fontSize: '1.25rem',
2568
- lineHeight: 0
3020
+ lineHeight: 0,
3021
+ opacity: 0.5
2569
3022
  };
2570
3023
  const closeBox = {
2571
3024
  position: 'absolute',
@@ -2597,7 +3050,7 @@ function ModalHeader({ title, icon, onClose, closeAriaLabel = 'Fechar', align =
2597
3050
  padding: '16px 24px',
2598
3051
  marginBottom: 16,
2599
3052
  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 }))] }));
3053
+ }, 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
3054
  }
2602
3055
 
2603
3056
  function ModalBody({ children, style, className }) {
@@ -2629,11 +3082,19 @@ exports.Button = Button;
2629
3082
  exports.CellRenderers = CellRenderers;
2630
3083
  exports.ConfirmDialog = ConfirmDialog;
2631
3084
  exports.DataTable = DataTable;
3085
+ exports.DetailModal = DetailModal;
3086
+ exports.FormField = FormField;
3087
+ exports.FormGrid = FormGrid;
3088
+ exports.FormModal = FormModal;
3089
+ exports.FormSection = FormSection;
2632
3090
  exports.GlassCard = GlassCard;
3091
+ exports.InfoBox = InfoBox;
3092
+ exports.InfoRow = InfoRow;
2633
3093
  exports.Modal = Modal;
2634
3094
  exports.ModalBody = ModalBody;
2635
3095
  exports.ModalFooter = ModalFooter;
2636
3096
  exports.ModalHeader = ModalHeader;
3097
+ exports.ProfileCard = ProfileCard;
2637
3098
  exports.Select = Select;
2638
3099
  exports.TableHeader = TableHeader;
2639
3100
  exports.TableRow = TableRow;