@metropolle/design-system 1.2026.0-1.1.1728 → 1.2026.0-1.13.2314
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/css/compat/back.css +12 -0
- package/dist/css/components.css +2181 -2
- 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 +55 -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 +485 -38
- package/dist/react/index.esm.js.map +1 -1
- package/dist/react/index.js +492 -37
- package/dist/react/index.js.map +1 -1
- package/package.json +2 -1
package/dist/react/index.js
CHANGED
|
@@ -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
|
-
|
|
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,133 @@ 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 [currentInfoIndex, setCurrentInfoIndex] = require$$0.useState(0);
|
|
1520
|
+
const [isDarkTheme, setIsDarkTheme] = require$$0.useState(true);
|
|
1521
|
+
const verifiedRef = require$$0.useRef(null);
|
|
1522
|
+
const socialRef = require$$0.useRef(null);
|
|
1523
|
+
// Calculate photo width based on variant
|
|
1524
|
+
const computedPhotoWidth = photoWidth ?? (variant === 'full' ? 280 : 200);
|
|
1525
|
+
// Detect theme
|
|
1526
|
+
require$$0.useEffect(() => {
|
|
1527
|
+
const checkTheme = () => {
|
|
1528
|
+
const theme = document.documentElement.getAttribute('data-theme');
|
|
1529
|
+
setIsDarkTheme(theme !== 'light');
|
|
1530
|
+
};
|
|
1531
|
+
checkTheme();
|
|
1532
|
+
const observer = new MutationObserver((mutations) => {
|
|
1533
|
+
mutations.forEach((mutation) => {
|
|
1534
|
+
if (mutation.attributeName === 'data-theme') {
|
|
1535
|
+
checkTheme();
|
|
1536
|
+
}
|
|
1537
|
+
});
|
|
1538
|
+
});
|
|
1539
|
+
observer.observe(document.documentElement, { attributes: true, attributeFilter: ['data-theme'] });
|
|
1540
|
+
return () => observer.disconnect();
|
|
1541
|
+
}, []);
|
|
1542
|
+
// Dynamic info texts for rotating display
|
|
1543
|
+
const infoTexts = [
|
|
1544
|
+
`Member since ${new Date(user.created_at).getFullYear()}`,
|
|
1545
|
+
...(user.verified >= 1 ? ['Email Verified'] : []),
|
|
1546
|
+
...(user.verified >= 2 ? ['Identity Verified'] : []),
|
|
1547
|
+
...(user.verified >= 3 ? ['Professional Verified'] : []),
|
|
1548
|
+
];
|
|
1549
|
+
// Rotate info text
|
|
1550
|
+
require$$0.useEffect(() => {
|
|
1551
|
+
if (!showRotatingInfo)
|
|
1552
|
+
return;
|
|
1553
|
+
const interval = setInterval(() => {
|
|
1554
|
+
setCurrentInfoIndex((prev) => (prev + 1) % infoTexts.length);
|
|
1555
|
+
}, 10000);
|
|
1556
|
+
return () => clearInterval(interval);
|
|
1557
|
+
}, [infoTexts.length, showRotatingInfo]);
|
|
1558
|
+
// Close popups on click outside
|
|
1559
|
+
require$$0.useEffect(() => {
|
|
1560
|
+
const handleClickOutside = (e) => {
|
|
1561
|
+
if (verifiedRef.current && !verifiedRef.current.contains(e.target)) {
|
|
1562
|
+
setShowVerifiedPopup(false);
|
|
1563
|
+
}
|
|
1564
|
+
if (socialRef.current && !socialRef.current.contains(e.target)) {
|
|
1565
|
+
setShowSocialPopup(false);
|
|
1566
|
+
}
|
|
1567
|
+
};
|
|
1568
|
+
document.addEventListener('click', handleClickOutside);
|
|
1569
|
+
return () => document.removeEventListener('click', handleClickOutside);
|
|
1570
|
+
}, []);
|
|
1571
|
+
// Get display values
|
|
1572
|
+
const displayName = user.full_name || user.username || 'User';
|
|
1573
|
+
const profession = user.profession_name || user.profession_code || '';
|
|
1574
|
+
const getLocation = () => {
|
|
1575
|
+
if (!user.city_code && !user.state_code && !user.country_code)
|
|
1576
|
+
return null;
|
|
1577
|
+
const city = user.city_name || user.city_code?.toUpperCase() || '';
|
|
1578
|
+
const state = user.state_code?.toUpperCase() || '';
|
|
1579
|
+
const country = user.country_name || user.country_code?.toUpperCase() || '';
|
|
1580
|
+
const parts = [city, state, country].filter(Boolean);
|
|
1581
|
+
return parts.join(', ');
|
|
1582
|
+
};
|
|
1583
|
+
const memberSince = new Date(user.created_at).getFullYear().toString();
|
|
1584
|
+
const photoUrl = user.photo_url_medium || user.photo_url_full || getPlaceholderAvatar(isDarkTheme);
|
|
1585
|
+
return (jsxRuntimeExports.jsxs("article", { className: `mds-profile-card ${className}`, style: { '--mds-profile-card-photo-width': `${computedPhotoWidth}px` }, children: [jsxRuntimeExports.jsx("div", { className: "mds-profile-card__grain" }), jsxRuntimeExports.jsx("div", { className: "mds-profile-card__photo", children: photoSlot ? (jsxRuntimeExports.jsx("div", { className: "mds-profile-card__photo-slot", children: photoSlot })) : (jsxRuntimeExports.jsx("img", { src: photoUrl, alt: displayName, className: "mds-profile-card__avatar" })) }), jsxRuntimeExports.jsxs("div", { className: "mds-profile-card__content", children: [jsxRuntimeExports.jsxs("div", { className: "mds-profile-card__identity", children: [jsxRuntimeExports.jsx("h1", { className: "mds-profile-card__name", children: displayName.toUpperCase() }), variant === 'full' && profession && (jsxRuntimeExports.jsx("p", { className: "mds-profile-card__profession", children: profession.toUpperCase() })), variant === 'compact' && (jsxRuntimeExports.jsx(UsernameLinks, { username: user.username, className: "mds-profile-card__username" }))] }), jsxRuntimeExports.jsxs("div", { className: "mds-profile-card__details", children: [variant === 'full' && getLocation() && (jsxRuntimeExports.jsx("p", { className: "mds-profile-card__location", children: getLocation() })), variant === 'full' && (jsxRuntimeExports.jsx(UsernameLinks, { username: user.username, className: "mds-profile-card__username-detail" })), variant === 'compact' && user.email && (jsxRuntimeExports.jsx("p", { className: "mds-profile-card__email", children: user.email })), variant === 'compact' && (jsxRuntimeExports.jsxs("span", { className: "mds-profile-card__member", children: ["Member since ", memberSince] }))] }), variant === 'compact' && (jsxRuntimeExports.jsxs("div", { className: "mds-profile-card__verification", children: [jsxRuntimeExports.jsxs("button", { className: "mds-profile-card__verified-badge", title: `Verification Level ${user.verified}`, onClick: (e) => {
|
|
1586
|
+
e.stopPropagation();
|
|
1587
|
+
setShowVerifiedPopup(!showVerifiedPopup);
|
|
1588
|
+
}, children: [Icons.shield, jsxRuntimeExports.jsxs("span", { children: ["Level ", user.verified] })] }), jsxRuntimeExports.jsxs("div", { className: "mds-profile-card__dots", children: [jsxRuntimeExports.jsx("span", { className: `mds-profile-card__dot ${user.verified >= 1 ? 'active' : ''}`, title: "Email Verified" }), jsxRuntimeExports.jsx("span", { className: `mds-profile-card__dot ${user.verified >= 2 ? 'active' : ''}`, title: "Identity Verified" }), jsxRuntimeExports.jsx("span", { className: `mds-profile-card__dot ${user.verified >= 3 ? 'active' : ''}`, title: "Professional Verified" })] })] })), showSocial && (jsxRuntimeExports.jsxs("div", { ref: socialRef, className: "mds-profile-card__social", children: [jsxRuntimeExports.jsx("button", { className: "mds-profile-card__social-trigger", onClick: (e) => {
|
|
1589
|
+
e.stopPropagation();
|
|
1590
|
+
setShowSocialPopup(!showSocialPopup);
|
|
1591
|
+
setShowVerifiedPopup(false);
|
|
1592
|
+
onSocialClick?.();
|
|
1593
|
+
}, "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) => {
|
|
1594
|
+
e.stopPropagation();
|
|
1595
|
+
setShowVerifiedPopup(!showVerifiedPopup);
|
|
1596
|
+
setShowSocialPopup(false);
|
|
1597
|
+
}, title: "Verification Status", children: Icons.shield }), showVerifiedPopup && (jsxRuntimeExports.jsxs("div", { className: "mds-profile-card__verified-popup", children: [jsxRuntimeExports.jsxs("div", { className: "mds-profile-card__verified-header", children: ["Verification Level ", user.verified] }), jsxRuntimeExports.jsxs("div", { className: "mds-profile-card__verified-stats", children: [jsxRuntimeExports.jsx(StatItem, { label: "Email", verified: user.verified >= 1 }), jsxRuntimeExports.jsx(StatItem, { label: "Identity", verified: user.verified >= 2 }), jsxRuntimeExports.jsx(StatItem, { label: "Professional", verified: user.verified >= 3 })] }), jsxRuntimeExports.jsxs("div", { className: "mds-profile-card__verified-date", children: ["Since ", memberSince] })] }))] }), showRotatingInfo && (jsxRuntimeExports.jsx("div", { className: "mds-profile-card__info-dots", children: infoTexts.map((_, index) => (jsxRuntimeExports.jsx("span", { className: `mds-profile-card__info-dot ${index === currentInfoIndex ? 'active' : ''}` }, index))) }))] }))] })] }));
|
|
1598
|
+
}
|
|
1599
|
+
|
|
1461
1600
|
const variantElementMap = {
|
|
1462
1601
|
h1: 'h1',
|
|
1463
1602
|
h2: 'h2',
|
|
@@ -1829,36 +1968,43 @@ function ThemeToggle({ size = 'md', className = '', disabled = false, onChange,
|
|
|
1829
1968
|
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
1969
|
}
|
|
1831
1970
|
|
|
1832
|
-
const TableHeader = ({ columns, gridTemplate, onSort, sortColumn, sortDirection }) => {
|
|
1833
|
-
return (jsxRuntimeExports.
|
|
1971
|
+
const TableHeader = ({ columns, gridTemplate, onSort, sortColumn, sortDirection, hasActions = false }) => {
|
|
1972
|
+
return (jsxRuntimeExports.jsxs("div", { role: "rowgroup", style: {
|
|
1834
1973
|
display: 'grid',
|
|
1835
1974
|
gridTemplateColumns: gridTemplate,
|
|
1836
1975
|
gap: '16px',
|
|
1837
1976
|
padding: '16px 20px',
|
|
1838
1977
|
borderBottom: '1px solid var(--border-color)',
|
|
1839
1978
|
backgroundColor: 'rgba(255, 255, 255, 0.05)'
|
|
1840
|
-
}, children: columns.map((column) => (jsxRuntimeExports.jsxs("div", { role: "columnheader", style: {
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
|
|
1849
|
-
|
|
1850
|
-
|
|
1851
|
-
|
|
1852
|
-
|
|
1853
|
-
|
|
1854
|
-
|
|
1855
|
-
|
|
1856
|
-
|
|
1857
|
-
|
|
1858
|
-
|
|
1859
|
-
|
|
1860
|
-
|
|
1861
|
-
|
|
1979
|
+
}, children: [columns.map((column) => (jsxRuntimeExports.jsxs("div", { role: "columnheader", style: {
|
|
1980
|
+
color: 'var(--text-primary)',
|
|
1981
|
+
fontWeight: '500',
|
|
1982
|
+
fontSize: '14px',
|
|
1983
|
+
display: 'flex',
|
|
1984
|
+
alignItems: 'center',
|
|
1985
|
+
justifyContent: column.align === 'center' ? 'center' :
|
|
1986
|
+
column.align === 'right' ? 'flex-end' : 'flex-start',
|
|
1987
|
+
cursor: column.sortable && onSort ? 'pointer' : 'default',
|
|
1988
|
+
gap: '4px',
|
|
1989
|
+
transition: 'color 0.2s ease'
|
|
1990
|
+
}, onClick: () => column.sortable && onSort && onSort(column.key), onMouseEnter: (e) => {
|
|
1991
|
+
if (column.sortable && onSort) {
|
|
1992
|
+
e.currentTarget.style.color = '#ffffff';
|
|
1993
|
+
}
|
|
1994
|
+
}, onMouseLeave: (e) => {
|
|
1995
|
+
e.currentTarget.style.color = 'var(--text-primary)';
|
|
1996
|
+
}, children: [column.label, column.sortable && onSort && (jsxRuntimeExports.jsx("span", { style: {
|
|
1997
|
+
fontSize: '12px',
|
|
1998
|
+
opacity: sortColumn === column.key ? 1 : 0.5
|
|
1999
|
+
}, children: sortColumn === column.key ?
|
|
2000
|
+
(sortDirection === 'asc' ? '↑' : '↓') : '↕' }))] }, column.key))), hasActions && (jsxRuntimeExports.jsx("div", { role: "columnheader", style: {
|
|
2001
|
+
color: 'var(--text-primary)',
|
|
2002
|
+
fontWeight: '500',
|
|
2003
|
+
fontSize: '14px',
|
|
2004
|
+
display: 'flex',
|
|
2005
|
+
alignItems: 'center',
|
|
2006
|
+
justifyContent: 'center'
|
|
2007
|
+
}, children: "Actions" }))] }));
|
|
1862
2008
|
};
|
|
1863
2009
|
|
|
1864
2010
|
const TableRow = ({ item, index, columns, actions = [], gridTemplate, isLast, variant, onActionClick }) => {
|
|
@@ -1896,10 +2042,9 @@ const TableRow = ({ item, index, columns, actions = [], gridTemplate, isLast, va
|
|
|
1896
2042
|
const isLoading = action.loading?.(item) || false;
|
|
1897
2043
|
return (jsxRuntimeExports.jsxs("button", { onClick: () => !isDisabled && !isLoading && onActionClick(action, item), disabled: isDisabled || isLoading, style: {
|
|
1898
2044
|
background: 'none',
|
|
1899
|
-
border:
|
|
1900
|
-
'1px solid var(--border-color)',
|
|
2045
|
+
border: 'none',
|
|
1901
2046
|
borderRadius: '6px',
|
|
1902
|
-
padding: '6px
|
|
2047
|
+
padding: '6px 8px',
|
|
1903
2048
|
color: action.variant === 'danger' ? '#f87171' : 'var(--text-primary)',
|
|
1904
2049
|
fontSize: '12px',
|
|
1905
2050
|
cursor: isDisabled || isLoading ? 'not-allowed' : 'pointer',
|
|
@@ -1913,18 +2058,14 @@ const TableRow = ({ item, index, columns, actions = [], gridTemplate, isLast, va
|
|
|
1913
2058
|
if (!isDisabled && !isLoading) {
|
|
1914
2059
|
if (action.variant === 'danger') {
|
|
1915
2060
|
e.currentTarget.style.backgroundColor = 'rgba(239, 68, 68, 0.1)';
|
|
1916
|
-
e.currentTarget.style.borderColor = 'rgba(239, 68, 68, 0.5)';
|
|
1917
2061
|
}
|
|
1918
2062
|
else {
|
|
1919
2063
|
e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.1)';
|
|
1920
|
-
e.currentTarget.style.borderColor = 'var(--text-primary)';
|
|
1921
2064
|
}
|
|
1922
2065
|
}
|
|
1923
2066
|
}, onMouseLeave: (e) => {
|
|
1924
2067
|
if (!isDisabled && !isLoading) {
|
|
1925
2068
|
e.currentTarget.style.backgroundColor = 'transparent';
|
|
1926
|
-
e.currentTarget.style.borderColor = action.variant === 'danger' ?
|
|
1927
|
-
'rgba(239, 68, 68, 0.3)' : 'var(--border-color)';
|
|
1928
2069
|
}
|
|
1929
2070
|
}, children: [action.icon && action.icon, action.label] }, action.key));
|
|
1930
2071
|
}) }))] }));
|
|
@@ -2024,7 +2165,7 @@ const DataTable = ({ data, columns, loading = false, searchTerm = '', actions =
|
|
|
2024
2165
|
color: 'var(--text-secondary)',
|
|
2025
2166
|
fontSize: '14px',
|
|
2026
2167
|
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: {
|
|
2168
|
+
}, 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
2169
|
maxHeight,
|
|
2029
2170
|
overflowY: 'auto'
|
|
2030
2171
|
}, 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 +2573,157 @@ const getTableConfig = (type) => {
|
|
|
2432
2573
|
}
|
|
2433
2574
|
};
|
|
2434
2575
|
|
|
2576
|
+
/**
|
|
2577
|
+
* FormField - Normalized wrapper for form inputs
|
|
2578
|
+
*
|
|
2579
|
+
* Pattern extracted from AdminUserModal.tsx (backoffice/users)
|
|
2580
|
+
* Provides consistent label, error, and helper text styling
|
|
2581
|
+
*/
|
|
2582
|
+
function FormField({ label, required = false, error, helper, disabled = false, children, className = '' }) {
|
|
2583
|
+
return (jsxRuntimeExports.jsxs("div", { className: `mds-form-field ${className}`, style: { opacity: disabled ? 0.6 : 1 }, children: [jsxRuntimeExports.jsxs("label", { style: {
|
|
2584
|
+
display: 'block',
|
|
2585
|
+
marginBottom: '6px',
|
|
2586
|
+
color: 'var(--mds-color-text-primary, var(--text-primary))',
|
|
2587
|
+
fontSize: '0.9rem',
|
|
2588
|
+
fontWeight: 500
|
|
2589
|
+
}, children: [label, required && (jsxRuntimeExports.jsx("span", { style: { color: 'var(--mds-color-error, #ef4444)', marginLeft: '4px' }, children: "*" }))] }), children, error && (jsxRuntimeExports.jsx("span", { style: {
|
|
2590
|
+
color: 'var(--mds-color-error, #ef4444)',
|
|
2591
|
+
fontSize: '0.8rem',
|
|
2592
|
+
marginTop: '4px',
|
|
2593
|
+
display: 'block'
|
|
2594
|
+
}, children: error })), helper && !error && (jsxRuntimeExports.jsx("span", { style: {
|
|
2595
|
+
color: 'var(--mds-color-text-secondary, var(--text-secondary))',
|
|
2596
|
+
fontSize: '0.75rem',
|
|
2597
|
+
marginTop: '4px',
|
|
2598
|
+
display: 'block'
|
|
2599
|
+
}, children: helper }))] }));
|
|
2600
|
+
}
|
|
2601
|
+
|
|
2602
|
+
const gapValues = {
|
|
2603
|
+
sm: '12px',
|
|
2604
|
+
md: '16px',
|
|
2605
|
+
lg: '24px'
|
|
2606
|
+
};
|
|
2607
|
+
/**
|
|
2608
|
+
* FormGrid - Normalized grid layout for form fields
|
|
2609
|
+
*
|
|
2610
|
+
* Pattern extracted from AdminUserModal.tsx (backoffice/users)
|
|
2611
|
+
* Provides consistent 1 or 2 column layouts with proper gap
|
|
2612
|
+
*/
|
|
2613
|
+
function FormGrid({ columns = 1, gap = 'md', children, className = '' }) {
|
|
2614
|
+
return (jsxRuntimeExports.jsx("div", { className: `mds-form-grid ${className}`, style: {
|
|
2615
|
+
display: 'grid',
|
|
2616
|
+
gridTemplateColumns: columns === 2 ? 'repeat(2, 1fr)' : '1fr',
|
|
2617
|
+
gap: gapValues[gap]
|
|
2618
|
+
}, children: children }));
|
|
2619
|
+
}
|
|
2620
|
+
|
|
2621
|
+
/**
|
|
2622
|
+
* FormSection - Normalized section wrapper for grouping form fields
|
|
2623
|
+
*
|
|
2624
|
+
* Pattern extracted from AdminUserModal.tsx (backoffice/users)
|
|
2625
|
+
* Provides consistent section headers and spacing
|
|
2626
|
+
*/
|
|
2627
|
+
function FormSection({ title, description, children, className = '' }) {
|
|
2628
|
+
return (jsxRuntimeExports.jsxs("div", { className: `mds-form-section ${className}`, style: {
|
|
2629
|
+
marginBottom: '24px'
|
|
2630
|
+
}, children: [title && (jsxRuntimeExports.jsx("h4", { style: {
|
|
2631
|
+
margin: '0 0 8px 0',
|
|
2632
|
+
color: 'var(--mds-color-text-primary, var(--text-primary))',
|
|
2633
|
+
fontSize: '1rem',
|
|
2634
|
+
fontWeight: 600,
|
|
2635
|
+
letterSpacing: '-0.02em'
|
|
2636
|
+
}, children: title })), description && (jsxRuntimeExports.jsx("p", { style: {
|
|
2637
|
+
margin: '0 0 16px 0',
|
|
2638
|
+
color: 'var(--mds-color-text-secondary, var(--text-secondary))',
|
|
2639
|
+
fontSize: '0.85rem',
|
|
2640
|
+
lineHeight: 1.5
|
|
2641
|
+
}, children: description })), jsxRuntimeExports.jsx("div", { style: { display: 'flex', flexDirection: 'column', gap: '16px' }, children: children })] }));
|
|
2642
|
+
}
|
|
2643
|
+
|
|
2644
|
+
const variantColors = {
|
|
2645
|
+
default: {
|
|
2646
|
+
bg: 'rgba(255, 255, 255, 0.03)',
|
|
2647
|
+
border: 'rgba(255, 255, 255, 0.1)',
|
|
2648
|
+
accent: 'var(--mds-color-text-secondary, #888)'
|
|
2649
|
+
},
|
|
2650
|
+
info: {
|
|
2651
|
+
bg: 'rgba(59, 130, 246, 0.1)',
|
|
2652
|
+
border: 'rgba(59, 130, 246, 0.2)',
|
|
2653
|
+
accent: 'var(--mds-color-info, #3b82f6)'
|
|
2654
|
+
},
|
|
2655
|
+
success: {
|
|
2656
|
+
bg: 'rgba(16, 185, 129, 0.1)',
|
|
2657
|
+
border: 'rgba(16, 185, 129, 0.2)',
|
|
2658
|
+
accent: 'var(--mds-color-success, #10b981)'
|
|
2659
|
+
},
|
|
2660
|
+
warning: {
|
|
2661
|
+
bg: 'rgba(245, 158, 11, 0.1)',
|
|
2662
|
+
border: 'rgba(245, 158, 11, 0.2)',
|
|
2663
|
+
accent: 'var(--mds-color-warning, #f59e0b)'
|
|
2664
|
+
},
|
|
2665
|
+
danger: {
|
|
2666
|
+
bg: 'rgba(239, 68, 68, 0.1)',
|
|
2667
|
+
border: 'rgba(239, 68, 68, 0.2)',
|
|
2668
|
+
accent: 'var(--mds-color-error, #ef4444)'
|
|
2669
|
+
}
|
|
2670
|
+
};
|
|
2671
|
+
/**
|
|
2672
|
+
* InfoBox - Normalized info/alert box for read-only information
|
|
2673
|
+
*
|
|
2674
|
+
* Pattern extracted from AdminUserModal.tsx (backoffice/users)
|
|
2675
|
+
* Provides consistent info boxes for alerts, status displays, and read-only data
|
|
2676
|
+
*
|
|
2677
|
+
* @example
|
|
2678
|
+
* // Alert style (with accent)
|
|
2679
|
+
* <InfoBox variant="info" accent>
|
|
2680
|
+
* An invitation email will be sent...
|
|
2681
|
+
* </InfoBox>
|
|
2682
|
+
*
|
|
2683
|
+
* @example
|
|
2684
|
+
* // Status display (default)
|
|
2685
|
+
* <InfoBox title="User Information">
|
|
2686
|
+
* <InfoRow label="Status" value="Active" />
|
|
2687
|
+
* <InfoRow label="Created" value="Jan 1, 2024" />
|
|
2688
|
+
* </InfoBox>
|
|
2689
|
+
*/
|
|
2690
|
+
function InfoBox({ title, variant = 'default', accent = false, copyable = false, children, className = '' }) {
|
|
2691
|
+
const colors = variantColors[variant];
|
|
2692
|
+
const handleCopy = () => {
|
|
2693
|
+
if (!copyable)
|
|
2694
|
+
return;
|
|
2695
|
+
const text = typeof children === 'string' ? children : '';
|
|
2696
|
+
if (text) {
|
|
2697
|
+
navigator.clipboard.writeText(text);
|
|
2698
|
+
}
|
|
2699
|
+
};
|
|
2700
|
+
return (jsxRuntimeExports.jsxs("div", { className: `mds-info-box ${className}`, style: {
|
|
2701
|
+
padding: '12px 16px',
|
|
2702
|
+
backgroundColor: colors.bg,
|
|
2703
|
+
borderRadius: '8px',
|
|
2704
|
+
border: `1px solid ${colors.border}`,
|
|
2705
|
+
borderLeft: accent ? `4px solid ${colors.accent}` : `1px solid ${colors.border}`,
|
|
2706
|
+
cursor: copyable ? 'pointer' : 'default'
|
|
2707
|
+
}, onClick: copyable ? handleCopy : undefined, title: copyable ? 'Click to copy' : undefined, children: [title && (jsxRuntimeExports.jsx("div", { style: {
|
|
2708
|
+
color: 'var(--mds-color-text-secondary, var(--text-secondary))',
|
|
2709
|
+
fontSize: '0.85rem',
|
|
2710
|
+
marginBottom: '8px',
|
|
2711
|
+
fontWeight: 500
|
|
2712
|
+
}, children: title })), jsxRuntimeExports.jsx("div", { style: {
|
|
2713
|
+
color: 'var(--mds-color-text-primary, var(--text-primary))',
|
|
2714
|
+
fontSize: '0.9rem',
|
|
2715
|
+
lineHeight: 1.5
|
|
2716
|
+
}, children: children })] }));
|
|
2717
|
+
}
|
|
2718
|
+
function InfoRow({ label, value, valueColor }) {
|
|
2719
|
+
return (jsxRuntimeExports.jsxs("div", { style: {
|
|
2720
|
+
display: 'flex',
|
|
2721
|
+
justifyContent: 'space-between',
|
|
2722
|
+
fontSize: '0.85rem',
|
|
2723
|
+
padding: '2px 0'
|
|
2724
|
+
}, 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 })] }));
|
|
2725
|
+
}
|
|
2726
|
+
|
|
2435
2727
|
/**
|
|
2436
2728
|
* Theme-aware styles generator - Liquid Glass pattern
|
|
2437
2729
|
*
|
|
@@ -2466,7 +2758,7 @@ function getStyles(isDark) {
|
|
|
2466
2758
|
// Dark theme: subtle glass effect
|
|
2467
2759
|
background: isDark
|
|
2468
2760
|
? 'rgba(255, 255, 255, 0.03)'
|
|
2469
|
-
: 'rgba(255, 255, 255, 0.
|
|
2761
|
+
: 'rgba(255, 255, 255, 0.45)',
|
|
2470
2762
|
// Liquid Glass: Strong blur + saturation
|
|
2471
2763
|
backdropFilter: 'blur(var(--mds-liquid-blur-xl, 24px)) saturate(var(--mds-liquid-saturate-vibrant, 140%))',
|
|
2472
2764
|
WebkitBackdropFilter: 'blur(var(--mds-liquid-blur-xl, 24px)) saturate(var(--mds-liquid-saturate-vibrant, 140%))',
|
|
@@ -2551,6 +2843,160 @@ function Modal({ open, onClose, closeOnOverlay = true, children, className, styl
|
|
|
2551
2843
|
return reactDom.createPortal(content, document.body);
|
|
2552
2844
|
}
|
|
2553
2845
|
|
|
2846
|
+
const sizeMap$1 = {
|
|
2847
|
+
sm: '400px',
|
|
2848
|
+
md: '480px',
|
|
2849
|
+
lg: '600px',
|
|
2850
|
+
xl: '800px'
|
|
2851
|
+
};
|
|
2852
|
+
/**
|
|
2853
|
+
* FormModal - Normalized template for CRUD modal forms
|
|
2854
|
+
*
|
|
2855
|
+
* Pattern extracted from AdminUserModal.tsx (backoffice/users)
|
|
2856
|
+
* Provides consistent structure for create/edit entity modals
|
|
2857
|
+
*
|
|
2858
|
+
* @example
|
|
2859
|
+
* <FormModal
|
|
2860
|
+
* open={showModal}
|
|
2861
|
+
* onClose={() => setShowModal(false)}
|
|
2862
|
+
* onSubmit={handleSubmit}
|
|
2863
|
+
* title="Edit User"
|
|
2864
|
+
* info="Changes will be saved immediately."
|
|
2865
|
+
* infoVariant="info"
|
|
2866
|
+
* loading={isSaving}
|
|
2867
|
+
* submitText="Save"
|
|
2868
|
+
* >
|
|
2869
|
+
* <FormField label="Name" required error={errors.name}>
|
|
2870
|
+
* <input className="mds-input" value={name} onChange={...} />
|
|
2871
|
+
* </FormField>
|
|
2872
|
+
* </FormModal>
|
|
2873
|
+
*/
|
|
2874
|
+
function FormModal({ open, onClose, onSubmit, title, icon, subtitle, info, infoVariant = 'info', children, submitText = 'Save', cancelText = 'Cancel', loading = false, submitDisabled = false, size = 'md', className = '' }) {
|
|
2875
|
+
const handleSubmit = (e) => {
|
|
2876
|
+
e.preventDefault();
|
|
2877
|
+
onSubmit(e);
|
|
2878
|
+
};
|
|
2879
|
+
return (jsxRuntimeExports.jsxs(Modal, { open: open, onClose: onClose, closeOnOverlay: !loading, className: className, style: {
|
|
2880
|
+
maxWidth: sizeMap$1[size],
|
|
2881
|
+
maxHeight: '90vh',
|
|
2882
|
+
overflowY: 'auto',
|
|
2883
|
+
padding: '24px'
|
|
2884
|
+
}, children: [jsxRuntimeExports.jsxs("div", { style: {
|
|
2885
|
+
display: 'flex',
|
|
2886
|
+
alignItems: 'center',
|
|
2887
|
+
justifyContent: 'space-between',
|
|
2888
|
+
marginBottom: subtitle ? '8px' : '24px'
|
|
2889
|
+
}, children: [jsxRuntimeExports.jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '12px' }, children: [icon && (jsxRuntimeExports.jsx("div", { style: {
|
|
2890
|
+
display: 'flex',
|
|
2891
|
+
alignItems: 'center',
|
|
2892
|
+
justifyContent: 'center',
|
|
2893
|
+
width: 32,
|
|
2894
|
+
height: 32,
|
|
2895
|
+
fontSize: '1.25rem',
|
|
2896
|
+
lineHeight: 0,
|
|
2897
|
+
opacity: 0.5
|
|
2898
|
+
}, children: icon })), jsxRuntimeExports.jsx(Typography, { variant: "h3", color: "primary", style: { margin: 0 }, children: title })] }), jsxRuntimeExports.jsx("button", { type: "button", onClick: onClose, disabled: loading, style: {
|
|
2899
|
+
background: 'none',
|
|
2900
|
+
border: 'none',
|
|
2901
|
+
padding: '8px',
|
|
2902
|
+
cursor: loading ? 'not-allowed' : 'pointer',
|
|
2903
|
+
color: 'var(--mds-color-text-secondary)',
|
|
2904
|
+
opacity: loading ? 0.5 : 1,
|
|
2905
|
+
borderRadius: '6px',
|
|
2906
|
+
display: 'flex',
|
|
2907
|
+
alignItems: 'center',
|
|
2908
|
+
justifyContent: 'center',
|
|
2909
|
+
transition: 'all 0.2s ease'
|
|
2910
|
+
}, onMouseEnter: (e) => {
|
|
2911
|
+
if (!loading)
|
|
2912
|
+
e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.1)';
|
|
2913
|
+
}, onMouseLeave: (e) => {
|
|
2914
|
+
e.currentTarget.style.backgroundColor = 'transparent';
|
|
2915
|
+
}, "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: {
|
|
2916
|
+
display: 'flex',
|
|
2917
|
+
gap: '12px',
|
|
2918
|
+
justifyContent: 'flex-end',
|
|
2919
|
+
marginTop: '16px',
|
|
2920
|
+
paddingTop: '16px',
|
|
2921
|
+
borderTop: '1px solid rgba(255, 255, 255, 0.1)'
|
|
2922
|
+
}, 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 })] })] })] }));
|
|
2923
|
+
}
|
|
2924
|
+
|
|
2925
|
+
const sizeMap = {
|
|
2926
|
+
sm: '400px',
|
|
2927
|
+
md: '480px',
|
|
2928
|
+
lg: '600px',
|
|
2929
|
+
xl: '800px'
|
|
2930
|
+
};
|
|
2931
|
+
/**
|
|
2932
|
+
* DetailModal - Normalized template for read-only detail modals
|
|
2933
|
+
*
|
|
2934
|
+
* Pattern extracted from GeographyDetailsModal, AuditLogDetailModal (backoffice)
|
|
2935
|
+
* Provides consistent structure for viewing entity details
|
|
2936
|
+
*
|
|
2937
|
+
* @example
|
|
2938
|
+
* <DetailModal
|
|
2939
|
+
* open={showDetails}
|
|
2940
|
+
* onClose={() => setShowDetails(false)}
|
|
2941
|
+
* title="User Details"
|
|
2942
|
+
* subtitle="Created on Jan 1, 2024"
|
|
2943
|
+
* action={{
|
|
2944
|
+
* label: 'Edit',
|
|
2945
|
+
* onClick: handleEdit,
|
|
2946
|
+
* variant: 'primary'
|
|
2947
|
+
* }}
|
|
2948
|
+
* >
|
|
2949
|
+
* <InfoBox title="Basic Information">
|
|
2950
|
+
* <InfoRow label="Name" value={user.name} />
|
|
2951
|
+
* <InfoRow label="Email" value={user.email} />
|
|
2952
|
+
* </InfoBox>
|
|
2953
|
+
* </DetailModal>
|
|
2954
|
+
*/
|
|
2955
|
+
function DetailModal({ open, onClose, title, icon, subtitle, children, closeText = 'Close', action, size = 'md', className = '' }) {
|
|
2956
|
+
return (jsxRuntimeExports.jsxs(Modal, { open: open, onClose: onClose, closeOnOverlay: true, className: className, style: {
|
|
2957
|
+
maxWidth: sizeMap[size],
|
|
2958
|
+
maxHeight: '90vh',
|
|
2959
|
+
overflowY: 'auto',
|
|
2960
|
+
padding: '24px'
|
|
2961
|
+
}, children: [jsxRuntimeExports.jsxs("div", { style: {
|
|
2962
|
+
display: 'flex',
|
|
2963
|
+
alignItems: 'center',
|
|
2964
|
+
justifyContent: 'space-between',
|
|
2965
|
+
marginBottom: subtitle ? '8px' : '24px'
|
|
2966
|
+
}, children: [jsxRuntimeExports.jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '12px' }, children: [icon && (jsxRuntimeExports.jsx("div", { style: {
|
|
2967
|
+
display: 'flex',
|
|
2968
|
+
alignItems: 'center',
|
|
2969
|
+
justifyContent: 'center',
|
|
2970
|
+
width: 32,
|
|
2971
|
+
height: 32,
|
|
2972
|
+
fontSize: '1.25rem',
|
|
2973
|
+
lineHeight: 0,
|
|
2974
|
+
opacity: 0.5
|
|
2975
|
+
}, children: icon })), jsxRuntimeExports.jsx(Typography, { variant: "h3", color: "primary", style: { margin: 0 }, children: title })] }), jsxRuntimeExports.jsx("button", { type: "button", onClick: onClose, style: {
|
|
2976
|
+
background: 'none',
|
|
2977
|
+
border: 'none',
|
|
2978
|
+
padding: '8px',
|
|
2979
|
+
cursor: 'pointer',
|
|
2980
|
+
color: 'var(--mds-color-text-secondary)',
|
|
2981
|
+
borderRadius: '6px',
|
|
2982
|
+
display: 'flex',
|
|
2983
|
+
alignItems: 'center',
|
|
2984
|
+
justifyContent: 'center',
|
|
2985
|
+
transition: 'all 0.2s ease'
|
|
2986
|
+
}, onMouseEnter: (e) => {
|
|
2987
|
+
e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.1)';
|
|
2988
|
+
}, onMouseLeave: (e) => {
|
|
2989
|
+
e.currentTarget.style.backgroundColor = 'transparent';
|
|
2990
|
+
}, "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: {
|
|
2991
|
+
display: 'flex',
|
|
2992
|
+
gap: '12px',
|
|
2993
|
+
justifyContent: 'flex-end',
|
|
2994
|
+
marginTop: '24px',
|
|
2995
|
+
paddingTop: '16px',
|
|
2996
|
+
borderTop: '1px solid rgba(255, 255, 255, 0.1)'
|
|
2997
|
+
}, 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 }))] })] }));
|
|
2998
|
+
}
|
|
2999
|
+
|
|
2554
3000
|
function ModalHeader({ title, icon, onClose, closeAriaLabel = 'Fechar', align = 'center' }) {
|
|
2555
3001
|
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
3002
|
if (align === 'center') {
|
|
@@ -2565,7 +3011,8 @@ function ModalHeader({ title, icon, onClose, closeAriaLabel = 'Fechar', align =
|
|
|
2565
3011
|
alignItems: 'center',
|
|
2566
3012
|
justifyContent: 'center',
|
|
2567
3013
|
fontSize: '1.25rem',
|
|
2568
|
-
lineHeight: 0
|
|
3014
|
+
lineHeight: 0,
|
|
3015
|
+
opacity: 0.5
|
|
2569
3016
|
};
|
|
2570
3017
|
const closeBox = {
|
|
2571
3018
|
position: 'absolute',
|
|
@@ -2597,7 +3044,7 @@ function ModalHeader({ title, icon, onClose, closeAriaLabel = 'Fechar', align =
|
|
|
2597
3044
|
padding: '16px 24px',
|
|
2598
3045
|
marginBottom: 16,
|
|
2599
3046
|
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 }))] }));
|
|
3047
|
+
}, 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
3048
|
}
|
|
2602
3049
|
|
|
2603
3050
|
function ModalBody({ children, style, className }) {
|
|
@@ -2629,11 +3076,19 @@ exports.Button = Button;
|
|
|
2629
3076
|
exports.CellRenderers = CellRenderers;
|
|
2630
3077
|
exports.ConfirmDialog = ConfirmDialog;
|
|
2631
3078
|
exports.DataTable = DataTable;
|
|
3079
|
+
exports.DetailModal = DetailModal;
|
|
3080
|
+
exports.FormField = FormField;
|
|
3081
|
+
exports.FormGrid = FormGrid;
|
|
3082
|
+
exports.FormModal = FormModal;
|
|
3083
|
+
exports.FormSection = FormSection;
|
|
2632
3084
|
exports.GlassCard = GlassCard;
|
|
3085
|
+
exports.InfoBox = InfoBox;
|
|
3086
|
+
exports.InfoRow = InfoRow;
|
|
2633
3087
|
exports.Modal = Modal;
|
|
2634
3088
|
exports.ModalBody = ModalBody;
|
|
2635
3089
|
exports.ModalFooter = ModalFooter;
|
|
2636
3090
|
exports.ModalHeader = ModalHeader;
|
|
3091
|
+
exports.ProfileCard = ProfileCard;
|
|
2637
3092
|
exports.Select = Select;
|
|
2638
3093
|
exports.TableHeader = TableHeader;
|
|
2639
3094
|
exports.TableRow = TableRow;
|