@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.
- package/README.md +2 -0
- package/dist/css/compat/back.css +12 -0
- package/dist/css/components.css +2285 -3
- package/dist/react/components/react/Button/Button.d.ts +1 -1
- package/dist/react/components/react/Button/Button.d.ts.map +1 -1
- package/dist/react/components/react/DataTable/DataTable.d.ts.map +1 -1
- package/dist/react/components/react/DataTable/TableHeader.d.ts.map +1 -1
- package/dist/react/components/react/DataTable/TableRow.d.ts.map +1 -1
- package/dist/react/components/react/DataTable/types.d.ts +2 -1
- package/dist/react/components/react/DataTable/types.d.ts.map +1 -1
- package/dist/react/components/react/DetailModal/DetailModal.d.ts +55 -0
- package/dist/react/components/react/DetailModal/DetailModal.d.ts.map +1 -0
- package/dist/react/components/react/DetailModal/index.d.ts +3 -0
- package/dist/react/components/react/DetailModal/index.d.ts.map +1 -0
- package/dist/react/components/react/FormField/FormField.d.ts +26 -0
- package/dist/react/components/react/FormField/FormField.d.ts.map +1 -0
- package/dist/react/components/react/FormField/index.d.ts +3 -0
- package/dist/react/components/react/FormField/index.d.ts.map +1 -0
- package/dist/react/components/react/FormGrid/FormGrid.d.ts +20 -0
- package/dist/react/components/react/FormGrid/FormGrid.d.ts.map +1 -0
- package/dist/react/components/react/FormGrid/index.d.ts +3 -0
- package/dist/react/components/react/FormGrid/index.d.ts.map +1 -0
- package/dist/react/components/react/FormModal/FormModal.d.ts +58 -0
- package/dist/react/components/react/FormModal/FormModal.d.ts.map +1 -0
- package/dist/react/components/react/FormModal/index.d.ts +3 -0
- package/dist/react/components/react/FormModal/index.d.ts.map +1 -0
- package/dist/react/components/react/FormSection/FormSection.d.ts +20 -0
- package/dist/react/components/react/FormSection/FormSection.d.ts.map +1 -0
- package/dist/react/components/react/FormSection/index.d.ts +3 -0
- package/dist/react/components/react/FormSection/index.d.ts.map +1 -0
- package/dist/react/components/react/GlassCard/GlassCard.d.ts +10 -0
- package/dist/react/components/react/GlassCard/GlassCard.d.ts.map +1 -1
- package/dist/react/components/react/GlassCard/index.d.ts +1 -1
- package/dist/react/components/react/GlassCard/index.d.ts.map +1 -1
- package/dist/react/components/react/InfoBox/InfoBox.d.ts +46 -0
- package/dist/react/components/react/InfoBox/InfoBox.d.ts.map +1 -0
- package/dist/react/components/react/InfoBox/index.d.ts +3 -0
- package/dist/react/components/react/InfoBox/index.d.ts.map +1 -0
- package/dist/react/components/react/Modal/ModalHeader.d.ts.map +1 -1
- package/dist/react/components/react/ProfileCard/ProfileCard.d.ts +57 -0
- package/dist/react/components/react/ProfileCard/ProfileCard.d.ts.map +1 -0
- package/dist/react/components/react/ProfileCard/index.d.ts +3 -0
- package/dist/react/components/react/ProfileCard/index.d.ts.map +1 -0
- package/dist/react/components/react/index.d.ts +14 -0
- package/dist/react/components/react/index.d.ts.map +1 -1
- package/dist/react/index.d.ts +32 -18
- package/dist/react/index.esm.js +492 -37
- package/dist/react/index.esm.js.map +1 -1
- package/dist/react/index.js +499 -36
- package/dist/react/index.js.map +1 -1
- package/package.json +2 -1
package/dist/react/index.esm.js
CHANGED
|
@@ -1385,14 +1385,26 @@ function cn(...classes) {
|
|
|
1385
1385
|
* </GlassCard>
|
|
1386
1386
|
* ```
|
|
1387
1387
|
*/
|
|
1388
|
-
const GlassCard = forwardRef(({ glassStyle = 'liquid', intensity = 'md', theme, variant = 'light', blur, opacity, children, className, enableHover = true, style, ...props }, ref) => {
|
|
1388
|
+
const GlassCard = forwardRef(({ glassStyle = 'liquid', intensity = 'md', theme, variant = 'light', blur, opacity, children, className, enableHover = true, cardVariant = 'default', style, ...props }, ref) => {
|
|
1389
1389
|
// Resolve theme from new prop or deprecated variant
|
|
1390
1390
|
const resolvedTheme = theme ?? variant;
|
|
1391
1391
|
// =====================
|
|
1392
1392
|
// LIQUID GLASS MODE
|
|
1393
1393
|
// =====================
|
|
1394
1394
|
if (glassStyle === 'liquid') {
|
|
1395
|
-
|
|
1395
|
+
// PROC-007: Card variant styles
|
|
1396
|
+
const variantStyles = {
|
|
1397
|
+
default: {},
|
|
1398
|
+
highlight: {
|
|
1399
|
+
borderLeft: '4px solid var(--mds-color-brand-primary, #0055FF)',
|
|
1400
|
+
boxShadow: '0 4px 20px rgba(0, 85, 255, 0.15)'
|
|
1401
|
+
},
|
|
1402
|
+
subtle: {
|
|
1403
|
+
background: 'rgba(255, 255, 255, 0.02)',
|
|
1404
|
+
border: '1px solid rgba(255, 255, 255, 0.05)'
|
|
1405
|
+
}
|
|
1406
|
+
};
|
|
1407
|
+
return (jsxRuntimeExports.jsx("div", { ref: ref, className: cn('mds-liquid-glass', `mds-liquid-glass--${intensity}`, `mds-liquid-glass--${cardVariant}`, !enableHover && 'mds-liquid-glass--no-hover', className), style: { ...variantStyles[cardVariant], ...style }, ...props, children: children }));
|
|
1396
1408
|
}
|
|
1397
1409
|
// =====================
|
|
1398
1410
|
// GLASS MODE (legacy)
|
|
@@ -1456,6 +1468,141 @@ const GlassCard = forwardRef(({ glassStyle = 'liquid', intensity = 'md', theme,
|
|
|
1456
1468
|
});
|
|
1457
1469
|
GlassCard.displayName = 'GlassCard';
|
|
1458
1470
|
|
|
1471
|
+
// Default placeholder avatar - adapts to theme with high transparency
|
|
1472
|
+
const getPlaceholderAvatar = (isDark) => {
|
|
1473
|
+
const bgColor = isDark ? 'rgba(26, 26, 46, 0.15)' : 'rgba(255, 255, 255, 0.1)';
|
|
1474
|
+
const fgColor = isDark ? 'rgba(255, 255, 255, 0.08)' : 'rgba(0, 0, 0, 0.06)';
|
|
1475
|
+
return 'data:image/svg+xml,' + encodeURIComponent(`
|
|
1476
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200" fill="none">
|
|
1477
|
+
<rect width="200" height="200" fill="${bgColor}"/>
|
|
1478
|
+
<circle cx="100" cy="80" r="40" fill="${fgColor}"/>
|
|
1479
|
+
<ellipse cx="100" cy="180" rx="60" ry="50" fill="${fgColor}"/>
|
|
1480
|
+
</svg>
|
|
1481
|
+
`);
|
|
1482
|
+
};
|
|
1483
|
+
// =============================================================================
|
|
1484
|
+
// Icons
|
|
1485
|
+
// =============================================================================
|
|
1486
|
+
const Icons = {
|
|
1487
|
+
shield: (jsxRuntimeExports.jsx("svg", { viewBox: "0 0 24 24", children: jsxRuntimeExports.jsx("path", { d: "M12 1L3 5v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V5l-9-4zm-2 16l-4-4 1.41-1.41L10 14.17l6.59-6.59L18 9l-8 8z", fill: "currentColor" }) })),
|
|
1488
|
+
plus: (jsxRuntimeExports.jsx("svg", { viewBox: "0 0 24 24", children: jsxRuntimeExports.jsx("path", { d: "M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z", fill: "currentColor" }) })),
|
|
1489
|
+
instagram: jsxRuntimeExports.jsx("path", { d: "M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zM12 0C8.741 0 8.333.014 7.053.072 2.695.272.273 2.69.073 7.052.014 8.333 0 8.741 0 12c0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98C8.333 23.986 8.741 24 12 24c3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98C15.668.014 15.259 0 12 0zm0 5.838a6.162 6.162 0 100 12.324 6.162 6.162 0 000-12.324zM12 16a4 4 0 110-8 4 4 0 010 8zm6.406-11.845a1.44 1.44 0 100 2.881 1.44 1.44 0 000-2.881z" }),
|
|
1490
|
+
x: jsxRuntimeExports.jsx("path", { d: "M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z" }),
|
|
1491
|
+
linkedin: jsxRuntimeExports.jsx("path", { d: "M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z" }),
|
|
1492
|
+
website: jsxRuntimeExports.jsx("path", { d: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39z" }),
|
|
1493
|
+
};
|
|
1494
|
+
function SocialLink({ href, title, icon }) {
|
|
1495
|
+
const iconPath = Icons[icon];
|
|
1496
|
+
if (!iconPath || typeof iconPath === 'object')
|
|
1497
|
+
return null;
|
|
1498
|
+
return (jsxRuntimeExports.jsx("a", { href: href, className: "mds-profile-card__social-link", title: title, target: "_blank", rel: "noopener noreferrer", children: jsxRuntimeExports.jsx("svg", { viewBox: "0 0 24 24", children: iconPath }) }));
|
|
1499
|
+
}
|
|
1500
|
+
function UsernameLinks({ username, className }) {
|
|
1501
|
+
const segments = username.split('.');
|
|
1502
|
+
return (jsxRuntimeExports.jsx("span", { className: className, children: segments.map((segment, index) => {
|
|
1503
|
+
const path = '/' + segments.slice(0, index + 1).join('.');
|
|
1504
|
+
const isLast = index === segments.length - 1;
|
|
1505
|
+
return (jsxRuntimeExports.jsxs(require$$0.Fragment, { children: [jsxRuntimeExports.jsx("a", { href: path, className: "mds-profile-card__username-link", title: path, children: segment }), !isLast && jsxRuntimeExports.jsx("span", { className: "mds-profile-card__username-separator", children: "." })] }, index));
|
|
1506
|
+
}) }));
|
|
1507
|
+
}
|
|
1508
|
+
function StatItem({ label, verified }) {
|
|
1509
|
+
return (jsxRuntimeExports.jsxs("div", { className: "mds-profile-card__stat-item", children: [jsxRuntimeExports.jsx("span", { className: "mds-profile-card__stat-label", children: label }), jsxRuntimeExports.jsx("span", { className: `mds-profile-card__stat-value ${verified ? 'mds-profile-card__stat-value--verified' : ''}`, children: verified ? 'Verified' : 'Not Verified' })] }));
|
|
1510
|
+
}
|
|
1511
|
+
// =============================================================================
|
|
1512
|
+
// Main Component
|
|
1513
|
+
// =============================================================================
|
|
1514
|
+
function ProfileCard({ user, variant = 'full', photoWidth, showSocial = false, socialLinks, showRotatingInfo = false, photoSlot, className = '', onSocialClick, }) {
|
|
1515
|
+
const [showVerifiedPopup, setShowVerifiedPopup] = useState(false);
|
|
1516
|
+
const [showSocialPopup, setShowSocialPopup] = useState(false);
|
|
1517
|
+
const [showPhotoModal, setShowPhotoModal] = useState(false);
|
|
1518
|
+
const [currentInfoIndex, setCurrentInfoIndex] = useState(0);
|
|
1519
|
+
const [isDarkTheme, setIsDarkTheme] = useState(true);
|
|
1520
|
+
const verifiedRef = useRef(null);
|
|
1521
|
+
const socialRef = useRef(null);
|
|
1522
|
+
// Calculate photo width based on variant
|
|
1523
|
+
const computedPhotoWidth = photoWidth ?? (variant === 'full' ? 280 : 200);
|
|
1524
|
+
// Detect theme
|
|
1525
|
+
useEffect(() => {
|
|
1526
|
+
const checkTheme = () => {
|
|
1527
|
+
const theme = document.documentElement.getAttribute('data-theme');
|
|
1528
|
+
setIsDarkTheme(theme !== 'light');
|
|
1529
|
+
};
|
|
1530
|
+
checkTheme();
|
|
1531
|
+
const observer = new MutationObserver((mutations) => {
|
|
1532
|
+
mutations.forEach((mutation) => {
|
|
1533
|
+
if (mutation.attributeName === 'data-theme') {
|
|
1534
|
+
checkTheme();
|
|
1535
|
+
}
|
|
1536
|
+
});
|
|
1537
|
+
});
|
|
1538
|
+
observer.observe(document.documentElement, { attributes: true, attributeFilter: ['data-theme'] });
|
|
1539
|
+
return () => observer.disconnect();
|
|
1540
|
+
}, []);
|
|
1541
|
+
// Dynamic info texts for rotating display
|
|
1542
|
+
const infoTexts = [
|
|
1543
|
+
`Member since ${new Date(user.created_at).getFullYear()}`,
|
|
1544
|
+
...(user.registration_sequence ? [`User #${user.registration_sequence.toLocaleString()}`] : []),
|
|
1545
|
+
...(user.verified >= 1 ? ['Email Verified'] : []),
|
|
1546
|
+
...(user.verified >= 2 ? ['Identity Verified'] : []),
|
|
1547
|
+
...(user.verified >= 3 ? ['Area Verified'] : []),
|
|
1548
|
+
// PROC-013: Show MFA status when enabled (highlight security-conscious users)
|
|
1549
|
+
...(user.mfa_enabled === true ? ['2FA Ativado'] : []),
|
|
1550
|
+
];
|
|
1551
|
+
// Rotate info text
|
|
1552
|
+
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
|
+
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
|
+
|
|
1459
1606
|
const variantElementMap = {
|
|
1460
1607
|
h1: 'h1',
|
|
1461
1608
|
h2: 'h2',
|
|
@@ -1827,36 +1974,43 @@ function ThemeToggle({ size = 'md', className = '', disabled = false, onChange,
|
|
|
1827
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 }));
|
|
1828
1975
|
}
|
|
1829
1976
|
|
|
1830
|
-
const TableHeader = ({ columns, gridTemplate, onSort, sortColumn, sortDirection }) => {
|
|
1831
|
-
return (jsxRuntimeExports.
|
|
1977
|
+
const TableHeader = ({ columns, gridTemplate, onSort, sortColumn, sortDirection, hasActions = false }) => {
|
|
1978
|
+
return (jsxRuntimeExports.jsxs("div", { role: "rowgroup", style: {
|
|
1832
1979
|
display: 'grid',
|
|
1833
1980
|
gridTemplateColumns: gridTemplate,
|
|
1834
1981
|
gap: '16px',
|
|
1835
1982
|
padding: '16px 20px',
|
|
1836
1983
|
borderBottom: '1px solid var(--border-color)',
|
|
1837
1984
|
backgroundColor: 'rgba(255, 255, 255, 0.05)'
|
|
1838
|
-
}, children: columns.map((column) => (jsxRuntimeExports.jsxs("div", { role: "columnheader", style: {
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
|
|
1849
|
-
|
|
1850
|
-
|
|
1851
|
-
|
|
1852
|
-
|
|
1853
|
-
|
|
1854
|
-
|
|
1855
|
-
|
|
1856
|
-
|
|
1857
|
-
|
|
1858
|
-
|
|
1859
|
-
|
|
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" }))] }));
|
|
1860
2014
|
};
|
|
1861
2015
|
|
|
1862
2016
|
const TableRow = ({ item, index, columns, actions = [], gridTemplate, isLast, variant, onActionClick }) => {
|
|
@@ -1894,10 +2048,9 @@ const TableRow = ({ item, index, columns, actions = [], gridTemplate, isLast, va
|
|
|
1894
2048
|
const isLoading = action.loading?.(item) || false;
|
|
1895
2049
|
return (jsxRuntimeExports.jsxs("button", { onClick: () => !isDisabled && !isLoading && onActionClick(action, item), disabled: isDisabled || isLoading, style: {
|
|
1896
2050
|
background: 'none',
|
|
1897
|
-
border:
|
|
1898
|
-
'1px solid var(--border-color)',
|
|
2051
|
+
border: 'none',
|
|
1899
2052
|
borderRadius: '6px',
|
|
1900
|
-
padding: '6px
|
|
2053
|
+
padding: '6px 8px',
|
|
1901
2054
|
color: action.variant === 'danger' ? '#f87171' : 'var(--text-primary)',
|
|
1902
2055
|
fontSize: '12px',
|
|
1903
2056
|
cursor: isDisabled || isLoading ? 'not-allowed' : 'pointer',
|
|
@@ -1911,18 +2064,14 @@ const TableRow = ({ item, index, columns, actions = [], gridTemplate, isLast, va
|
|
|
1911
2064
|
if (!isDisabled && !isLoading) {
|
|
1912
2065
|
if (action.variant === 'danger') {
|
|
1913
2066
|
e.currentTarget.style.backgroundColor = 'rgba(239, 68, 68, 0.1)';
|
|
1914
|
-
e.currentTarget.style.borderColor = 'rgba(239, 68, 68, 0.5)';
|
|
1915
2067
|
}
|
|
1916
2068
|
else {
|
|
1917
2069
|
e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.1)';
|
|
1918
|
-
e.currentTarget.style.borderColor = 'var(--text-primary)';
|
|
1919
2070
|
}
|
|
1920
2071
|
}
|
|
1921
2072
|
}, onMouseLeave: (e) => {
|
|
1922
2073
|
if (!isDisabled && !isLoading) {
|
|
1923
2074
|
e.currentTarget.style.backgroundColor = 'transparent';
|
|
1924
|
-
e.currentTarget.style.borderColor = action.variant === 'danger' ?
|
|
1925
|
-
'rgba(239, 68, 68, 0.3)' : 'var(--border-color)';
|
|
1926
2075
|
}
|
|
1927
2076
|
}, children: [action.icon && action.icon, action.label] }, action.key));
|
|
1928
2077
|
}) }))] }));
|
|
@@ -2022,7 +2171,7 @@ const DataTable = ({ data, columns, loading = false, searchTerm = '', actions =
|
|
|
2022
2171
|
color: 'var(--text-secondary)',
|
|
2023
2172
|
fontSize: '14px',
|
|
2024
2173
|
borderBottom: '1px solid var(--border-color)'
|
|
2025
|
-
}, children: ["Mostrando", ' ', jsxRuntimeExports.jsx("span", { style: { fontWeight: '500', color: 'var(--text-primary)' }, children: filteredData.length }), ' ', "de", ' ', jsxRuntimeExports.jsx("span", { style: { fontWeight: '500', color: 'var(--text-primary)' }, children: data.length }), ' ', "itens"] })), jsxRuntimeExports.jsx(TableHeader, { columns: columns, gridTemplate: gridTemplate, onSort: onSort ? handleSort : undefined, sortColumn: sortColumn, sortDirection: sortDirection }), jsxRuntimeExports.jsx("div", { role: "rowgroup", style: {
|
|
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: {
|
|
2026
2175
|
maxHeight,
|
|
2027
2176
|
overflowY: 'auto'
|
|
2028
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))) })] }));
|
|
@@ -2430,6 +2579,157 @@ const getTableConfig = (type) => {
|
|
|
2430
2579
|
}
|
|
2431
2580
|
};
|
|
2432
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
|
+
|
|
2433
2733
|
/**
|
|
2434
2734
|
* Theme-aware styles generator - Liquid Glass pattern
|
|
2435
2735
|
*
|
|
@@ -2549,6 +2849,160 @@ function Modal({ open, onClose, closeOnOverlay = true, children, className, styl
|
|
|
2549
2849
|
return createPortal(content, document.body);
|
|
2550
2850
|
}
|
|
2551
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
|
+
|
|
2552
3006
|
function ModalHeader({ title, icon, onClose, closeAriaLabel = 'Fechar', align = 'center' }) {
|
|
2553
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" }) }));
|
|
2554
3008
|
if (align === 'center') {
|
|
@@ -2563,7 +3017,8 @@ function ModalHeader({ title, icon, onClose, closeAriaLabel = 'Fechar', align =
|
|
|
2563
3017
|
alignItems: 'center',
|
|
2564
3018
|
justifyContent: 'center',
|
|
2565
3019
|
fontSize: '1.25rem',
|
|
2566
|
-
lineHeight: 0
|
|
3020
|
+
lineHeight: 0,
|
|
3021
|
+
opacity: 0.5
|
|
2567
3022
|
};
|
|
2568
3023
|
const closeBox = {
|
|
2569
3024
|
position: 'absolute',
|
|
@@ -2595,7 +3050,7 @@ function ModalHeader({ title, icon, onClose, closeAriaLabel = 'Fechar', align =
|
|
|
2595
3050
|
padding: '16px 24px',
|
|
2596
3051
|
marginBottom: 16,
|
|
2597
3052
|
borderBottom: '1px solid var(--border-color)'
|
|
2598
|
-
}, children: [icon && (jsxRuntimeExports.jsx("div", { "aria-hidden": true, style: { display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: 32, height: 32, fontSize: '1.25rem', lineHeight: 0 }, children: icon })), jsxRuntimeExports.jsx("div", { style: { margin: 0, fontSize: '1.125rem', fontWeight: 600, flex: 1 }, children: typeof title === 'string' ? (jsxRuntimeExports.jsx("h3", { style: { margin: 0 }, children: title })) : (title) }), onClose && (jsxRuntimeExports.jsx("button", { type: "button", "aria-label": closeAriaLabel, onClick: onClose, style: { marginLeft: 'auto', background: 'transparent', border: 'none', width: 32, height: 32, display: 'inline-flex', alignItems: 'center', justifyContent: 'center', cursor: 'pointer', lineHeight: 0 }, children: CloseIcon }))] }));
|
|
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 }))] }));
|
|
2599
3054
|
}
|
|
2600
3055
|
|
|
2601
3056
|
function ModalBody({ children, style, className }) {
|
|
@@ -2621,5 +3076,5 @@ function ConfirmDialog({ open, onClose, title, description, confirmText = 'Confi
|
|
|
2621
3076
|
return (jsxRuntimeExports.jsx(Modal, { open: open, onClose: onClose, closeOnOverlay: !disableOverlayClose, children: jsxRuntimeExports.jsxs("div", { className: "mds-modal-card", style: { maxWidth: 480, width: '100%' }, children: [jsxRuntimeExports.jsx(ModalHeader, { title: title, icon: icon ?? toneIcon[tone], onClose: onClose, align: "center" }), description && (jsxRuntimeExports.jsx("div", { style: { padding: '0 24px 16px 24px' }, children: description })), jsxRuntimeExports.jsxs("div", { style: { display: 'flex', gap: 12, justifyContent: 'flex-end', borderTop: '1px solid var(--border-color)', padding: '16px 24px', marginTop: 8 }, children: [jsxRuntimeExports.jsx("button", { type: "button", onClick: onClose, className: "mds-button mds-button--secondary", children: cancelText }), jsxRuntimeExports.jsx("button", { type: "button", onClick: onConfirm, disabled: loading, className: "mds-button mds-button--primary", children: loading ? 'Processando...' : confirmText })] })] }) }));
|
|
2622
3077
|
}
|
|
2623
3078
|
|
|
2624
|
-
export { ActionIcons, BrandLogo, Button, CellRenderers, ConfirmDialog, DataTable, GlassCard, Modal, ModalBody, ModalFooter, ModalHeader, Select, TableHeader, TableRow, ThemeToggle, Typography, auditLogTableConfig, citiesTableConfig, cn, countriesTableConfig, getTableConfig, parametersTableConfig, regionsTableConfig, statesTableConfig };
|
|
3079
|
+
export { ActionIcons, BrandLogo, Button, CellRenderers, ConfirmDialog, DataTable, DetailModal, FormField, FormGrid, FormModal, FormSection, GlassCard, InfoBox, InfoRow, Modal, ModalBody, ModalFooter, ModalHeader, ProfileCard, Select, TableHeader, TableRow, ThemeToggle, Typography, auditLogTableConfig, citiesTableConfig, cn, countriesTableConfig, getTableConfig, parametersTableConfig, regionsTableConfig, statesTableConfig };
|
|
2625
3080
|
//# sourceMappingURL=index.esm.js.map
|