/* @ds-bundle: {"format":3,"namespace":"MONAFamilyDesignSystem_68e947","components":[{"name":"AppHeader","sourcePath":"uploads/MONA Family Design System-handoff/project/components/app/AppHeader.jsx"},{"name":"LoginScreen","sourcePath":"uploads/MONA Family Design System-handoff/project/components/app/LoginScreen.jsx"},{"name":"SortableHeader","sourcePath":"uploads/MONA Family Design System-handoff/project/components/data/SortableHeader.jsx"},{"name":"Table","sourcePath":"uploads/MONA Family Design System-handoff/project/components/data/Table.jsx"},{"name":"Badge","sourcePath":"uploads/MONA Family Design System-handoff/project/components/feedback/Badge.jsx"},{"name":"EmptyState","sourcePath":"uploads/MONA Family Design System-handoff/project/components/feedback/EmptyState.jsx"},{"name":"EnvChip","sourcePath":"uploads/MONA Family Design System-handoff/project/components/feedback/EnvChip.jsx"},{"name":"ErrorState","sourcePath":"uploads/MONA Family Design System-handoff/project/components/feedback/ErrorState.jsx"},{"name":"ProgressBar","sourcePath":"uploads/MONA Family Design System-handoff/project/components/feedback/ProgressBar.jsx"},{"name":"RoleBadge","sourcePath":"uploads/MONA Family Design System-handoff/project/components/feedback/RoleBadge.jsx"},{"name":"Skeleton","sourcePath":"uploads/MONA Family Design System-handoff/project/components/feedback/Skeleton.jsx"},{"name":"StatusGrid","sourcePath":"uploads/MONA Family Design System-handoff/project/components/feedback/StatusGrid.jsx"},{"name":"Timeline","sourcePath":"uploads/MONA Family Design System-handoff/project/components/feedback/Timeline.jsx"},{"name":"Toast","sourcePath":"uploads/MONA Family Design System-handoff/project/components/feedback/Toast.jsx"},{"name":"ToastStack","sourcePath":"uploads/MONA Family Design System-handoff/project/components/feedback/Toast.jsx"},{"name":"Tooltip","sourcePath":"uploads/MONA Family Design System-handoff/project/components/feedback/Tooltip.jsx"},{"name":"Button","sourcePath":"uploads/MONA Family Design System-handoff/project/components/forms/Button.jsx"},{"name":"Checkbox","sourcePath":"uploads/MONA Family Design System-handoff/project/components/forms/Checkbox.jsx"},{"name":"CodeBlock","sourcePath":"uploads/MONA Family Design System-handoff/project/components/forms/CodeBlock.jsx"},{"name":"CopyButton","sourcePath":"uploads/MONA Family Design System-handoff/project/components/forms/CopyButton.jsx"},{"name":"IconButton","sourcePath":"uploads/MONA Family Design System-handoff/project/components/forms/IconButton.jsx"},{"name":"Input","sourcePath":"uploads/MONA Family Design System-handoff/project/components/forms/Input.jsx"},{"name":"MaskedField","sourcePath":"uploads/MONA Family Design System-handoff/project/components/forms/MaskedField.jsx"},{"name":"RadioGroup","sourcePath":"uploads/MONA Family Design System-handoff/project/components/forms/RadioGroup.jsx"},{"name":"Select","sourcePath":"uploads/MONA Family Design System-handoff/project/components/forms/Select.jsx"},{"name":"Switch","sourcePath":"uploads/MONA Family Design System-handoff/project/components/forms/Switch.jsx"},{"name":"Textarea","sourcePath":"uploads/MONA Family Design System-handoff/project/components/forms/Textarea.jsx"},{"name":"Breadcrumb","sourcePath":"uploads/MONA Family Design System-handoff/project/components/navigation/Breadcrumb.jsx"},{"name":"Pagination","sourcePath":"uploads/MONA Family Design System-handoff/project/components/navigation/Pagination.jsx"},{"name":"ProjectSwitcher","sourcePath":"uploads/MONA Family Design System-handoff/project/components/navigation/ProjectSwitcher.jsx"},{"name":"Tabs","sourcePath":"uploads/MONA Family Design System-handoff/project/components/navigation/Tabs.jsx"},{"name":"Card","sourcePath":"uploads/MONA Family Design System-handoff/project/components/surfaces/Card.jsx"},{"name":"ConfirmDialog","sourcePath":"uploads/MONA Family Design System-handoff/project/components/surfaces/ConfirmDialog.jsx"},{"name":"EnvBanner","sourcePath":"uploads/MONA Family Design System-handoff/project/components/surfaces/EnvBanner.jsx"},{"name":"Modal","sourcePath":"uploads/MONA Family Design System-handoff/project/components/surfaces/Modal.jsx"},{"name":"StatCard","sourcePath":"uploads/MONA Family Design System-handoff/project/components/surfaces/StatCard.jsx"}],"sourceHashes":{"uploads/MONA Family Design System-handoff/project/components/app/AppHeader.jsx":"6c8b78bb90ad","uploads/MONA Family Design System-handoff/project/components/app/LoginScreen.jsx":"a7541d0392f9","uploads/MONA Family Design System-handoff/project/components/data/SortableHeader.jsx":"f20c60b6e463","uploads/MONA Family Design System-handoff/project/components/data/Table.jsx":"fee9157d5583","uploads/MONA Family Design System-handoff/project/components/feedback/Badge.jsx":"382c4271bc43","uploads/MONA Family Design System-handoff/project/components/feedback/EmptyState.jsx":"36a27b3bbcf8","uploads/MONA Family Design System-handoff/project/components/feedback/EnvChip.jsx":"f207c64207bb","uploads/MONA Family Design System-handoff/project/components/feedback/ErrorState.jsx":"c78f3e17cf38","uploads/MONA Family Design System-handoff/project/components/feedback/ProgressBar.jsx":"00e079f34588","uploads/MONA Family Design System-handoff/project/components/feedback/RoleBadge.jsx":"8f9681d47b2e","uploads/MONA Family Design System-handoff/project/components/feedback/Skeleton.jsx":"fa638ece5ae3","uploads/MONA Family Design System-handoff/project/components/feedback/StatusGrid.jsx":"eb9cf0eb4cf1","uploads/MONA Family Design System-handoff/project/components/feedback/Timeline.jsx":"8cfde353c927","uploads/MONA Family Design System-handoff/project/components/feedback/Toast.jsx":"a5bb2f7feb4a","uploads/MONA Family Design System-handoff/project/components/feedback/Tooltip.jsx":"01ccf23f0807","uploads/MONA Family Design System-handoff/project/components/forms/Button.jsx":"60ff89fa879e","uploads/MONA Family Design System-handoff/project/components/forms/Checkbox.jsx":"2d04cec07990","uploads/MONA Family Design System-handoff/project/components/forms/CodeBlock.jsx":"06c371b22a70","uploads/MONA Family Design System-handoff/project/components/forms/CopyButton.jsx":"ba2768cecca8","uploads/MONA Family Design System-handoff/project/components/forms/IconButton.jsx":"fa21bdcf5aa4","uploads/MONA Family Design System-handoff/project/components/forms/Input.jsx":"e64dba91df63","uploads/MONA Family Design System-handoff/project/components/forms/MaskedField.jsx":"3a26776a6624","uploads/MONA Family Design System-handoff/project/components/forms/RadioGroup.jsx":"740afb99b703","uploads/MONA Family Design System-handoff/project/components/forms/Select.jsx":"528c1fd12d0e","uploads/MONA Family Design System-handoff/project/components/forms/Switch.jsx":"2b661aca2724","uploads/MONA Family Design System-handoff/project/components/forms/Textarea.jsx":"3ba886bbe82f","uploads/MONA Family Design System-handoff/project/components/navigation/Breadcrumb.jsx":"b1ceb08ec25a","uploads/MONA Family Design System-handoff/project/components/navigation/Pagination.jsx":"2482587cd467","uploads/MONA Family Design System-handoff/project/components/navigation/ProjectSwitcher.jsx":"4f1728ea8203","uploads/MONA Family Design System-handoff/project/components/navigation/Tabs.jsx":"c9bec984a757","uploads/MONA Family Design System-handoff/project/components/surfaces/Card.jsx":"3bf56605d926","uploads/MONA Family Design System-handoff/project/components/surfaces/ConfirmDialog.jsx":"be0ad5ddd04e","uploads/MONA Family Design System-handoff/project/components/surfaces/EnvBanner.jsx":"859f4395cba8","uploads/MONA Family Design System-handoff/project/components/surfaces/Modal.jsx":"efb655cffed7","uploads/MONA Family Design System-handoff/project/components/surfaces/StatCard.jsx":"98c5eb626506","uploads/MONA Family Design System-handoff/project/components/util.js":"536a9fc1f4ed","uploads/MONA Family Design System-handoff/project/ui_kits/airsflow/screens.jsx":"797d96a25b88","uploads/MONA Family Design System-handoff/project/ui_kits/files/screens.jsx":"751cf24d37f9","uploads/MONA Family Design System-handoff/project/ui_kits/pass/screens-admin.jsx":"7a521bbc5e8b","uploads/MONA Family Design System-handoff/project/ui_kits/pass/screens-detail.jsx":"85056062aba9","uploads/MONA Family Design System-handoff/project/ui_kits/pass/screens-request-project.jsx":"8260e261f374","uploads/MONA Family Design System-handoff/project/ui_kits/pass/screens-requests.jsx":"18bfb186c971","uploads/MONA Family Design System-handoff/project/ui_kits/pass/screens.jsx":"18d80e0f96cd"},"inlinedExternals":[],"unexposedExports":[{"name":"cx","sourcePath":"uploads/MONA Family Design System-handoff/project/components/util.js"},{"name":"injectStyle","sourcePath":"uploads/MONA Family Design System-handoff/project/components/util.js"}]} */
(() => {
const __ds_ns = (window.MONAFamilyDesignSystem_68e947 = window.MONAFamilyDesignSystem_68e947 || {});
const __ds_scope = {};
(__ds_ns.__errors = __ds_ns.__errors || []);
// uploads/MONA Family Design System-handoff/project/components/util.js
try { (() => {
// MONA Family — shared helpers for components.
// Not a component (lowercase, no .d.ts): a tiny runtime util that lets each
// component register its CSS once. Components stay styled by the family tokens
// (var(--…)) and get real :hover / :focus-visible / :disabled states that
// inline styles can't express.
const _injected = new Set();
function injectStyle(id, css) {
if (typeof document === 'undefined') return;
if (_injected.has(id)) return;
_injected.add(id);
const el = document.createElement('style');
el.setAttribute('data-mona', id);
el.textContent = css;
document.head.appendChild(el);
}
// clsx-lite: join truthy class names.
function cx(...parts) {
return parts.filter(Boolean).join(' ');
}
Object.assign(__ds_scope, { injectStyle, cx });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/util.js", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/data/SortableHeader.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-sortableheader', `
.mona-sorth { cursor: pointer; user-select: none; }
.mona-sorth__inner { display: inline-flex; align-items: center; gap: 5px; }
.mona-sorth:hover .mona-sorth__inner { color: var(--text-secondary); }
.mona-sorth--active .mona-sorth__inner { color: var(--color-primary); }
.mona-sorth__icon { display: flex; opacity: 0.5; }
.mona-sorth--active .mona-sorth__icon { opacity: 1; }
.mona-sorth--right .mona-sorth__inner { justify-content: flex-end; }
`);
const ICONS = {
asc: /*#__PURE__*/React.createElement("path", {
d: "m18 15-6-6-6 6"
}),
desc: /*#__PURE__*/React.createElement("path", {
d: "m6 9 6 6 6-6"
}),
none: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("path", {
d: "m7 15 5 5 5-5"
}), /*#__PURE__*/React.createElement("path", {
d: "m7 9 5-5 5 5"
}))
};
/**
* SortableHeader — a
that cycles asc → desc → none on click and shows
* the matching arrow. Pair with Table.
*/
function SortableHeader({
label,
direction = 'none',
onSort,
align = 'left',
className,
...rest
}) {
const next = direction === 'none' ? 'asc' : direction === 'asc' ? 'desc' : 'none';
return /*#__PURE__*/React.createElement("th", _extends({
className: __ds_scope.cx('mona-sorth', direction !== 'none' && 'mona-sorth--active', align === 'right' && 'mona-sorth--right', className),
onClick: () => onSort && onSort(next),
"aria-sort": direction === 'asc' ? 'ascending' : direction === 'desc' ? 'descending' : 'none'
}, rest), /*#__PURE__*/React.createElement("span", {
className: "mona-sorth__inner"
}, label, /*#__PURE__*/React.createElement("span", {
className: "mona-sorth__icon",
"aria-hidden": "true"
}, /*#__PURE__*/React.createElement("svg", {
width: "13",
height: "13",
viewBox: "0 0 24 24",
fill: "none",
stroke: "currentColor",
strokeWidth: "2",
strokeLinecap: "round",
strokeLinejoin: "round"
}, ICONS[direction]))));
}
Object.assign(__ds_scope, { SortableHeader });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/data/SortableHeader.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/data/Table.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-table', `
.mona-table-wrap { width: 100%; overflow-x: auto; border: var(--border-width) solid var(--color-border); border-radius: var(--radius-lg); background: var(--surface-card); }
.mona-table { width: 100%; border-collapse: collapse; font: var(--font-regular) var(--text-sm)/1.4 var(--font-sans); }
.mona-table thead th {
position: sticky; top: 0; z-index: var(--z-sticky);
text-align: left; font-weight: var(--font-semibold); font-size: var(--text-2xs);
text-transform: uppercase; letter-spacing: var(--tracking-wide); color: var(--text-muted);
background: var(--surface-subtle); padding: 10px 14px; border-bottom: var(--border-width) solid var(--color-border); white-space: nowrap;
}
.mona-table tbody td { padding: 11px 14px; border-bottom: var(--border-width) solid var(--color-border); color: var(--text-body); vertical-align: middle; }
.mona-table tbody tr:last-child td { border-bottom: 0; }
.mona-table--hover tbody tr { transition: background-color var(--duration-fast) var(--ease); }
.mona-table--hover tbody tr:hover td { background: var(--surface-hover); }
.mona-table--zebra tbody tr:nth-child(even) td { background: var(--surface-subtle); }
`);
/**
* Table — styled wrapper around a native . Provide /
* (use SortableHeader for sortable columns). Sticky header, optional hover
* and zebra striping.
*/
function Table({
hover = true,
zebra = false,
className,
children,
...rest
}) {
return /*#__PURE__*/React.createElement("div", {
className: "mona-table-wrap"
}, /*#__PURE__*/React.createElement("table", _extends({
className: __ds_scope.cx('mona-table', hover && 'mona-table--hover', zebra && 'mona-table--zebra', className)
}, rest), children));
}
Object.assign(__ds_scope, { Table });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/data/Table.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/feedback/Badge.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-badge', `
.mona-badge {
display: inline-flex; align-items: center; gap: 5px;
font-family: var(--font-sans); font-weight: var(--font-semibold);
border: var(--border-width) solid transparent; white-space: nowrap;
}
.mona-badge--sm { font-size: var(--text-2xs); padding: 2px 7px; }
.mona-badge--md { font-size: var(--text-xs); padding: 3px 9px; }
.mona-badge--square { border-radius: var(--radius-sm); }
.mona-badge--pill { border-radius: var(--radius-pill); }
.mona-badge--upper { text-transform: uppercase; letter-spacing: var(--tracking-wide); }
.mona-badge__dot { width: 6px; height: 6px; border-radius: 50%; background: currentColor; }
.mona-badge--neutral { background: var(--surface-sunken); color: var(--text-secondary); border-color: var(--color-border); }
.mona-badge--primary { background: var(--color-primary-subtle); color: var(--color-primary); }
.mona-badge--success { background: var(--color-success-subtle); color: var(--color-success); }
.mona-badge--warning { background: var(--color-warning-subtle); color: var(--color-warning); }
.mona-badge--danger { background: var(--color-danger-subtle); color: var(--color-danger); }
.mona-badge--info { background: var(--color-info-subtle); color: var(--color-info); }
.mona-badge--purple { background: var(--color-role-platform-subtle); color: var(--color-role-platform); }
`);
/**
* Badge — compact status / category label. Maps onto the semantic palette
* (neutral / primary / success / warning / danger / info / purple).
*/
function Badge({
variant = 'neutral',
size = 'md',
shape = 'square',
uppercase = false,
dot = false,
className,
children,
...rest
}) {
return /*#__PURE__*/React.createElement("span", _extends({
className: __ds_scope.cx('mona-badge', `mona-badge--${variant}`, `mona-badge--${size}`, `mona-badge--${shape}`, uppercase && 'mona-badge--upper', className)
}, rest), dot && /*#__PURE__*/React.createElement("span", {
className: "mona-badge__dot"
}), children);
}
Object.assign(__ds_scope, { Badge });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/feedback/Badge.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/feedback/EmptyState.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-emptystate', `
.mona-empty { display: flex; flex-direction: column; align-items: center; text-align: center; }
.mona-empty--sm { padding: 24px 16px; gap: 8px; }
.mona-empty--md { padding: 40px 24px; gap: 10px; }
.mona-empty--lg { padding: 64px 24px; gap: 12px; }
.mona-empty__icon {
display: grid; place-items: center; color: var(--text-disabled);
background: var(--surface-sunken); border-radius: var(--radius-pill);
width: 56px; height: 56px; margin-bottom: 4px;
}
.mona-empty--sm .mona-empty__icon { width: 44px; height: 44px; }
.mona-empty__title { font: var(--font-semibold) var(--text-md)/1.4 var(--font-sans); color: var(--text-body); }
.mona-empty--sm .mona-empty__title { font-size: var(--text-sm); }
.mona-empty__desc { font: var(--font-regular) var(--text-sm)/1.5 var(--font-sans); color: var(--text-muted); max-width: 340px; }
.mona-empty__action { margin-top: 6px; }
`);
/**
* EmptyState — centered icon + title + description (+ optional action) for
* empty lists, no-results and zero-data screens. The unified family API
* (Files' text-only version is absorbed into this).
*/
function EmptyState({
icon = null,
title,
description,
action = null,
size = 'md',
className,
...rest
}) {
return /*#__PURE__*/React.createElement("div", _extends({
className: __ds_scope.cx('mona-empty', `mona-empty--${size}`, className)
}, rest), icon && /*#__PURE__*/React.createElement("div", {
className: "mona-empty__icon",
"aria-hidden": "true"
}, icon), title && /*#__PURE__*/React.createElement("div", {
className: "mona-empty__title"
}, title), description && /*#__PURE__*/React.createElement("div", {
className: "mona-empty__desc"
}, description), action && /*#__PURE__*/React.createElement("div", {
className: "mona-empty__action"
}, action));
}
Object.assign(__ds_scope, { EmptyState });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/feedback/EmptyState.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/feedback/EnvChip.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-envchip', `
.mona-envchip { display: inline-flex; align-items: center; gap: 6px; font: var(--font-semibold) var(--text-2xs)/1 var(--font-sans); padding: 4px 9px; border-radius: var(--radius-pill); text-transform: uppercase; letter-spacing: var(--tracking-wide); }
.mona-envchip__dot { width: 6px; height: 6px; border-radius: 50%; background: currentColor; }
.mona-envchip--dev { background: var(--color-env-dev-subtle); color: var(--color-env-dev); }
.mona-envchip--stage { background: var(--color-env-stage-subtle); color: var(--color-env-stage); }
.mona-envchip--prod { background: var(--color-env-prod-subtle); color: var(--color-env-prod); }
.mona-envchip--plain { padding-left: 8px; }
`);
/**
* EnvChip — environment label (dev / stage / prod) rendered from the family
* `--color-env-*` tokens. Smaller, inline counterpart to the full-width EnvBanner.
*/
function EnvChip({
env = 'dev',
dot = true,
children,
className,
...rest
}) {
return /*#__PURE__*/React.createElement("span", _extends({
className: __ds_scope.cx('mona-envchip', `mona-envchip--${env}`, !dot && 'mona-envchip--plain', className)
}, rest), dot && /*#__PURE__*/React.createElement("span", {
className: "mona-envchip__dot"
}), children ?? env);
}
Object.assign(__ds_scope, { EnvChip });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/feedback/EnvChip.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/feedback/ErrorState.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-errorstate', `
.mona-err { display: flex; flex-direction: column; align-items: center; text-align: center; padding: 56px 24px; gap: 12px; }
.mona-err__icon { display: grid; place-items: center; width: 60px; height: 60px; border-radius: var(--radius-pill); color: var(--color-danger); background: var(--color-danger-subtle); margin-bottom: 4px; }
.mona-err__icon--warning { color: var(--color-warning); background: var(--color-warning-subtle); }
.mona-err__icon--muted { color: var(--text-muted); background: var(--surface-sunken); }
.mona-err__code { font: var(--font-bold) var(--text-2xl)/1 var(--font-mono); color: var(--text-disabled); letter-spacing: var(--tracking-tight); }
.mona-err__title { font: var(--font-bold) var(--text-lg)/1.3 var(--font-sans); color: var(--text-body); }
.mona-err__msg { font: var(--font-regular) var(--text-sm)/1.6 var(--font-sans); color: var(--text-muted); max-width: 420px; }
.mona-err__detail { font: var(--font-regular) var(--text-xs)/1.6 var(--font-mono); color: var(--text-secondary); background: var(--surface-sunken); border-radius: var(--radius-md); padding: 10px 12px; max-width: 460px; overflow: auto; text-align: left; margin-top: 4px; }
.mona-err__actions { display: flex; gap: 10px; margin-top: 8px; }
`);
/**
* ErrorState — full-page / full-panel error surface, distinct from EmptyState.
* Use for ErrorBoundary fallbacks and proxy errors (401/404/502/504). Optional
* status `code`, monospace `detail` block and retry/refresh actions.
*/
function ErrorState({
icon = null,
code,
title,
message,
detail,
actions = null,
tone = 'danger',
className,
...rest
}) {
return /*#__PURE__*/React.createElement("div", _extends({
className: __ds_scope.cx('mona-err', className)
}, rest), icon && /*#__PURE__*/React.createElement("div", {
className: __ds_scope.cx('mona-err__icon', tone !== 'danger' && `mona-err__icon--${tone}`)
}, icon), code != null && /*#__PURE__*/React.createElement("div", {
className: "mona-err__code"
}, code), title && /*#__PURE__*/React.createElement("div", {
className: "mona-err__title"
}, title), message && /*#__PURE__*/React.createElement("div", {
className: "mona-err__msg"
}, message), detail && /*#__PURE__*/React.createElement("pre", {
className: "mona-err__detail"
}, detail), actions && /*#__PURE__*/React.createElement("div", {
className: "mona-err__actions"
}, actions));
}
Object.assign(__ds_scope, { ErrorState });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/feedback/ErrorState.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/feedback/ProgressBar.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-progress', `
.mona-prog { width: 100%; }
.mona-prog__top { display: flex; justify-content: space-between; align-items: baseline; gap: 8px; margin-bottom: 6px; }
.mona-prog__label { font: var(--font-medium) var(--text-xs)/1.3 var(--font-sans); color: var(--text-secondary); }
.mona-prog__value { font: var(--font-medium) var(--text-2xs)/1 var(--font-mono); color: var(--text-muted); }
.mona-prog__track { width: 100%; height: 8px; background: var(--surface-sunken); border-radius: var(--radius-pill); overflow: hidden; }
.mona-prog__track--sm { height: 5px; }
.mona-prog__track--lg { height: 12px; }
.mona-prog__fill { height: 100%; border-radius: var(--radius-pill); background: var(--color-primary); transition: width var(--duration) var(--ease), background-color var(--duration) var(--ease); }
.mona-prog__fill--success { background: var(--color-success); }
.mona-prog__fill--warning { background: var(--color-warning); }
.mona-prog__fill--danger { background: var(--color-danger); }
.mona-prog__fill--indeterminate { width: 40% !important; animation: mona-loading-bar 1.4s var(--ease) infinite; }
`);
/**
* ProgressBar / Meter — track + fill for quota usage, cluster utilization and
* upload progress. Pass `threshold` to auto-color (>=90% danger, >=70% warning),
* or set `variant` explicitly. `indeterminate` for unknown-duration loading.
*/
function ProgressBar({
value = 0,
max = 100,
variant,
threshold = false,
indeterminate = false,
size = 'md',
label,
valueText,
showValue = false,
className,
...rest
}) {
const pct = max > 0 ? Math.min(100, Math.max(0, value / max * 100)) : 0;
let v = variant || 'primary';
if (threshold && !variant) v = pct >= 90 ? 'danger' : pct >= 70 ? 'warning' : 'primary';
return /*#__PURE__*/React.createElement("div", _extends({
className: __ds_scope.cx('mona-prog', className)
}, rest), (label || showValue || valueText) && /*#__PURE__*/React.createElement("div", {
className: "mona-prog__top"
}, label && /*#__PURE__*/React.createElement("span", {
className: "mona-prog__label"
}, label), (valueText || showValue) && /*#__PURE__*/React.createElement("span", {
className: "mona-prog__value"
}, valueText ?? `${Math.round(pct)}%`)), /*#__PURE__*/React.createElement("div", {
className: __ds_scope.cx('mona-prog__track', `mona-prog__track--${size}`),
role: "progressbar",
"aria-valuenow": indeterminate ? undefined : Math.round(pct),
"aria-valuemin": 0,
"aria-valuemax": 100
}, /*#__PURE__*/React.createElement("div", {
className: __ds_scope.cx('mona-prog__fill', `mona-prog__fill--${v}`, indeterminate && 'mona-prog__fill--indeterminate'),
style: indeterminate ? undefined : {
width: `${pct}%`
}
})));
}
Object.assign(__ds_scope, { ProgressBar });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/feedback/ProgressBar.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/feedback/RoleBadge.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-rolebadge', `
.mona-role {
display: inline-flex; align-items: center;
font-family: var(--font-sans); font-weight: var(--font-semibold);
font-size: var(--text-2xs); line-height: 1;
text-transform: uppercase; letter-spacing: var(--tracking-wide);
padding: 4px 9px; border-radius: var(--radius-pill);
border: var(--border-width) solid transparent;
}
.mona-role--admin { background: var(--color-role-admin-subtle); color: var(--color-role-admin); }
.mona-role--developer { background: var(--color-role-developer-subtle); color: var(--color-role-developer); }
.mona-role--viewer { background: var(--color-role-viewer-subtle); color: var(--color-role-viewer); }
.mona-role--platform { background: var(--color-role-platform-subtle); color: var(--color-role-platform); }
`);
const LABELS = {
admin: 'admin',
developer: 'developer',
viewer: 'viewer'
};
/**
* RoleBadge — the unified family role chip. Resolves the old per-site
* mismatch (Pass admin=red, AiRSFlow admin=amber) into ONE standard:
* admin=amber, developer=blue, viewer=slate. Global platform-* roles use
* purple and a "P-" prefix.
*/
function RoleBadge({
role = 'viewer',
isPlatform = false,
className,
...rest
}) {
const variant = isPlatform ? 'platform' : role;
const label = (isPlatform ? 'P-' : '') + (LABELS[role] || role);
return /*#__PURE__*/React.createElement("span", _extends({
className: __ds_scope.cx('mona-role', `mona-role--${variant}`, className)
}, rest), label);
}
Object.assign(__ds_scope, { RoleBadge });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/feedback/RoleBadge.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/feedback/Skeleton.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-skeleton', `
.mona-skel { display: block; background: var(--surface-sunken); border-radius: var(--radius-sm); position: relative; overflow: hidden; }
.mona-skel::after {
content: ''; position: absolute; inset: 0;
background: linear-gradient(90deg, transparent, rgba(255,255,255,0.45), transparent);
transform: translateX(-100%); animation: mona-loading-bar 1.4s var(--ease) infinite;
}
.dark .mona-skel::after { background: linear-gradient(90deg, transparent, rgba(255,255,255,0.06), transparent); }
.mona-skel--text { height: 0.75em; border-radius: var(--radius-pill); margin: 0.25em 0; }
.mona-skel--circle { border-radius: 50%; }
`);
/**
* Skeleton — animated loading placeholder. Compose blocks to mirror the
* shape of content while it loads (Files had no loader — this fills the gap).
*/
function Skeleton({
width,
height,
variant = 'block',
radius,
className,
style,
...rest
}) {
const s = {
...style
};
if (width != null) s.width = typeof width === 'number' ? `${width}px` : width;
if (height != null) s.height = typeof height === 'number' ? `${height}px` : height;
if (radius != null) s.borderRadius = typeof radius === 'number' ? `${radius}px` : radius;
return /*#__PURE__*/React.createElement("span", _extends({
className: __ds_scope.cx('mona-skel', variant !== 'block' && `mona-skel--${variant}`, className),
style: s
}, rest));
}
Object.assign(__ds_scope, { Skeleton });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/feedback/Skeleton.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/feedback/StatusGrid.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-statusgrid', `
.mona-sg { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 10px; }
.mona-sg__cell { display: flex; align-items: center; gap: 9px; padding: 11px 13px; border: var(--border-width) solid var(--color-border); border-radius: var(--radius-md); background: var(--surface-card); }
.mona-sg__dot { width: 8px; height: 8px; border-radius: 50%; flex: none; }
.mona-sg__name { font: var(--font-medium) var(--text-sm)/1.2 var(--font-sans); color: var(--text-body); flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mona-sg__status { font: var(--font-medium) var(--text-2xs)/1 var(--font-sans); color: var(--text-muted); }
/* ok */
.mona-sg__cell--ok { border-color: var(--color-success-subtle); background: var(--color-success-subtle); }
.mona-sg__cell--ok .mona-sg__dot { background: var(--color-success); }
.mona-sg__cell--ok .mona-sg__status { color: var(--color-success); }
/* error */
.mona-sg__cell--error { border-color: var(--color-danger-subtle); background: var(--color-danger-subtle); }
.mona-sg__cell--error .mona-sg__dot { background: var(--color-danger); }
.mona-sg__cell--error .mona-sg__status { color: var(--color-danger); }
/* pending */
.mona-sg__cell--pending .mona-sg__dot { background: var(--color-warning); }
.mona-sg__cell--pending .mona-sg__status { color: var(--color-warning); }
/* off / disabled */
.mona-sg__cell--off { opacity: 0.6; }
.mona-sg__cell--off .mona-sg__dot { background: var(--text-disabled); }
`);
const LABELS = {
ok: '정상',
error: '오류',
pending: '대기',
off: '비활성'
};
/**
* StatusGrid — compact grid of integration/service health cells (Namespace,
* Keycloak, ArgoCD, Grafana, S3, MLflow…). Each item: {name, status} where
* status is ok / error / pending / off. Optional per-item statusLabel override.
*/
function StatusGrid({
items = [],
className,
...rest
}) {
return /*#__PURE__*/React.createElement("div", _extends({
className: __ds_scope.cx('mona-sg', className)
}, rest), items.map(it => {
const s = it.status || 'ok';
return /*#__PURE__*/React.createElement("div", {
className: __ds_scope.cx('mona-sg__cell', `mona-sg__cell--${s}`),
key: it.name
}, /*#__PURE__*/React.createElement("span", {
className: "mona-sg__dot"
}), /*#__PURE__*/React.createElement("span", {
className: "mona-sg__name"
}, it.name), /*#__PURE__*/React.createElement("span", {
className: "mona-sg__status"
}, it.statusLabel ?? LABELS[s]));
}));
}
Object.assign(__ds_scope, { StatusGrid });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/feedback/StatusGrid.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/feedback/Timeline.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-timeline', `
.mona-tl { display: flex; flex-direction: column; }
.mona-tl__item { display: grid; grid-template-columns: 18px 1fr; gap: 12px; }
.mona-tl__rail { display: flex; flex-direction: column; align-items: center; }
.mona-tl__dot { width: 11px; height: 11px; border-radius: 50%; margin-top: 3px; flex: none; background: var(--color-primary); box-shadow: 0 0 0 3px var(--color-primary-subtle); }
.mona-tl__dot--success { background: var(--color-success); box-shadow: 0 0 0 3px var(--color-success-subtle); }
.mona-tl__dot--warning { background: var(--color-warning); box-shadow: 0 0 0 3px var(--color-warning-subtle); }
.mona-tl__dot--danger { background: var(--color-danger); box-shadow: 0 0 0 3px var(--color-danger-subtle); }
.mona-tl__dot--muted { background: var(--text-disabled); box-shadow: 0 0 0 3px var(--surface-sunken); }
.mona-tl__line { flex: 1; width: 2px; background: var(--color-border); margin: 4px 0; min-height: 8px; }
.mona-tl__body { padding-bottom: 18px; }
.mona-tl__item:last-child .mona-tl__body { padding-bottom: 0; }
.mona-tl__title { font: var(--font-medium) var(--text-sm)/1.4 var(--font-sans); color: var(--text-body); }
.mona-tl__meta { font: var(--font-regular) var(--text-xs)/1.4 var(--font-sans); color: var(--text-muted); margin-top: 2px; }
.mona-tl__desc { font: var(--font-regular) var(--text-sm)/1.5 var(--font-sans); color: var(--text-secondary); margin-top: 4px; }
`);
/**
* Timeline — vertical event trail for request history and project activity
* logs. Each item has a status dot (primary/success/warning/danger/muted),
* a title, optional meta line and description.
*/
function Timeline({
items = [],
className,
...rest
}) {
return /*#__PURE__*/React.createElement("div", _extends({
className: __ds_scope.cx('mona-tl', className)
}, rest), items.map((it, i) => {
const last = i === items.length - 1;
return /*#__PURE__*/React.createElement("div", {
className: "mona-tl__item",
key: i
}, /*#__PURE__*/React.createElement("div", {
className: "mona-tl__rail"
}, /*#__PURE__*/React.createElement("span", {
className: __ds_scope.cx('mona-tl__dot', it.status && `mona-tl__dot--${it.status}`)
}), !last && /*#__PURE__*/React.createElement("span", {
className: "mona-tl__line"
})), /*#__PURE__*/React.createElement("div", {
className: "mona-tl__body"
}, /*#__PURE__*/React.createElement("div", {
className: "mona-tl__title"
}, it.title), it.meta && /*#__PURE__*/React.createElement("div", {
className: "mona-tl__meta"
}, it.meta), it.description && /*#__PURE__*/React.createElement("div", {
className: "mona-tl__desc"
}, it.description)));
}));
}
Object.assign(__ds_scope, { Timeline });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/feedback/Timeline.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/feedback/Toast.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-toast', `
.mona-toast {
display: flex; align-items: flex-start; gap: 11px;
width: 360px; max-width: calc(100vw - 32px);
background: var(--surface-card); border: var(--border-width) solid var(--color-border);
border-radius: var(--radius-lg); box-shadow: var(--shadow-xl);
padding: 13px 14px; animation: mona-fade-in var(--duration) var(--ease-out);
}
.mona-toast__icon { flex: none; margin-top: 1px; display: flex; }
.mona-toast__body { flex: 1; min-width: 0; }
.mona-toast__title { font: var(--font-semibold) var(--text-sm)/1.4 var(--font-sans); color: var(--text-body); }
.mona-toast__msg { font: var(--font-regular) var(--text-xs)/1.5 var(--font-sans); color: var(--text-secondary); margin-top: 2px; word-break: break-word; }
.mona-toast__close { flex: none; border: 0; background: transparent; cursor: pointer; color: var(--text-muted); border-radius: var(--radius-sm); padding: 2px; display: flex; }
.mona-toast__close:hover { background: var(--surface-hover); color: var(--text-body); }
.mona-toast--success .mona-toast__icon { color: var(--color-success); }
.mona-toast--error .mona-toast__icon { color: var(--color-danger); }
.mona-toast--warning .mona-toast__icon { color: var(--color-warning); }
.mona-toast--info .mona-toast__icon { color: var(--color-info); }
.mona-toaststack { position: fixed; bottom: 20px; right: 20px; display: flex; flex-direction: column; gap: 10px; z-index: var(--z-toast); }
`);
const ICONS = {
success: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("path", {
d: "M21.801 10A10 10 0 1 1 17 3.335"
}), /*#__PURE__*/React.createElement("path", {
d: "m9 11 3 3L22 4"
})),
error: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("circle", {
cx: "12",
cy: "12",
r: "10"
}), /*#__PURE__*/React.createElement("path", {
d: "m15 9-6 6"
}), /*#__PURE__*/React.createElement("path", {
d: "m9 9 6 6"
})),
warning: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("path", {
d: "m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"
}), /*#__PURE__*/React.createElement("path", {
d: "M12 9v4"
}), /*#__PURE__*/React.createElement("path", {
d: "M12 17h.01"
})),
info: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("circle", {
cx: "12",
cy: "12",
r: "10"
}), /*#__PURE__*/React.createElement("path", {
d: "M12 16v-4"
}), /*#__PURE__*/React.createElement("path", {
d: "M12 8h.01"
}))
};
const TITLES = {
success: '완료',
error: '오류',
warning: '경고',
info: '알림'
};
/**
* Toast — a single transient notification. Render inside .
* Four variants: success / error / warning / info.
*/
function Toast({
variant = 'info',
title,
message,
onClose,
className,
...rest
}) {
return /*#__PURE__*/React.createElement("div", _extends({
className: __ds_scope.cx('mona-toast', `mona-toast--${variant}`, className),
role: "status"
}, rest), /*#__PURE__*/React.createElement("span", {
className: "mona-toast__icon",
"aria-hidden": "true"
}, /*#__PURE__*/React.createElement("svg", {
width: "18",
height: "18",
viewBox: "0 0 24 24",
fill: "none",
stroke: "currentColor",
strokeWidth: "2",
strokeLinecap: "round",
strokeLinejoin: "round"
}, ICONS[variant])), /*#__PURE__*/React.createElement("div", {
className: "mona-toast__body"
}, /*#__PURE__*/React.createElement("div", {
className: "mona-toast__title"
}, title ?? TITLES[variant]), message && /*#__PURE__*/React.createElement("div", {
className: "mona-toast__msg"
}, message)), onClose && /*#__PURE__*/React.createElement("button", {
className: "mona-toast__close",
"aria-label": "\uB2EB\uAE30",
onClick: onClose
}, /*#__PURE__*/React.createElement("svg", {
width: "15",
height: "15",
viewBox: "0 0 24 24",
fill: "none",
stroke: "currentColor",
strokeWidth: "2",
strokeLinecap: "round",
strokeLinejoin: "round"
}, /*#__PURE__*/React.createElement("path", {
d: "M18 6 6 18"
}), /*#__PURE__*/React.createElement("path", {
d: "m6 6 12 12"
}))));
}
/** ToastStack — fixed bottom-right container for stacked toasts. */
function ToastStack({
children,
className,
...rest
}) {
return /*#__PURE__*/React.createElement("div", _extends({
className: __ds_scope.cx('mona-toaststack', className)
}, rest), children);
}
Object.assign(__ds_scope, { Toast, ToastStack });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/feedback/Toast.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/feedback/Tooltip.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-tooltip', `
.mona-tip { position: relative; display: inline-flex; }
.mona-tip__pop {
position: absolute; z-index: var(--z-dropdown); pointer-events: none;
background: var(--zinc-900); color: var(--zinc-50);
font: var(--font-medium) var(--text-xs)/1.3 var(--font-sans);
padding: 6px 9px; border-radius: var(--radius-sm); white-space: nowrap;
box-shadow: var(--shadow-lg);
opacity: 0; transform: translateY(2px); transition: opacity var(--duration-fast) var(--ease), transform var(--duration-fast) var(--ease);
}
.dark .mona-tip__pop { background: var(--zinc-100); color: var(--zinc-900); }
.mona-tip:hover .mona-tip__pop, .mona-tip:focus-within .mona-tip__pop { opacity: 1; transform: translateY(0); }
.mona-tip__pop--top { bottom: calc(100% + 7px); left: 50%; translate: -50% 0; }
.mona-tip__pop--bottom { top: calc(100% + 7px); left: 50%; translate: -50% 0; }
.mona-tip__pop--left { right: calc(100% + 7px); top: 50%; translate: 0 -50%; }
.mona-tip__pop--right { left: calc(100% + 7px); top: 50%; translate: 0 -50%; }
`);
/**
* Tooltip — lightweight hover/focus label. Wraps a single interactive child;
* CSS-only, no portal. For rich help content use a popover instead.
*/
function Tooltip({
label,
side = 'top',
className,
children,
...rest
}) {
return /*#__PURE__*/React.createElement("span", _extends({
className: __ds_scope.cx('mona-tip', className)
}, rest), children, /*#__PURE__*/React.createElement("span", {
className: `mona-tip__pop mona-tip__pop--${side}`,
role: "tooltip"
}, label));
}
Object.assign(__ds_scope, { Tooltip });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/feedback/Tooltip.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/forms/Button.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-button', `
.mona-btn {
display: inline-flex; align-items: center; justify-content: center; gap: 7px;
font-family: var(--font-sans); font-weight: var(--font-semibold);
border: var(--border-width) solid transparent; border-radius: var(--radius-md);
cursor: pointer; white-space: nowrap; text-decoration: none;
transition: background-color var(--duration-fast) var(--ease),
border-color var(--duration-fast) var(--ease),
color var(--duration-fast) var(--ease),
box-shadow var(--duration-fast) var(--ease),
transform var(--duration-fast) var(--ease);
}
.mona-btn:focus-visible { outline: none; box-shadow: var(--focus-ring); }
.mona-btn:active:not(:disabled) { transform: scale(0.97); }
.mona-btn:disabled { opacity: 0.5; cursor: not-allowed; }
.mona-btn--pill { border-radius: var(--radius-pill); }
.mona-btn--block { width: 100%; }
/* sizes */
.mona-btn--sm { font-size: var(--text-xs); padding: 0 12px; height: 30px; }
.mona-btn--md { font-size: var(--text-sm); padding: 0 16px; height: 38px; }
.mona-btn--lg { font-size: var(--text-base); padding: 0 22px; height: 46px; }
/* variants */
.mona-btn--primary { background: var(--color-primary); color: var(--color-on-primary, var(--text-on-primary)); box-shadow: var(--shadow-sm); }
.mona-btn--primary:hover:not(:disabled) { background: var(--color-primary-hover); }
.mona-btn--primary:active:not(:disabled) { background: var(--color-primary-active); }
.mona-btn--secondary { background: var(--surface-card); color: var(--text-body); border-color: var(--color-border-strong); }
.mona-btn--secondary:hover:not(:disabled) { background: var(--surface-hover); }
.mona-btn--ghost { background: transparent; color: var(--text-secondary); }
.mona-btn--ghost:hover:not(:disabled) { background: var(--surface-hover); color: var(--text-body); }
.mona-btn--danger { background: var(--color-danger); color: #fff; }
.mona-btn--danger:hover:not(:disabled) { filter: brightness(1.06); }
.mona-btn--danger-outline { background: var(--surface-card); color: var(--color-danger); border-color: var(--color-border-strong); }
.mona-btn--danger-outline:hover:not(:disabled) { background: var(--color-danger-subtle); border-color: var(--color-danger); }
`);
/**
* Button — the family's primary action control.
* 8px radius by default (set `pill` for the rounded variant).
*/
function Button({
variant = 'primary',
size = 'md',
pill = false,
block = false,
leadingIcon = null,
trailingIcon = null,
as = 'button',
className,
children,
...rest
}) {
const Tag = as;
return /*#__PURE__*/React.createElement(Tag, _extends({
className: __ds_scope.cx('mona-btn', `mona-btn--${variant}`, `mona-btn--${size}`, pill && 'mona-btn--pill', block && 'mona-btn--block', className)
}, rest), leadingIcon, children, trailingIcon);
}
Object.assign(__ds_scope, { Button });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/forms/Button.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/app/LoginScreen.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-login', `
.mona-login {
min-height: 100%; display: grid; place-items: center; padding: 32px;
background:
radial-gradient(120% 90% at 0% 0%, var(--color-primary-subtle), transparent 55%),
radial-gradient(120% 90% at 100% 100%, var(--color-primary-subtle), transparent 55%),
var(--color-bg);
}
.mona-login__card {
width: 100%; max-width: 400px; background: var(--surface-card);
border: var(--border-width) solid var(--color-border); border-radius: var(--radius-xl);
box-shadow: var(--shadow-xl); padding: 32px 30px;
}
.mona-login__logo { width: 52px; height: 52px; border-radius: var(--radius-lg); display: block; margin-bottom: 18px; }
.mona-login__wordmark { font: var(--font-bold) var(--text-xl)/1 var(--font-sans); letter-spacing: var(--tracking-tight); color: var(--text-body); margin-bottom: 20px; }
.mona-login__wordmark b { color: var(--color-primary); font-weight: var(--font-bold); }
.mona-login__title { font: var(--font-bold) var(--text-2xl)/1.25 var(--font-sans); color: var(--text-body); letter-spacing: var(--tracking-tight); }
.mona-login__subtitle { font: var(--font-regular) var(--text-sm)/1.6 var(--font-sans); color: var(--text-secondary); margin-top: 8px; }
.mona-login__action { margin-top: 22px; }
.mona-login__note { font: var(--font-regular) var(--text-xs)/1.6 var(--font-sans); color: var(--text-muted); margin-top: 16px; text-align: center; }
.mona-login__note a { color: var(--color-primary); }
`);
const ArrowRight = /*#__PURE__*/React.createElement("svg", {
width: "17",
height: "17",
viewBox: "0 0 24 24",
fill: "none",
stroke: "currentColor",
strokeWidth: "2",
strokeLinecap: "round",
strokeLinejoin: "round"
}, /*#__PURE__*/React.createElement("path", {
d: "M5 12h14"
}), /*#__PURE__*/React.createElement("path", {
d: "m12 5 7 7-7 7"
}));
/**
* LoginScreen — the shared SSO entry card (all sites use the same Keycloak).
* Centered card with logo, wordmark, headline, sub-copy and one SSO button.
*/
function LoginScreen({
logo,
product,
title,
subtitle,
buttonLabel = 'SSO 로그인',
onLogin,
note,
className,
...rest
}) {
return /*#__PURE__*/React.createElement("div", _extends({
className: __ds_scope.cx('mona-login', className)
}, rest), /*#__PURE__*/React.createElement("div", {
className: "mona-login__card"
}, logo && /*#__PURE__*/React.createElement("img", {
className: "mona-login__logo",
src: logo,
alt: ""
}), /*#__PURE__*/React.createElement("div", {
className: "mona-login__wordmark"
}, "MONA", /*#__PURE__*/React.createElement("b", null, " ", product)), /*#__PURE__*/React.createElement("h1", {
className: "mona-login__title"
}, title), subtitle && /*#__PURE__*/React.createElement("p", {
className: "mona-login__subtitle"
}, subtitle), /*#__PURE__*/React.createElement("div", {
className: "mona-login__action"
}, /*#__PURE__*/React.createElement(__ds_scope.Button, {
block: true,
size: "lg",
onClick: onLogin,
trailingIcon: ArrowRight
}, buttonLabel)), note && /*#__PURE__*/React.createElement("div", {
className: "mona-login__note"
}, note)));
}
Object.assign(__ds_scope, { LoginScreen });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/app/LoginScreen.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/forms/Checkbox.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-checkbox', `
.mona-check { display: inline-flex; align-items: center; gap: 9px; cursor: pointer; font: var(--font-regular) var(--text-sm)/1.4 var(--font-sans); color: var(--text-body); user-select: none; }
.mona-check input { position: absolute; opacity: 0; width: 0; height: 0; }
.mona-check__box {
width: 18px; height: 18px; flex: none; border-radius: 5px;
border: 1.5px solid var(--color-border-strong); background: var(--surface-card);
display: grid; place-items: center; color: #fff;
transition: background-color var(--duration-fast) var(--ease), border-color var(--duration-fast) var(--ease), box-shadow var(--duration-fast) var(--ease);
}
.mona-check__box svg { opacity: 0; transform: scale(0.6); transition: opacity var(--duration-fast) var(--ease), transform var(--duration-fast) var(--ease); }
.mona-check input:checked + .mona-check__box { background: var(--color-primary); border-color: var(--color-primary); }
.mona-check input:checked + .mona-check__box svg { opacity: 1; transform: scale(1); }
.mona-check input:indeterminate + .mona-check__box { background: var(--color-primary); border-color: var(--color-primary); }
.mona-check input:focus-visible + .mona-check__box { box-shadow: var(--focus-ring); }
.mona-check input:disabled ~ * { opacity: 0.5; }
.mona-check--disabled { cursor: not-allowed; }
`);
/**
* Checkbox — boolean toggle with an animated check. Renders a label when
* `children` are provided. Supports the indeterminate state.
*/
function Checkbox({
indeterminate = false,
disabled = false,
className,
children,
...rest
}) {
const ref = React.useRef(null);
React.useEffect(() => {
if (ref.current) ref.current.indeterminate = indeterminate;
}, [indeterminate]);
return /*#__PURE__*/React.createElement("label", {
className: __ds_scope.cx('mona-check', disabled && 'mona-check--disabled', className)
}, /*#__PURE__*/React.createElement("input", _extends({
ref: ref,
type: "checkbox",
disabled: disabled
}, rest)), /*#__PURE__*/React.createElement("span", {
className: "mona-check__box",
"aria-hidden": "true"
}, /*#__PURE__*/React.createElement("svg", {
width: "12",
height: "12",
viewBox: "0 0 24 24",
fill: "none",
stroke: "currentColor",
strokeWidth: "3.5",
strokeLinecap: "round",
strokeLinejoin: "round"
}, /*#__PURE__*/React.createElement("path", {
d: "M20 6 9 17l-5-5"
}))), children && /*#__PURE__*/React.createElement("span", null, children));
}
Object.assign(__ds_scope, { Checkbox });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/forms/Checkbox.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/forms/CopyButton.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-copybtn', `
.mona-copy { display: inline-flex; align-items: center; gap: 6px; font: var(--font-medium) var(--text-xs)/1 var(--font-sans); color: var(--text-secondary); background: transparent; border: var(--border-width) solid var(--color-border-strong); border-radius: var(--radius-sm); padding: 5px 9px; cursor: pointer; transition: background-color var(--duration-fast) var(--ease), color var(--duration-fast) var(--ease), border-color var(--duration-fast) var(--ease); }
.mona-copy:hover { background: var(--surface-hover); color: var(--text-body); }
.mona-copy.is-copied { color: var(--color-success); border-color: var(--color-success); }
.mona-copy--on-dark { color: #d4d4d8; border-color: rgba(255,255,255,0.18); }
.mona-copy--on-dark:hover { background: rgba(255,255,255,0.08); color: #fff; }
.mona-copy svg { display: block; }
`);
const COPY = /*#__PURE__*/React.createElement("svg", {
width: "14",
height: "14",
viewBox: "0 0 24 24",
fill: "none",
stroke: "currentColor",
strokeWidth: "2",
strokeLinecap: "round",
strokeLinejoin: "round"
}, /*#__PURE__*/React.createElement("rect", {
width: "14",
height: "14",
x: "8",
y: "8",
rx: "2",
ry: "2"
}), /*#__PURE__*/React.createElement("path", {
d: "M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"
}));
const CHECK = /*#__PURE__*/React.createElement("svg", {
width: "14",
height: "14",
viewBox: "0 0 24 24",
fill: "none",
stroke: "currentColor",
strokeWidth: "2.4",
strokeLinecap: "round",
strokeLinejoin: "round"
}, /*#__PURE__*/React.createElement("path", {
d: "M20 6 9 17l-5-5"
}));
/**
* CopyButton — copies `value` to the clipboard and flips to a check for ~1.5s.
* Use `onDark` inside dark code blocks.
*/
function CopyButton({
value,
label = '복사',
copiedLabel = '복사됨',
onDark = false,
className,
...rest
}) {
const [copied, setCopied] = React.useState(false);
const copy = () => {
try {
navigator.clipboard && navigator.clipboard.writeText(String(value));
} catch (e) {/* noop */}
setCopied(true);
setTimeout(() => setCopied(false), 1500);
};
return /*#__PURE__*/React.createElement("button", _extends({
type: "button",
className: __ds_scope.cx('mona-copy', onDark && 'mona-copy--on-dark', copied && 'is-copied', className),
onClick: copy
}, rest), copied ? CHECK : COPY, copied ? copiedLabel : label);
}
Object.assign(__ds_scope, { CopyButton });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/forms/CopyButton.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/forms/CodeBlock.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-codeblock', `
.mona-code { background: var(--zinc-900); border: var(--border-width) solid var(--color-border); border-radius: var(--radius-md); overflow: hidden; }
.dark .mona-code { background: #0c0c0e; }
.mona-code__bar { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 8px 12px; border-bottom: 1px solid rgba(255,255,255,0.08); }
.mona-code__title { font: var(--font-medium) var(--text-2xs)/1 var(--font-mono); color: #a1a1aa; text-transform: uppercase; letter-spacing: var(--tracking-wide); }
.mona-code__pre { margin: 0; padding: 13px 14px; overflow: auto; font: var(--font-regular) var(--text-xs)/1.7 var(--font-mono); color: #e4e4e7; }
.mona-code__pre .g { color: #4ade80; }
.mona-code__pre .b { color: #60a5fa; }
.mona-code__pre .c { color: #71717a; }
`);
/**
* CodeBlock — dark monospace block for CLI snippets (kubectl, AWS CLI) and
* config, with an optional title bar and copy button. Pass plain text as
* children, or pre-highlighted nodes.
*/
function CodeBlock({
title,
copy = true,
copyValue,
className,
children,
...rest
}) {
const text = copyValue != null ? copyValue : typeof children === 'string' ? children : '';
return /*#__PURE__*/React.createElement("div", _extends({
className: __ds_scope.cx('mona-code', className)
}, rest), (title || copy) && /*#__PURE__*/React.createElement("div", {
className: "mona-code__bar"
}, /*#__PURE__*/React.createElement("span", {
className: "mona-code__title"
}, title), copy && /*#__PURE__*/React.createElement(__ds_scope.CopyButton, {
value: text,
onDark: true
})), /*#__PURE__*/React.createElement("pre", {
className: "mona-code__pre"
}, children));
}
Object.assign(__ds_scope, { CodeBlock });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/forms/CodeBlock.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/forms/IconButton.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-iconbutton', `
.mona-iconbtn {
display: inline-flex; align-items: center; justify-content: center;
border: var(--border-width) solid transparent; border-radius: var(--radius-md);
cursor: pointer; color: var(--text-secondary); background: transparent;
transition: background-color var(--duration-fast) var(--ease), color var(--duration-fast) var(--ease), box-shadow var(--duration-fast) var(--ease);
}
.mona-iconbtn svg { display: block; }
.mona-iconbtn:focus-visible { outline: none; box-shadow: var(--focus-ring); }
.mona-iconbtn:disabled { opacity: 0.5; cursor: not-allowed; }
.mona-iconbtn--round { border-radius: var(--radius-pill); }
.mona-iconbtn--sm { width: 28px; height: 28px; }
.mona-iconbtn--md { width: 34px; height: 34px; }
.mona-iconbtn--lg { width: 40px; height: 40px; }
.mona-iconbtn--ghost:hover:not(:disabled) { background: var(--surface-hover); color: var(--text-body); }
.mona-iconbtn--secondary { background: var(--surface-card); border-color: var(--color-border); color: var(--text-secondary); }
.mona-iconbtn--secondary:hover:not(:disabled) { background: var(--surface-hover); color: var(--text-body); }
.mona-iconbtn--primary { background: var(--color-primary); color: #fff; }
.mona-iconbtn--primary:hover:not(:disabled) { background: var(--color-primary-hover); }
.mona-iconbtn--danger:hover:not(:disabled) { background: var(--color-danger-subtle); color: var(--color-danger); }
`);
/**
* IconButton — square/round button for a single icon (toolbar actions,
* theme toggle, close buttons). Always pass an accessible `aria-label`.
*/
function IconButton({
variant = 'ghost',
size = 'md',
round = false,
className,
children,
...rest
}) {
return /*#__PURE__*/React.createElement("button", _extends({
type: "button",
className: __ds_scope.cx('mona-iconbtn', `mona-iconbtn--${variant}`, `mona-iconbtn--${size}`, round && 'mona-iconbtn--round', className)
}, rest), children);
}
Object.assign(__ds_scope, { IconButton });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/forms/IconButton.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/app/AppHeader.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-appheader', `
.mona-header {
display: flex; align-items: center; gap: 16px; height: var(--header-height);
padding: 0 var(--container-pad); background: var(--surface-card);
border-bottom: var(--border-width) solid var(--color-border);
}
.mona-header__brand { display: inline-flex; align-items: center; gap: 9px; text-decoration: none; flex: none; }
.mona-header__logo { width: 30px; height: 30px; border-radius: var(--radius-md); display: block; }
.mona-header__wordmark { font: var(--font-bold) var(--text-md)/1 var(--font-sans); letter-spacing: var(--tracking-tight); color: var(--text-body); white-space: nowrap; }
.mona-header__wordmark b { color: var(--color-primary); font-weight: var(--font-bold); }
.mona-header__nav { display: flex; align-items: center; gap: 2px; }
.mona-header__navlink {
display: inline-flex; align-items: center; gap: 6px;
font: var(--font-medium) var(--text-sm)/1 var(--font-sans); color: var(--text-secondary);
padding: 8px 11px; border-radius: var(--radius-md); cursor: pointer; text-decoration: none;
transition: background-color var(--duration-fast) var(--ease), color var(--duration-fast) var(--ease);
}
.mona-header__navlink:hover { background: var(--surface-hover); color: var(--text-body); }
.mona-header__navlink--active { background: var(--surface-hover); color: var(--text-body); }
.mona-header__spacer { flex: 1; }
.mona-header__right { display: flex; align-items: center; gap: 8px; }
.mona-header__divider { width: 1px; height: 22px; background: var(--color-border); margin: 0 2px; }
.mona-header__avatar {
width: 32px; height: 32px; border-radius: 50%; display: grid; place-items: center;
font: var(--font-semibold) var(--text-xs)/1 var(--font-sans); color: #fff;
background: linear-gradient(135deg, var(--color-primary), var(--color-role-platform)); cursor: pointer;
}
`);
const Sun = /*#__PURE__*/React.createElement("svg", {
width: "18",
height: "18",
viewBox: "0 0 24 24",
fill: "none",
stroke: "currentColor",
strokeWidth: "2",
strokeLinecap: "round",
strokeLinejoin: "round"
}, /*#__PURE__*/React.createElement("circle", {
cx: "12",
cy: "12",
r: "4"
}), /*#__PURE__*/React.createElement("path", {
d: "M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"
}));
const Moon = /*#__PURE__*/React.createElement("svg", {
width: "18",
height: "18",
viewBox: "0 0 24 24",
fill: "none",
stroke: "currentColor",
strokeWidth: "2",
strokeLinecap: "round",
strokeLinejoin: "round"
}, /*#__PURE__*/React.createElement("path", {
d: "M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"
}));
function initials(name) {
if (!name) return '·';
const t = name.trim();
return t.length <= 2 ? t : t.slice(0, 2);
}
/**
* AppHeader — the shared family top bar. Logo + wordmark, nav links, a free
* `center` slot (e.g. ProjectSwitcher for Files), theme toggle, custom right
* actions and an avatar. One header, every site.
*/
function AppHeader({
logo,
product,
nav = [],
activeNav,
onNav,
center = null,
theme = 'light',
onThemeToggle,
rightExtra = null,
user,
onAvatar,
className,
...rest
}) {
return /*#__PURE__*/React.createElement("header", _extends({
className: __ds_scope.cx('mona-header', className)
}, rest), /*#__PURE__*/React.createElement("a", {
className: "mona-header__brand",
href: "#",
onClick: e => e.preventDefault()
}, logo && /*#__PURE__*/React.createElement("img", {
className: "mona-header__logo",
src: logo,
alt: ""
}), /*#__PURE__*/React.createElement("span", {
className: "mona-header__wordmark"
}, "MONA", /*#__PURE__*/React.createElement("b", null, " ", product))), nav.length > 0 && /*#__PURE__*/React.createElement("nav", {
className: "mona-header__nav"
}, nav.map(n => {
const id = n.id ?? n.label;
return /*#__PURE__*/React.createElement("a", {
key: id,
className: __ds_scope.cx('mona-header__navlink', id === activeNav && 'mona-header__navlink--active'),
href: n.href || '#',
onClick: e => {
if (!n.href) e.preventDefault();
onNav && onNav(id);
}
}, n.icon, n.label);
})), center && /*#__PURE__*/React.createElement("div", {
style: {
marginLeft: 4
}
}, center), /*#__PURE__*/React.createElement("div", {
className: "mona-header__spacer"
}), /*#__PURE__*/React.createElement("div", {
className: "mona-header__right"
}, rightExtra, onThemeToggle && /*#__PURE__*/React.createElement(__ds_scope.IconButton, {
"aria-label": "\uD14C\uB9C8 \uC804\uD658",
onClick: onThemeToggle
}, theme === 'dark' ? Sun : Moon), user && /*#__PURE__*/React.createElement("span", {
className: "mona-header__divider"
}), user && /*#__PURE__*/React.createElement("button", {
className: "mona-header__avatar",
onClick: onAvatar,
title: user.name,
"aria-label": user.name
}, initials(user.name))));
}
Object.assign(__ds_scope, { AppHeader });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/app/AppHeader.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/forms/Input.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-input', `
.mona-field { display: flex; flex-direction: column; gap: 6px; }
.mona-field__label { font: var(--font-medium) var(--text-xs)/1.4 var(--font-sans); color: var(--text-secondary); }
.mona-field__label .req { color: var(--color-danger); margin-left: 2px; }
.mona-inputwrap { position: relative; display: flex; align-items: center; }
.mona-inputwrap__icon { position: absolute; left: 12px; display: flex; color: var(--text-muted); pointer-events: none; }
.mona-input {
width: 100%; font: var(--font-regular) var(--text-sm)/1.4 var(--font-sans);
color: var(--text-body); background: var(--surface-card);
border: var(--border-width) solid var(--color-border-strong); border-radius: var(--radius-md);
padding: 9px 12px; transition: border-color var(--duration-fast) var(--ease), box-shadow var(--duration-fast) var(--ease);
}
.mona-inputwrap--with-icon .mona-input { padding-left: 36px; }
.mona-input::placeholder { color: var(--text-disabled); }
.mona-input:hover:not(:disabled):not(:focus) { border-color: var(--text-disabled); }
.mona-input:focus { outline: none; border-color: var(--color-primary); box-shadow: var(--focus-ring); }
.mona-input:disabled { background: var(--surface-sunken); color: var(--text-disabled); cursor: not-allowed; }
.mona-field--error .mona-input { border-color: var(--color-danger); }
.mona-field--error .mona-input:focus { box-shadow: 0 0 0 3px var(--color-danger-subtle); }
.mona-field__hint { font: var(--font-regular) var(--text-xs)/1.4 var(--font-sans); color: var(--text-muted); }
.mona-field__hint--error { color: var(--color-danger); }
`);
/**
* Input — single-line text field with optional label, leading icon and
* hint / error message. Wraps a native .
*/
function Input({
label,
hint,
error,
required = false,
leadingIcon = null,
id,
className,
...rest
}) {
const fieldId = id || (label ? `f-${Math.random().toString(36).slice(2, 8)}` : undefined);
return /*#__PURE__*/React.createElement("div", {
className: __ds_scope.cx('mona-field', error && 'mona-field--error', className)
}, label && /*#__PURE__*/React.createElement("label", {
className: "mona-field__label",
htmlFor: fieldId
}, label, required && /*#__PURE__*/React.createElement("span", {
className: "req"
}, "*")), /*#__PURE__*/React.createElement("div", {
className: __ds_scope.cx('mona-inputwrap', leadingIcon && 'mona-inputwrap--with-icon')
}, leadingIcon && /*#__PURE__*/React.createElement("span", {
className: "mona-inputwrap__icon"
}, leadingIcon), /*#__PURE__*/React.createElement("input", _extends({
id: fieldId,
className: "mona-input",
"aria-invalid": !!error
}, rest))), (error || hint) && /*#__PURE__*/React.createElement("span", {
className: __ds_scope.cx('mona-field__hint', error && 'mona-field__hint--error')
}, error || hint));
}
Object.assign(__ds_scope, { Input });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/forms/Input.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/forms/MaskedField.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-masked', `
.mona-masked { display: flex; flex-direction: column; gap: 6px; }
.mona-masked__label { font: var(--font-medium) var(--text-xs)/1.4 var(--font-sans); color: var(--text-secondary); }
.mona-masked__row { display: flex; align-items: center; gap: 8px; background: var(--surface-sunken); border: var(--border-width) solid var(--color-border); border-radius: var(--radius-md); padding: 8px 10px; }
.mona-masked__val { flex: 1; min-width: 0; font: var(--font-regular) var(--text-sm)/1.4 var(--font-mono); color: var(--text-body); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mona-masked__btn { display: flex; border: 0; background: transparent; color: var(--text-muted); cursor: pointer; padding: 4px; border-radius: var(--radius-sm); }
.mona-masked__btn:hover { background: var(--surface-hover); color: var(--text-body); }
`);
const EYE = /*#__PURE__*/React.createElement("svg", {
width: "15",
height: "15",
viewBox: "0 0 24 24",
fill: "none",
stroke: "currentColor",
strokeWidth: "2",
strokeLinecap: "round",
strokeLinejoin: "round"
}, /*#__PURE__*/React.createElement("path", {
d: "M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0"
}), /*#__PURE__*/React.createElement("circle", {
cx: "12",
cy: "12",
r: "3"
}));
const EYE_OFF = /*#__PURE__*/React.createElement("svg", {
width: "15",
height: "15",
viewBox: "0 0 24 24",
fill: "none",
stroke: "currentColor",
strokeWidth: "2",
strokeLinecap: "round",
strokeLinejoin: "round"
}, /*#__PURE__*/React.createElement("path", {
d: "M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49"
}), /*#__PURE__*/React.createElement("path", {
d: "M14.084 14.158a3 3 0 0 1-4.242-4.242"
}), /*#__PURE__*/React.createElement("path", {
d: "M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143"
}), /*#__PURE__*/React.createElement("path", {
d: "m2 2 20 20"
}));
/**
* MaskedField — reveals/hides a secret (S3 access key, token) with an eye
* toggle and a copy button. Shows a dotted mask until revealed.
*/
function MaskedField({
label,
value = '',
revealed: controlled,
onToggle,
className,
...rest
}) {
const [local, setLocal] = React.useState(false);
const shown = controlled != null ? controlled : local;
const toggle = () => {
onToggle ? onToggle(!shown) : setLocal(s => !s);
};
const masked = '•'.repeat(Math.min(24, Math.max(8, String(value).length)));
return /*#__PURE__*/React.createElement("div", _extends({
className: __ds_scope.cx('mona-masked', className)
}, rest), label && /*#__PURE__*/React.createElement("span", {
className: "mona-masked__label"
}, label), /*#__PURE__*/React.createElement("div", {
className: "mona-masked__row"
}, /*#__PURE__*/React.createElement("span", {
className: "mona-masked__val"
}, shown ? value : masked), /*#__PURE__*/React.createElement("button", {
type: "button",
className: "mona-masked__btn",
"aria-label": shown ? '가리기' : '표시',
onClick: toggle
}, shown ? EYE_OFF : EYE), /*#__PURE__*/React.createElement(__ds_scope.CopyButton, {
value: value,
label: "",
copiedLabel: ""
})));
}
Object.assign(__ds_scope, { MaskedField });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/forms/MaskedField.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/forms/RadioGroup.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-radio', `
.mona-radiogroup { display: flex; flex-direction: column; gap: 8px; }
.mona-radiogroup--row { flex-direction: row; flex-wrap: wrap; gap: 16px; }
.mona-radio { display: flex; align-items: flex-start; gap: 10px; cursor: pointer; font-family: var(--font-sans); }
.mona-radio--card { border: var(--border-width) solid var(--color-border-strong); border-radius: var(--radius-md); padding: 12px 14px; transition: border-color var(--duration-fast) var(--ease), background-color var(--duration-fast) var(--ease); }
.mona-radio--card.is-checked { border-color: var(--color-primary); background: var(--color-primary-subtle); }
.mona-radio--card.is-checked.is-danger { border-color: var(--color-danger); background: var(--color-danger-subtle); }
.mona-radio input { position: absolute; opacity: 0; width: 0; height: 0; }
.mona-radio__mark { width: 18px; height: 18px; flex: none; margin-top: 1px; border-radius: 50%; border: 1.5px solid var(--color-border-strong); display: grid; place-items: center; transition: border-color var(--duration-fast) var(--ease); }
.mona-radio__mark::after { content: ''; width: 9px; height: 9px; border-radius: 50%; background: var(--color-primary); transform: scale(0); transition: transform var(--duration-fast) var(--ease); }
.mona-radio input:checked + .mona-radio__mark { border-color: var(--color-primary); }
.mona-radio input:checked + .mona-radio__mark::after { transform: scale(1); }
.mona-radio.is-danger input:checked + .mona-radio__mark { border-color: var(--color-danger); }
.mona-radio.is-danger input:checked + .mona-radio__mark::after { background: var(--color-danger); }
.mona-radio input:focus-visible + .mona-radio__mark { box-shadow: var(--focus-ring); }
.mona-radio__body { display: flex; flex-direction: column; gap: 3px; }
.mona-radio__label { font: var(--font-medium) var(--text-sm)/1.3 var(--font-sans); color: var(--text-body); }
.mona-radio__desc { font: var(--font-regular) var(--text-xs)/1.5 var(--font-sans); color: var(--text-muted); }
`);
/**
* RadioGroup — single-select option set. Plain rows by default; `card` renders
* bordered option cards (used by the destructive delete-policy dialog). Mark an
* option `danger: true` to color its selected card red.
*/
function RadioGroup({
name,
value,
onChange,
options = [],
variant = 'list',
card = false,
row = false,
className,
...rest
}) {
const gname = name || React.useId();
return /*#__PURE__*/React.createElement("div", _extends({
className: __ds_scope.cx('mona-radiogroup', row && 'mona-radiogroup--row', className),
role: "radiogroup"
}, rest), options.map(o => {
const checked = o.value === value;
return /*#__PURE__*/React.createElement("label", {
key: o.value,
className: __ds_scope.cx('mona-radio', card && 'mona-radio--card', checked && 'is-checked', o.danger && 'is-danger')
}, /*#__PURE__*/React.createElement("input", {
type: "radio",
name: gname,
value: o.value,
checked: checked,
onChange: () => onChange && onChange(o.value)
}), /*#__PURE__*/React.createElement("span", {
className: "mona-radio__mark",
"aria-hidden": "true"
}), /*#__PURE__*/React.createElement("span", {
className: "mona-radio__body"
}, /*#__PURE__*/React.createElement("span", {
className: "mona-radio__label"
}, o.label), o.description && /*#__PURE__*/React.createElement("span", {
className: "mona-radio__desc"
}, o.description)));
}));
}
Object.assign(__ds_scope, { RadioGroup });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/forms/RadioGroup.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/forms/Select.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-select', `
.mona-selectwrap { position: relative; display: inline-flex; align-items: center; width: 100%; }
.mona-select {
width: 100%; appearance: none; -webkit-appearance: none;
font: var(--font-regular) var(--text-sm)/1.4 var(--font-sans); color: var(--text-body);
background: var(--surface-card); border: var(--border-width) solid var(--color-border-strong);
border-radius: var(--radius-md); padding: 9px 34px 9px 12px; cursor: pointer;
transition: border-color var(--duration-fast) var(--ease), box-shadow var(--duration-fast) var(--ease);
}
.mona-select:hover:not(:disabled):not(:focus) { border-color: var(--text-disabled); }
.mona-select:focus { outline: none; border-color: var(--color-primary); box-shadow: var(--focus-ring); }
.mona-select:disabled { background: var(--surface-sunken); color: var(--text-disabled); cursor: not-allowed; }
.mona-selectwrap__chev { position: absolute; right: 11px; pointer-events: none; color: var(--text-muted); display: flex; }
`);
/**
* Select — styled wrapper over a native with a custom chevron.
* Pass options as {value,label}[] or provide children directly.
*/
function Select({
options,
className,
children,
disabled,
...rest
}) {
return /*#__PURE__*/React.createElement("span", {
className: __ds_scope.cx('mona-selectwrap', className)
}, /*#__PURE__*/React.createElement("select", _extends({
className: "mona-select",
disabled: disabled
}, rest), options ? options.map(o => /*#__PURE__*/React.createElement("option", {
key: o.value,
value: o.value
}, o.label)) : children), /*#__PURE__*/React.createElement("span", {
className: "mona-selectwrap__chev",
"aria-hidden": "true"
}, /*#__PURE__*/React.createElement("svg", {
width: "14",
height: "14",
viewBox: "0 0 24 24",
fill: "none",
stroke: "currentColor",
strokeWidth: "2",
strokeLinecap: "round",
strokeLinejoin: "round"
}, /*#__PURE__*/React.createElement("path", {
d: "m6 9 6 6 6-6"
}))));
}
Object.assign(__ds_scope, { Select });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/forms/Select.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/forms/Switch.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-switch', `
.mona-switch { display: inline-flex; align-items: center; gap: 10px; cursor: pointer; font: var(--font-regular) var(--text-sm)/1.4 var(--font-sans); color: var(--text-body); user-select: none; }
.mona-switch input { position: absolute; opacity: 0; width: 0; height: 0; }
.mona-switch__track {
width: 38px; height: 22px; flex: none; border-radius: var(--radius-pill);
background: var(--color-border-strong); position: relative;
transition: background-color var(--duration) var(--ease), box-shadow var(--duration-fast) var(--ease);
}
.mona-switch__thumb {
position: absolute; top: 2px; left: 2px; width: 18px; height: 18px;
border-radius: 50%; background: #fff; box-shadow: var(--shadow-sm);
transition: transform var(--duration) var(--ease);
}
.mona-switch input:checked + .mona-switch__track { background: var(--color-primary); }
.mona-switch input:checked + .mona-switch__track .mona-switch__thumb { transform: translateX(16px); }
.mona-switch input:focus-visible + .mona-switch__track { box-shadow: var(--focus-ring); }
.mona-switch input:disabled ~ * { opacity: 0.5; }
.mona-switch--disabled { cursor: not-allowed; }
`);
/**
* Switch — on/off toggle for settings (theme, feature flags). Children
* render as an inline label after the track.
*/
function Switch({
disabled = false,
className,
children,
...rest
}) {
return /*#__PURE__*/React.createElement("label", {
className: __ds_scope.cx('mona-switch', disabled && 'mona-switch--disabled', className)
}, /*#__PURE__*/React.createElement("input", _extends({
type: "checkbox",
role: "switch",
disabled: disabled
}, rest)), /*#__PURE__*/React.createElement("span", {
className: "mona-switch__track",
"aria-hidden": "true"
}, /*#__PURE__*/React.createElement("span", {
className: "mona-switch__thumb"
})), children && /*#__PURE__*/React.createElement("span", null, children));
}
Object.assign(__ds_scope, { Switch });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/forms/Switch.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/forms/Textarea.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-textarea', `
.mona-ta { display: flex; flex-direction: column; gap: 6px; }
.mona-ta__label { font: var(--font-medium) var(--text-xs)/1.4 var(--font-sans); color: var(--text-secondary); }
.mona-ta__label .req { color: var(--color-danger); margin-left: 2px; }
.mona-ta__input {
width: 100%; font: var(--font-regular) var(--text-sm)/1.6 var(--font-sans); color: var(--text-body);
background: var(--surface-card); border: var(--border-width) solid var(--color-border-strong);
border-radius: var(--radius-md); padding: 10px 12px; resize: vertical; min-height: 84px;
transition: border-color var(--duration-fast) var(--ease), box-shadow var(--duration-fast) var(--ease);
}
.mona-ta__input::placeholder { color: var(--text-disabled); }
.mona-ta__input:hover:not(:disabled):not(:focus) { border-color: var(--text-disabled); }
.mona-ta__input:focus { outline: none; border-color: var(--color-primary); box-shadow: var(--focus-ring); }
.mona-ta__input:disabled { background: var(--surface-sunken); color: var(--text-disabled); cursor: not-allowed; }
.mona-ta--mono .mona-ta__input { font-family: var(--font-mono); font-size: var(--text-xs); }
.mona-ta--error .mona-ta__input { border-color: var(--color-danger); }
.mona-ta__hint { display: flex; justify-content: space-between; gap: 8px; font: var(--font-regular) var(--text-xs)/1.4 var(--font-sans); color: var(--text-muted); }
.mona-ta__hint--error { color: var(--color-danger); }
`);
/**
* Textarea — multi-line text field with optional label, hint/error and a
* character counter. `mono` switches to the monospace stack (YAML, manifests).
*/
function Textarea({
label,
hint,
error,
required = false,
mono = false,
maxLength,
value,
id,
className,
...rest
}) {
const fieldId = id || (label ? `t-${Math.random().toString(36).slice(2, 8)}` : undefined);
const count = typeof value === 'string' ? value.length : null;
return /*#__PURE__*/React.createElement("div", {
className: __ds_scope.cx('mona-ta', mono && 'mona-ta--mono', error && 'mona-ta--error', className)
}, label && /*#__PURE__*/React.createElement("label", {
className: "mona-ta__label",
htmlFor: fieldId
}, label, required && /*#__PURE__*/React.createElement("span", {
className: "req"
}, "*")), /*#__PURE__*/React.createElement("textarea", _extends({
id: fieldId,
className: "mona-ta__input",
maxLength: maxLength,
value: value,
"aria-invalid": !!error
}, rest)), (error || hint || maxLength && count != null) && /*#__PURE__*/React.createElement("div", {
className: __ds_scope.cx('mona-ta__hint', error && 'mona-ta__hint--error')
}, /*#__PURE__*/React.createElement("span", null, error || hint), maxLength && count != null && /*#__PURE__*/React.createElement("span", null, count, "/", maxLength)));
}
Object.assign(__ds_scope, { Textarea });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/forms/Textarea.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/navigation/Breadcrumb.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-breadcrumb', `
.mona-crumb { display: flex; align-items: center; gap: 4px; font: var(--font-regular) var(--text-sm)/1 var(--font-sans); flex-wrap: wrap; }
.mona-crumb__item { display: inline-flex; align-items: center; gap: 5px; color: var(--text-secondary); background: transparent; border: 0; padding: 4px 6px; border-radius: var(--radius-sm); cursor: pointer; text-decoration: none; font: inherit; }
.mona-crumb__item:hover { background: var(--surface-hover); color: var(--text-body); }
.mona-crumb__item--current { color: var(--text-body); font-weight: var(--font-medium); pointer-events: none; }
.mona-crumb__sep { color: var(--text-disabled); display: flex; }
`);
const CHEV = /*#__PURE__*/React.createElement("svg", {
width: "14",
height: "14",
viewBox: "0 0 24 24",
fill: "none",
stroke: "currentColor",
strokeWidth: "2",
strokeLinecap: "round",
strokeLinejoin: "round"
}, /*#__PURE__*/React.createElement("path", {
d: "m9 18 6-6-6-6"
}));
/**
* Breadcrumb — path trail with chevron separators. Items render as buttons
* (or links when `href` is set); the last item is the non-interactive current.
*/
function Breadcrumb({
items = [],
className,
...rest
}) {
return /*#__PURE__*/React.createElement("nav", _extends({
className: __ds_scope.cx('mona-crumb', className),
"aria-label": "breadcrumb"
}, rest), items.map((it, i) => {
const last = i === items.length - 1;
const Tag = it.href && !last ? 'a' : 'button';
return /*#__PURE__*/React.createElement(React.Fragment, {
key: i
}, /*#__PURE__*/React.createElement(Tag, {
className: __ds_scope.cx('mona-crumb__item', last && 'mona-crumb__item--current'),
href: it.href,
onClick: it.onClick,
"aria-current": last ? 'page' : undefined
}, it.icon, it.label), !last && /*#__PURE__*/React.createElement("span", {
className: "mona-crumb__sep",
"aria-hidden": "true"
}, CHEV));
}));
}
Object.assign(__ds_scope, { Breadcrumb });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/navigation/Breadcrumb.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/navigation/Pagination.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-pagination', `
.mona-pg { display: flex; align-items: center; gap: 4px; }
.mona-pg__btn {
min-width: 30px; height: 30px; padding: 0 6px; display: inline-flex; align-items: center; justify-content: center;
font: var(--font-medium) var(--text-sm)/1 var(--font-sans); color: var(--text-secondary);
background: transparent; border: var(--border-width) solid transparent; border-radius: var(--radius-md); cursor: pointer;
transition: background-color var(--duration-fast) var(--ease), color var(--duration-fast) var(--ease);
}
.mona-pg__btn:hover:not(:disabled):not(.mona-pg__btn--active) { background: var(--surface-hover); color: var(--text-body); }
.mona-pg__btn--active { background: var(--color-primary); color: #fff; }
.mona-pg__btn:disabled { opacity: 0.4; cursor: not-allowed; }
.mona-pg__btn svg { display: block; }
.mona-pg__info { font: var(--font-regular) var(--text-xs)/1 var(--font-sans); color: var(--text-muted); margin-right: 10px; }
`);
const ICON = d => /*#__PURE__*/React.createElement("svg", {
width: "15",
height: "15",
viewBox: "0 0 24 24",
fill: "none",
stroke: "currentColor",
strokeWidth: "2",
strokeLinecap: "round",
strokeLinejoin: "round"
}, d);
/**
* Pagination — page navigation in groups of 5, with prev/next and an
* optional "전체 N개 중 a–b" summary.
*/
function Pagination({
page = 1,
pageCount = 1,
total,
pageSize,
onChange,
className,
...rest
}) {
const go = p => {
if (p >= 1 && p <= pageCount && p !== page && onChange) onChange(p);
};
const group = Math.floor((page - 1) / 5);
const start = group * 5 + 1;
const end = Math.min(start + 4, pageCount);
const pages = [];
for (let p = start; p <= end; p++) pages.push(p);
return /*#__PURE__*/React.createElement("div", _extends({
className: __ds_scope.cx('mona-pg', className)
}, rest), total != null && pageSize != null && /*#__PURE__*/React.createElement("span", {
className: "mona-pg__info"
}, "\uC804\uCCB4 ", total, "\uAC1C \uC911 ", (page - 1) * pageSize + 1, "\u2013", Math.min(page * pageSize, total)), /*#__PURE__*/React.createElement("button", {
className: "mona-pg__btn",
disabled: page <= 1,
onClick: () => go(page - 1),
"aria-label": "\uC774\uC804"
}, ICON(/*#__PURE__*/React.createElement("path", {
d: "m15 18-6-6 6-6"
}))), pages.map(p => /*#__PURE__*/React.createElement("button", {
key: p,
className: __ds_scope.cx('mona-pg__btn', p === page && 'mona-pg__btn--active'),
"aria-current": p === page ? 'page' : undefined,
onClick: () => go(p)
}, p)), /*#__PURE__*/React.createElement("button", {
className: "mona-pg__btn",
disabled: page >= pageCount,
onClick: () => go(page + 1),
"aria-label": "\uB2E4\uC74C"
}, ICON(/*#__PURE__*/React.createElement("path", {
d: "m9 18 6-6-6-6"
}))));
}
Object.assign(__ds_scope, { Pagination });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/navigation/Pagination.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/navigation/ProjectSwitcher.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-projectswitcher', `
.mona-ps { position: relative; display: inline-block; }
.mona-ps__btn {
display: inline-flex; align-items: center; gap: 8px; max-width: 340px;
font: var(--font-semibold) var(--text-sm)/1 var(--font-sans); color: var(--text-body);
background: var(--surface-sunken); border: var(--border-width) solid var(--color-border);
border-radius: var(--radius-pill); padding: 7px 12px; cursor: pointer;
transition: background-color var(--duration-fast) var(--ease), border-color var(--duration-fast) var(--ease);
}
.mona-ps__btn:hover { border-color: var(--color-border-strong); }
.mona-ps__btn:focus-visible { outline: none; box-shadow: var(--focus-ring); }
.mona-ps__name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mona-ps__chev { display: flex; color: var(--text-muted); transition: transform var(--duration-fast) var(--ease); }
.mona-ps--open .mona-ps__chev { transform: rotate(180deg); }
.mona-ps__panel {
position: absolute; top: calc(100% + 8px); left: 0; z-index: var(--z-dropdown);
width: 460px; max-width: calc(100vw - 32px); background: var(--surface-card);
border: var(--border-width) solid var(--color-border); border-radius: var(--radius-xl);
box-shadow: var(--shadow-2xl); padding: 8px; animation: mona-ps-pop var(--duration-fast) var(--ease-out);
}
@keyframes mona-ps-pop { from { transform: translateY(-4px); } to { transform: translateY(0); } }
.mona-ps__searchwrap { position: relative; display: flex; align-items: center; margin-bottom: 6px; }
.mona-ps__searchicon { position: absolute; left: 14px; display: flex; color: var(--text-muted); pointer-events: none; }
.mona-ps__search {
width: 100%; font: var(--font-regular) var(--text-sm)/1.4 var(--font-sans); color: var(--text-body);
background: var(--surface-sunken); border: var(--border-width) solid var(--color-border);
border-radius: var(--radius-lg); padding: 11px 12px 11px 40px;
}
.mona-ps__search::placeholder { color: var(--text-muted); }
.mona-ps__search:focus { outline: none; border-color: var(--color-primary); box-shadow: var(--focus-ring); background: var(--surface-card); }
.mona-ps__list { max-height: 420px; overflow-y: auto; overflow-x: hidden; padding: 2px; }
.mona-ps__sechead { display: flex; align-items: center; gap: 8px; padding: 13px 10px 7px; }
.mona-ps__sechead:first-child { padding-top: 5px; }
.mona-ps__secicon { display: flex; flex: none; }
.mona-ps__secicon--fav { color: #f59e0b; }
.mona-ps__secicon--recent { color: var(--text-muted); }
.mona-ps__dot { width: 8px; height: 8px; border-radius: 50%; flex: none; }
.mona-ps__seclabel { font: var(--font-semibold) var(--text-sm)/1 var(--font-sans); color: var(--text-secondary); white-space: nowrap; }
.mona-ps__seccount { margin-left: auto; font: var(--font-medium) var(--text-sm)/1 var(--font-sans); color: var(--text-disabled); }
.mona-ps__item {
display: flex; align-items: center; gap: 12px; width: 100%; text-align: left;
border: 0; border-radius: var(--radius-lg); padding: 9px 10px; cursor: pointer;
background: transparent; transition: background-color var(--duration-fast) var(--ease);
}
.mona-ps__item:hover { background: var(--surface-hover); }
.mona-ps__item--active { background: var(--color-primary-subtle); }
.mona-ps__item:focus-visible { outline: none; box-shadow: var(--focus-ring); }
.mona-ps__avatar { width: 38px; height: 38px; border-radius: 11px; flex: none; display: grid; place-items: center; font: var(--font-bold) var(--text-xs)/1 var(--font-sans); letter-spacing: 0.02em; }
.mona-ps__itemname { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font: var(--font-regular) var(--text-base)/1.25 var(--font-sans); color: var(--text-body); }
.mona-ps__prefix { color: var(--text-muted); }
.mona-ps__itemname b { font-weight: var(--font-semibold); color: var(--text-body); }
.mona-ps__star { flex: none; border: 0; background: transparent; cursor: pointer; padding: 4px; display: flex; color: var(--text-disabled); opacity: 0; transition: opacity var(--duration-fast) var(--ease), color var(--duration-fast) var(--ease), transform var(--duration-fast) var(--ease); }
.mona-ps__item:hover .mona-ps__star { opacity: 1; }
.mona-ps__star:hover { color: #f59e0b; transform: scale(1.12); }
.mona-ps__star.is-fav { opacity: 1; color: #f59e0b; }
.mona-ps__check { flex: none; width: 20px; display: flex; justify-content: center; color: var(--color-primary); }
.mona-ps__empty { padding: 28px 10px; text-align: center; font: var(--font-regular) var(--text-sm)/1.4 var(--font-sans); color: var(--text-muted); }
`);
const CHEV = /*#__PURE__*/React.createElement("svg", {
width: "15",
height: "15",
viewBox: "0 0 24 24",
fill: "none",
stroke: "currentColor",
strokeWidth: "2",
strokeLinecap: "round",
strokeLinejoin: "round"
}, /*#__PURE__*/React.createElement("path", {
d: "m6 9 6 6 6-6"
}));
const CHECK = /*#__PURE__*/React.createElement("svg", {
width: "17",
height: "17",
viewBox: "0 0 24 24",
fill: "none",
stroke: "currentColor",
strokeWidth: "2.5",
strokeLinecap: "round",
strokeLinejoin: "round"
}, /*#__PURE__*/React.createElement("path", {
d: "M20 6 9 17l-5-5"
}));
const SEARCH = /*#__PURE__*/React.createElement("svg", {
width: "17",
height: "17",
viewBox: "0 0 24 24",
fill: "none",
stroke: "currentColor",
strokeWidth: "2",
strokeLinecap: "round",
strokeLinejoin: "round"
}, /*#__PURE__*/React.createElement("circle", {
cx: "11",
cy: "11",
r: "8"
}), /*#__PURE__*/React.createElement("path", {
d: "m21 21-4.3-4.3"
}));
const CLOCK = /*#__PURE__*/React.createElement("svg", {
width: "15",
height: "15",
viewBox: "0 0 24 24",
fill: "none",
stroke: "currentColor",
strokeWidth: "2",
strokeLinecap: "round",
strokeLinejoin: "round"
}, /*#__PURE__*/React.createElement("circle", {
cx: "12",
cy: "12",
r: "10"
}), /*#__PURE__*/React.createElement("polyline", {
points: "12 6 12 12 16 14"
}));
const STAR_FILL = /*#__PURE__*/React.createElement("svg", {
width: "16",
height: "16",
viewBox: "0 0 24 24",
fill: "currentColor",
stroke: "currentColor",
strokeWidth: "1",
strokeLinejoin: "round"
}, /*#__PURE__*/React.createElement("path", {
d: "M11.48 3.5a.6.6 0 0 1 1.04 0l2.34 4.74 5.23.76a.6.6 0 0 1 .33 1.02l-3.78 3.69.89 5.21a.6.6 0 0 1-.87.63L12 17.9l-4.68 2.46a.6.6 0 0 1-.87-.63l.89-5.21-3.78-3.69a.6.6 0 0 1 .33-1.02l5.23-.76z"
}));
const STAR_LINE = /*#__PURE__*/React.createElement("svg", {
width: "16",
height: "16",
viewBox: "0 0 24 24",
fill: "none",
stroke: "currentColor",
strokeWidth: "2",
strokeLinecap: "round",
strokeLinejoin: "round"
}, /*#__PURE__*/React.createElement("path", {
d: "M11.48 3.5a.6.6 0 0 1 1.04 0l2.34 4.74 5.23.76a.6.6 0 0 1 .33 1.02l-3.78 3.69.89 5.21a.6.6 0 0 1-.87.63L12 17.9l-4.68 2.46a.6.6 0 0 1-.87-.63l.89-5.21-3.78-3.69a.6.6 0 0 1 .33-1.02l5.23-.76z"
}));
const PALETTE = ['#2563eb', '#7e22ce', '#16a34a', '#d97706', '#0e7490', '#db2777', '#4f46e5', '#0891b2'];
function hashIdx(str, mod) {
let h = 0;
for (let i = 0; i < (str || '').length; i++) h = h * 31 + str.charCodeAt(i) >>> 0;
return h % mod;
}
function splitName(name, group) {
if (group && name.toLowerCase().startsWith((group + '-').toLowerCase())) {
return {
prefix: name.slice(0, group.length + 1),
rest: name.slice(group.length + 1)
};
}
return {
prefix: '',
rest: name
};
}
function initialsFor(name, group) {
const {
rest
} = splitName(name, group);
const segs = (rest || name).split(/[-_\s]+/).filter(Boolean);
const s = segs.length >= 2 ? segs[0][0] + segs[1][0] : (rest || name).replace(/[^a-z0-9]/gi, '').slice(0, 2);
return s.toUpperCase();
}
/**
* ProjectSwitcher — the unified project selector. Pill trigger + rich dropdown:
* search, group-colored avatar tiles, 즐겨찾기 (favorites) and 최근 사용 (recent)
* sections, namespace groups with colored dots + counts, per-row star toggle,
* role badge and a selected check. Falls back to a flat list when there are no
* groups/favorites/recents (AiRSFlow-style).
*/
function ProjectSwitcher({
projects = [],
value,
onChange,
onToggleFavorite,
recentIds,
groups,
label = '프로젝트',
defaultOpen = false,
className,
...rest
}) {
const [open, setOpen] = React.useState(defaultOpen);
const [q, setQ] = React.useState('');
const [favs, setFavs] = React.useState(() => new Set(projects.filter(p => p.favorite).map(p => p.id)));
const ref = React.useRef(null);
const current = projects.find(p => p.id === value) || projects[0];
React.useEffect(() => {
if (!open) return;
const onDoc = e => {
if (ref.current && !ref.current.contains(e.target)) setOpen(false);
};
document.addEventListener('mousedown', onDoc);
return () => document.removeEventListener('mousedown', onDoc);
}, [open]);
// group config (explicit `groups` prop, else derived in first-seen order)
const groupList = React.useMemo(() => {
if (groups && groups.length) return groups;
const seen = [];
const map = {};
projects.forEach(p => {
const k = p.group;
if (k && !map[k]) {
map[k] = {
key: k,
label: String(k).toUpperCase()
};
seen.push(map[k]);
}
});
return seen;
}, [groups, projects]);
const accentByKey = {};
groupList.forEach((g, i) => {
accentByKey[g.key] = g.accent || PALETTE[i % PALETTE.length];
});
const accentFor = p => p.accent || accentByKey[p.group] || PALETTE[hashIdx(p.group || p.id, PALETTE.length)];
const match = p => !q || p.name.toLowerCase().includes(q.toLowerCase());
const isFav = id => favs.has(id);
const toggleFav = (e, id) => {
e.stopPropagation();
setFavs(prev => {
const n = new Set(prev);
n.has(id) ? n.delete(id) : n.add(id);
return n;
});
onToggleFavorite && onToggleFavorite(id);
};
const select = id => {
onChange && onChange(id);
setOpen(false);
setQ('');
};
const byId = {};
projects.forEach(p => {
byId[p.id] = p;
});
const favList = projects.filter(p => isFav(p.id) && match(p));
const recentList = (recentIds || []).map(id => byId[id]).filter(p => p && match(p));
const flat = groupList.length <= 1 && favList.length === 0 && recentList.length === 0;
const Row = (p, keyPrefix) => {
const {
prefix,
rest
} = splitName(p.name, p.group);
const accent = accentFor(p);
const active = p.id === value;
return /*#__PURE__*/React.createElement("div", {
key: keyPrefix + p.id,
role: "option",
"aria-selected": active,
tabIndex: 0,
className: __ds_scope.cx('mona-ps__item', active && 'mona-ps__item--active'),
onClick: () => select(p.id),
onKeyDown: e => {
if (e.key === 'Enter' || e.key === ' ') {
e.preventDefault();
select(p.id);
}
}
}, /*#__PURE__*/React.createElement("span", {
className: "mona-ps__avatar",
style: {
background: accent + '22',
color: accent
}
}, initialsFor(p.name, p.group)), /*#__PURE__*/React.createElement("span", {
className: "mona-ps__itemname"
}, prefix && /*#__PURE__*/React.createElement("span", {
className: "mona-ps__prefix"
}, prefix), /*#__PURE__*/React.createElement("b", null, rest)), /*#__PURE__*/React.createElement("button", {
type: "button",
className: __ds_scope.cx('mona-ps__star', isFav(p.id) && 'is-fav'),
"aria-label": isFav(p.id) ? '즐겨찾기 해제' : '즐겨찾기',
"aria-pressed": isFav(p.id),
onClick: e => toggleFav(e, p.id)
}, isFav(p.id) ? STAR_FILL : STAR_LINE), p.role && /*#__PURE__*/React.createElement(__ds_scope.RoleBadge, {
role: p.role
}), /*#__PURE__*/React.createElement("span", {
className: "mona-ps__check",
"aria-hidden": "true"
}, active ? CHECK : null));
};
const SecHead = (key, icon, dot, lbl, count) => /*#__PURE__*/React.createElement("div", {
className: "mona-ps__sechead",
key: 'h-' + key
}, dot ? /*#__PURE__*/React.createElement("span", {
className: "mona-ps__dot",
style: {
background: dot
}
}) : /*#__PURE__*/React.createElement("span", {
className: __ds_scope.cx('mona-ps__secicon', icon === CLOCK ? 'mona-ps__secicon--recent' : 'mona-ps__secicon--fav')
}, icon), /*#__PURE__*/React.createElement("span", {
className: "mona-ps__seclabel"
}, lbl), count != null && /*#__PURE__*/React.createElement("span", {
className: "mona-ps__seccount"
}, count));
const anyResult = flat ? projects.some(match) : favList.length || recentList.length || groupList.some(g => projects.some(p => p.group === g.key && match(p)));
return /*#__PURE__*/React.createElement("div", _extends({
className: __ds_scope.cx('mona-ps', open && 'mona-ps--open', className),
ref: ref
}, rest), /*#__PURE__*/React.createElement("button", {
className: "mona-ps__btn",
"aria-haspopup": "listbox",
"aria-expanded": open,
onClick: () => setOpen(o => !o)
}, /*#__PURE__*/React.createElement("span", {
className: "mona-ps__name"
}, current ? current.name : label), current && current.role && /*#__PURE__*/React.createElement(__ds_scope.RoleBadge, {
role: current.role
}), /*#__PURE__*/React.createElement("span", {
className: "mona-ps__chev",
"aria-hidden": "true"
}, CHEV)), open && /*#__PURE__*/React.createElement("div", {
className: "mona-ps__panel"
}, /*#__PURE__*/React.createElement("div", {
className: "mona-ps__searchwrap"
}, /*#__PURE__*/React.createElement("span", {
className: "mona-ps__searchicon",
"aria-hidden": "true"
}, SEARCH), /*#__PURE__*/React.createElement("input", {
className: "mona-ps__search",
placeholder: "\uD504\uB85C\uC81D\uD2B8 \uAC80\uC0C9\u2026",
value: q,
autoFocus: true,
onChange: e => setQ(e.target.value)
})), /*#__PURE__*/React.createElement("div", {
className: "mona-ps__list",
role: "listbox"
}, !anyResult && /*#__PURE__*/React.createElement("div", {
className: "mona-ps__empty"
}, "\uAC80\uC0C9 \uACB0\uACFC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4"), flat && projects.filter(match).map(p => Row(p, 'f-')), !flat && favList.length > 0 && /*#__PURE__*/React.createElement(React.Fragment, {
key: "sec-fav"
}, SecHead('fav', STAR_FILL, null, '즐겨찾기', favList.length), favList.map(p => Row(p, 'fav-'))), !flat && recentList.length > 0 && /*#__PURE__*/React.createElement(React.Fragment, {
key: "sec-recent"
}, SecHead('recent', CLOCK, null, '최근 사용', null), recentList.map(p => Row(p, 'rec-'))), !flat && groupList.map(g => {
const items = projects.filter(p => p.group === g.key && match(p));
if (items.length === 0) return null;
return /*#__PURE__*/React.createElement(React.Fragment, {
key: 'sec-' + g.key
}, SecHead(g.key, null, accentByKey[g.key], g.label, items.length), items.map(p => Row(p, g.key + '-')));
}))));
}
Object.assign(__ds_scope, { ProjectSwitcher });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/navigation/ProjectSwitcher.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/navigation/Tabs.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-tabs', `
.mona-tabs { display: flex; gap: 2px; border-bottom: var(--border-width) solid var(--color-border); }
.mona-tabs--pill { gap: 6px; border-bottom: 0; }
.mona-tab {
position: relative; display: inline-flex; align-items: center; gap: 7px;
font: var(--font-medium) var(--text-sm)/1 var(--font-sans); color: var(--text-secondary);
background: transparent; border: 0; cursor: pointer; padding: 11px 14px;
border-bottom: 2px solid transparent; margin-bottom: -1px;
transition: color var(--duration-fast) var(--ease), border-color var(--duration-fast) var(--ease), background-color var(--duration-fast) var(--ease);
}
.mona-tab:hover { color: var(--text-body); }
.mona-tab--active { color: var(--color-primary); border-bottom-color: var(--color-primary); }
.mona-tab__count {
font-size: var(--text-2xs); font-weight: var(--font-semibold);
background: var(--surface-sunken); color: var(--text-secondary);
border-radius: var(--radius-pill); padding: 1px 7px;
}
.mona-tab--active .mona-tab__count { background: var(--color-primary-subtle); color: var(--color-primary); }
/* pill variant (segmented) */
.mona-tabs--pill .mona-tab { border: 0; margin: 0; border-radius: var(--radius-md); padding: 7px 13px; }
.mona-tabs--pill .mona-tab--active { background: var(--color-primary-subtle); color: var(--color-primary); }
`);
/**
* Tabs — horizontal tab bar. Default underline style for page sections;
* `variant="pill"` for segmented filters. Controlled via `value`/`onChange`.
*/
function Tabs({
tabs = [],
value,
onChange,
variant = 'underline',
className,
...rest
}) {
return /*#__PURE__*/React.createElement("div", _extends({
className: __ds_scope.cx('mona-tabs', variant === 'pill' && 'mona-tabs--pill', className),
role: "tablist"
}, rest), tabs.map(t => {
const id = t.id ?? t.value ?? t.label;
const active = id === value;
return /*#__PURE__*/React.createElement("button", {
key: id,
role: "tab",
"aria-selected": active,
className: __ds_scope.cx('mona-tab', active && 'mona-tab--active'),
onClick: () => onChange && onChange(id)
}, t.icon, t.label, t.count != null && /*#__PURE__*/React.createElement("span", {
className: "mona-tab__count"
}, t.count));
}));
}
Object.assign(__ds_scope, { Tabs });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/navigation/Tabs.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/surfaces/Card.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-card', `
.mona-card {
background: var(--surface-card); border: var(--border-width) solid var(--color-border);
border-radius: var(--radius-lg); box-shadow: var(--shadow-sm);
transition: box-shadow var(--duration) var(--ease), transform var(--duration) var(--ease), border-color var(--duration) var(--ease);
}
.mona-card--hover:hover { box-shadow: var(--shadow-lg); transform: translateY(-2px); }
.mona-card--selected { border-color: var(--color-primary); box-shadow: var(--focus-ring); }
.mona-card--flat { box-shadow: none; }
.mona-card__header { display: flex; align-items: center; gap: 10px; padding: 14px var(--space-5); border-bottom: var(--border-width) solid var(--color-border); }
.mona-card__title { font: var(--font-semibold) var(--text-md)/1.3 var(--font-sans); color: var(--text-body); }
.mona-card__header-actions { margin-left: auto; display: flex; gap: 6px; align-items: center; }
.mona-card__body { padding: var(--space-5); }
.mona-card__body--tight { padding: var(--space-4); }
.mona-card__footer { padding: 12px var(--space-5); border-top: var(--border-width) solid var(--color-border); background: var(--surface-subtle); border-radius: 0 0 var(--radius-lg) var(--radius-lg); }
`);
/**
* Card — the family surface container. Optional header (title + actions) and
* footer. Use `interactive` for hover-lift list cards and `selected` for the
* active state.
*/
function Card({
title,
icon = null,
headerActions = null,
footer = null,
interactive = false,
selected = false,
flat = false,
tight = false,
className,
children,
...rest
}) {
return /*#__PURE__*/React.createElement("div", _extends({
className: __ds_scope.cx('mona-card', interactive && 'mona-card--hover', selected && 'mona-card--selected', flat && 'mona-card--flat', className)
}, rest), (title || headerActions) && /*#__PURE__*/React.createElement("div", {
className: "mona-card__header"
}, icon, title && /*#__PURE__*/React.createElement("span", {
className: "mona-card__title"
}, title), headerActions && /*#__PURE__*/React.createElement("span", {
className: "mona-card__header-actions"
}, headerActions)), /*#__PURE__*/React.createElement("div", {
className: __ds_scope.cx('mona-card__body', tight && 'mona-card__body--tight')
}, children), footer && /*#__PURE__*/React.createElement("div", {
className: "mona-card__footer"
}, footer));
}
Object.assign(__ds_scope, { Card });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/surfaces/Card.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/surfaces/EnvBanner.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-envbanner', `
.mona-envbanner {
display: flex; align-items: center; justify-content: center; gap: 8px;
min-height: var(--banner-height); padding: 6px 16px; text-align: center;
font: var(--font-semibold) var(--text-xs)/1.4 var(--font-sans);
background: var(--color-warning); color: #3f2d06;
}
.mona-envbanner svg { flex: none; }
.mona-envbanner--prod { background: var(--color-env-prod); color: #fff; }
.mona-envbanner--stage { background: var(--color-env-stage); color: #fff; }
`);
const WARN = /*#__PURE__*/React.createElement("svg", {
width: "15",
height: "15",
viewBox: "0 0 24 24",
fill: "none",
stroke: "currentColor",
strokeWidth: "2.2",
strokeLinecap: "round",
strokeLinejoin: "round"
}, /*#__PURE__*/React.createElement("path", {
d: "m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"
}), /*#__PURE__*/React.createElement("path", {
d: "M12 9v4"
}), /*#__PURE__*/React.createElement("path", {
d: "M12 17h.01"
}));
/**
* EnvBanner — full-width environment warning bar shown at the very top
* (above the header). Amber for dev — the family-shared dev signal.
*/
function EnvBanner({
env = 'dev',
label,
className,
...rest
}) {
const text = label || (env === 'dev' ? '개발망 (Development)' : env === 'stage' ? '스테이징 (Staging)' : '운영 환경 (Production)');
return /*#__PURE__*/React.createElement("div", _extends({
className: __ds_scope.cx('mona-envbanner', env !== 'dev' && `mona-envbanner--${env}`, className),
role: "alert"
}, rest), WARN, /*#__PURE__*/React.createElement("span", null, text));
}
Object.assign(__ds_scope, { EnvBanner });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/surfaces/EnvBanner.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/surfaces/Modal.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-modal', `
.mona-modal__overlay {
position: fixed; inset: 0; z-index: var(--z-overlay);
background: var(--color-overlay); backdrop-filter: blur(2px);
display: flex; align-items: center; justify-content: center; padding: 20px;
animation: mona-fade-in var(--duration) var(--ease-out);
}
.mona-modal {
background: var(--surface-card); border: var(--border-width) solid var(--color-border);
border-radius: var(--radius-lg); box-shadow: var(--shadow-2xl);
width: 100%; max-height: 90dvh; display: flex; flex-direction: column;
z-index: var(--z-modal);
}
.mona-modal--sm { max-width: 400px; }
.mona-modal--md { max-width: 520px; }
.mona-modal--lg { max-width: 680px; }
.mona-modal--xl { max-width: 880px; }
.mona-modal__header { display: flex; align-items: center; gap: 10px; padding: 16px var(--space-6); border-bottom: var(--border-width) solid var(--color-border); }
.mona-modal__title { font: var(--font-bold) var(--text-lg)/1.3 var(--font-sans); color: var(--text-body); }
.mona-modal__close { margin-left: auto; border: 0; background: transparent; cursor: pointer; color: var(--text-muted); border-radius: var(--radius-sm); padding: 4px; display: flex; }
.mona-modal__close:hover { background: var(--surface-hover); color: var(--text-body); }
.mona-modal__body { padding: var(--space-6); overflow: auto; font: var(--font-regular) var(--text-sm)/1.6 var(--font-sans); color: var(--text-secondary); }
.mona-modal__footer { display: flex; justify-content: flex-end; gap: 10px; padding: 14px var(--space-6); border-top: var(--border-width) solid var(--color-border); background: var(--surface-subtle); border-radius: 0 0 var(--radius-lg) var(--radius-lg); }
`);
/**
* Modal — centered dialog with scrim, header (title + close), scrollable body
* and footer action bar. The single family dialog pattern (replaces Files'
* window.confirm and Pass's one-off overlays).
*/
function Modal({
open = true,
title,
onClose,
size = 'md',
footer = null,
closeOnOverlay = true,
className,
children,
...rest
}) {
if (!open) return null;
return /*#__PURE__*/React.createElement("div", {
className: "mona-modal__overlay",
onClick: closeOnOverlay && onClose ? e => {
if (e.target === e.currentTarget) onClose();
} : undefined
}, /*#__PURE__*/React.createElement("div", _extends({
className: __ds_scope.cx('mona-modal', `mona-modal--${size}`, className),
role: "dialog",
"aria-modal": "true"
}, rest), (title || onClose) && /*#__PURE__*/React.createElement("div", {
className: "mona-modal__header"
}, title && /*#__PURE__*/React.createElement("span", {
className: "mona-modal__title"
}, title), onClose && /*#__PURE__*/React.createElement("button", {
className: "mona-modal__close",
"aria-label": "\uB2EB\uAE30",
onClick: onClose
}, /*#__PURE__*/React.createElement("svg", {
width: "18",
height: "18",
viewBox: "0 0 24 24",
fill: "none",
stroke: "currentColor",
strokeWidth: "2",
strokeLinecap: "round",
strokeLinejoin: "round"
}, /*#__PURE__*/React.createElement("path", {
d: "M18 6 6 18"
}), /*#__PURE__*/React.createElement("path", {
d: "m6 6 12 12"
})))), /*#__PURE__*/React.createElement("div", {
className: "mona-modal__body"
}, children), footer && /*#__PURE__*/React.createElement("div", {
className: "mona-modal__footer"
}, footer)));
}
Object.assign(__ds_scope, { Modal });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/surfaces/Modal.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/surfaces/ConfirmDialog.jsx
try { (() => {
__ds_scope.injectStyle('mona-confirm', `
.mona-confirm__msg { font: var(--font-regular) var(--text-sm)/1.6 var(--font-sans); color: var(--text-secondary); }
.mona-confirm__warn { display: flex; gap: 9px; align-items: flex-start; background: var(--color-danger-subtle); color: var(--color-danger); border-radius: var(--radius-md); padding: 11px 13px; font: var(--font-medium) var(--text-xs)/1.5 var(--font-sans); margin-top: 14px; }
.mona-confirm__warn svg { flex: none; margin-top: 1px; }
.mona-confirm__section { margin-top: 16px; }
.mona-confirm__seclabel { font: var(--font-semibold) var(--text-xs)/1 var(--font-sans); color: var(--text-secondary); margin-bottom: 9px; }
.mona-confirm__confirm { margin-top: 16px; }
.mona-confirm__confirm label { display: block; font: var(--font-regular) var(--text-xs)/1.5 var(--font-sans); color: var(--text-muted); margin-bottom: 7px; }
.mona-confirm__confirm code { font-family: var(--font-mono); color: var(--text-body); font-weight: var(--font-semibold); }
.mona-confirm__input { width: 100%; font: var(--font-regular) var(--text-sm)/1.4 var(--font-mono); color: var(--text-body); background: var(--surface-card); border: var(--border-width) solid var(--color-border-strong); border-radius: var(--radius-md); padding: 9px 12px; }
.mona-confirm__input:focus { outline: none; border-color: var(--color-primary); box-shadow: var(--focus-ring); }
`);
const WARN = /*#__PURE__*/React.createElement("svg", {
width: "15",
height: "15",
viewBox: "0 0 24 24",
fill: "none",
stroke: "currentColor",
strokeWidth: "2.2",
strokeLinecap: "round",
strokeLinejoin: "round"
}, /*#__PURE__*/React.createElement("path", {
d: "m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"
}), /*#__PURE__*/React.createElement("path", {
d: "M12 9v4"
}), /*#__PURE__*/React.createElement("path", {
d: "M12 17h.01"
}));
/**
* ConfirmDialog — the family's canonical confirm/destructive dialog (built on
* Modal). Neutral by default; `tone="destructive"` colors the confirm button
* red. Supports a warning callout, an optional policy RadioGroup, and a
* type-to-confirm phrase that gates the confirm button (delete flows).
*/
function ConfirmDialog({
open = true,
tone = 'neutral',
title,
message,
warning,
policies,
policyValue,
onPolicyChange,
confirmPhrase,
confirmLabel,
cancelLabel = '취소',
onConfirm,
onCancel,
children
}) {
const [typed, setTyped] = React.useState('');
React.useEffect(() => {
if (!open) setTyped('');
}, [open]);
const phraseOK = !confirmPhrase || typed === confirmPhrase;
const destructive = tone === 'destructive';
return /*#__PURE__*/React.createElement(__ds_scope.Modal, {
open: open,
size: "sm",
title: title,
onClose: onCancel,
footer: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(__ds_scope.Button, {
variant: "ghost",
onClick: onCancel
}, cancelLabel), /*#__PURE__*/React.createElement(__ds_scope.Button, {
variant: destructive ? 'danger' : 'primary',
disabled: !phraseOK,
onClick: onConfirm
}, confirmLabel || (destructive ? '삭제' : '확인')))
}, message && /*#__PURE__*/React.createElement("div", {
className: "mona-confirm__msg"
}, message), children, policies && policies.length > 0 && /*#__PURE__*/React.createElement("div", {
className: "mona-confirm__section"
}, /*#__PURE__*/React.createElement(__ds_scope.RadioGroup, {
card: true,
options: policies,
value: policyValue,
onChange: onPolicyChange
})), warning && /*#__PURE__*/React.createElement("div", {
className: "mona-confirm__warn"
}, WARN, /*#__PURE__*/React.createElement("span", null, warning)), confirmPhrase && /*#__PURE__*/React.createElement("div", {
className: "mona-confirm__confirm"
}, /*#__PURE__*/React.createElement("label", null, "\uD655\uC778\uC744 \uC704\uD574 \uC544\uB798 \uC785\uB825\uCC3D\uC5D0 ", /*#__PURE__*/React.createElement("code", null, confirmPhrase), " \uC744(\uB97C) \uC785\uB825\uD558\uC138\uC694."), /*#__PURE__*/React.createElement("input", {
className: "mona-confirm__input",
value: typed,
placeholder: confirmPhrase,
onChange: e => setTyped(e.target.value),
onPaste: e => e.preventDefault()
})));
}
Object.assign(__ds_scope, { ConfirmDialog });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/surfaces/ConfirmDialog.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/components/surfaces/StatCard.jsx
try { (() => {
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
__ds_scope.injectStyle('mona-statcard', `
.mona-stat { background: var(--surface-card); border: var(--border-width) solid var(--color-border); border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); padding: 16px 18px; }
.mona-stat__top { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; }
.mona-stat__label { font: var(--font-medium) var(--text-xs)/1.3 var(--font-sans); color: var(--text-muted); }
.mona-stat__icon { display: flex; color: var(--color-primary); flex: none; }
.mona-stat__value { font: var(--font-bold) var(--text-3xl)/1 var(--font-sans); color: var(--text-body); letter-spacing: var(--tracking-tight); margin-top: 10px; }
.mona-stat__value--md { font-size: var(--text-2xl); }
.mona-stat__foot { display: flex; align-items: center; gap: 6px; margin-top: 8px; font: var(--font-regular) var(--text-xs)/1.3 var(--font-sans); color: var(--text-muted); }
.mona-stat__delta { font-weight: var(--font-semibold); }
.mona-stat__delta--up { color: var(--color-success); }
.mona-stat__delta--down { color: var(--color-danger); }
`);
/**
* StatCard — labeled metric card for dashboards and detail headers
* (project count, member count, quota totals…). Optional icon, footnote and
* trend delta.
*/
function StatCard({
label,
value,
icon = null,
accent,
footnote = null,
delta,
size = 'lg',
className,
...rest
}) {
return /*#__PURE__*/React.createElement("div", _extends({
className: __ds_scope.cx('mona-stat', className)
}, rest), /*#__PURE__*/React.createElement("div", {
className: "mona-stat__top"
}, /*#__PURE__*/React.createElement("span", {
className: "mona-stat__label"
}, label), icon && /*#__PURE__*/React.createElement("span", {
className: "mona-stat__icon",
style: accent ? {
color: accent
} : undefined
}, icon)), /*#__PURE__*/React.createElement("div", {
className: __ds_scope.cx('mona-stat__value', size === 'md' && 'mona-stat__value--md')
}, value), (footnote || delta) && /*#__PURE__*/React.createElement("div", {
className: "mona-stat__foot"
}, delta && /*#__PURE__*/React.createElement("span", {
className: __ds_scope.cx('mona-stat__delta', delta.dir && `mona-stat__delta--${delta.dir}`)
}, delta.label), footnote));
}
Object.assign(__ds_scope, { StatCard });
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/components/surfaces/StatCard.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/ui_kits/airsflow/screens.jsx
try { (() => {
/* MONA AiRSFlow — UI kit. The ONLY design surfaces we control are the family
header, the project selector, and the error/empty screens. The Airflow 3 UI
inside the iframe is an external system — shown here only as a bounded region. */
const NS = window.MONAFamilyDesignSystem_3cb9a3;
const {
AppHeader,
LoginScreen,
EnvBanner,
ProjectSwitcher,
Button,
EmptyState
} = NS;
function Icon({
name,
size = 16,
stroke = 2,
...rest
}) {
const ico = window.lucide && window.lucide.icons && window.lucide.icons[name];
if (!ico) return null;
const kids = (ico[2] || []).map((c, i) => React.createElement(c[0], {
key: i,
...c[1]
}));
return React.createElement('svg', {
width: size,
height: size,
viewBox: '0 0 24 24',
fill: 'none',
stroke: 'currentColor',
strokeWidth: stroke,
strokeLinecap: 'round',
strokeLinejoin: 'round',
...rest
}, kids);
}
const PROJECTS = [{
id: 'demo',
name: 'mona-demo',
role: 'admin'
}, {
id: 'reco',
name: '추천 파이프라인',
role: 'developer'
}, {
id: 'ads',
name: '광고주센터 api',
role: 'viewer'
}];
function Shell({
theme,
onToggle,
hasProjects,
project,
setProject,
showError
}) {
const right = /*#__PURE__*/React.createElement("div", {
className: "af-linkrow"
}, /*#__PURE__*/React.createElement("a", {
className: "af-link",
href: "#",
onClick: e => e.preventDefault()
}, /*#__PURE__*/React.createElement(Icon, {
name: "BookOpen",
size: 15
}), "\uAC00\uC774\uB4DC"), /*#__PURE__*/React.createElement("a", {
className: "af-link",
href: "#",
onClick: e => e.preventDefault()
}, /*#__PURE__*/React.createElement(Icon, {
name: "LogOut",
size: 15
}), "\uB85C\uADF8\uC544\uC6C3"));
return /*#__PURE__*/React.createElement("div", {
className: "af-app"
}, /*#__PURE__*/React.createElement(EnvBanner, {
env: "dev"
}), /*#__PURE__*/React.createElement(AppHeader, {
logo: "../../assets/logos/airsflow.svg",
product: "AiRSFlow",
center: hasProjects ? /*#__PURE__*/React.createElement(ProjectSwitcher, {
projects: PROJECTS,
value: project,
onChange: setProject
}) : null,
theme: theme,
onThemeToggle: onToggle,
rightExtra: right,
user: {
name: 'bsb'
}
}), hasProjects && !showError && /*#__PURE__*/React.createElement("div", {
className: "af-iframe"
}, /*#__PURE__*/React.createElement("div", {
className: "af-iframe__boundary"
}), /*#__PURE__*/React.createElement("span", {
className: "af-iframe__tag"
}, /*#__PURE__*/React.createElement(Icon, {
name: "ExternalLink",
size: 13
}), " AiRSFlow (Airflow 3) \xB7 \uC678\uBD80 \uC2DC\uC2A4\uD15C (iframe)"), /*#__PURE__*/React.createElement("div", {
className: "af-iframe__center"
}, /*#__PURE__*/React.createElement("div", {
className: "af-iframe__icon"
}, /*#__PURE__*/React.createElement(Icon, {
name: "Workflow",
size: 46,
stroke: 1.5
})), /*#__PURE__*/React.createElement("div", {
className: "af-iframe__title"
}, "Airflow 3 UI\uAC00 \uC774 \uC601\uC5ED\uC5D0 \uC784\uBCA0\uB4DC\uB429\uB2C8\uB2E4"), /*#__PURE__*/React.createElement("div", {
className: "af-iframe__desc"
}, "iframe \uB0B4\uBD80\uB294 \uC678\uBD80 \uC2DC\uC2A4\uD15C\uC73C\uB85C \uD328\uBC00\uB9AC \uB514\uC790\uC778 \uD1B5\uC81C \uBC94\uC704 \uBC16\uC785\uB2C8\uB2E4. \uC6B0\uB9AC\uAC00 \uB514\uC790\uC778\uD558\uB294 \uD45C\uBA74\uC740 \uC0C1\uB2E8 \uD5E4\uB354\xB7\uD504\uB85C\uC81D\uD2B8 \uC140\uB809\uD130\xB7\uC5D0\uB7EC \uD654\uBA74\uBFD0\uC785\uB2C8\uB2E4."))), showError && /*#__PURE__*/React.createElement("div", {
className: "af-error"
}, /*#__PURE__*/React.createElement(EmptyState, {
size: "lg",
icon: /*#__PURE__*/React.createElement(Icon, {
name: "ShieldAlert",
size: 26
}),
title: "\uC811\uADFC \uAC00\uB2A5\uD55C AiRSFlow\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4",
description: "\uD604\uC7AC \uACC4\uC815\uC73C\uB85C \uC811\uADFC \uAC00\uB2A5\uD55C AiRSFlow hub\uAC00 \uB4F1\uB85D\uB41C \uD504\uB85C\uC81D\uD2B8\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. \uD504\uB85C\uC81D\uD2B8 \uAD8C\uD55C\uC744 \uD655\uC778\uD558\uAC70\uB098 \uAD00\uB9AC\uC790\uC5D0\uAC8C \uBB38\uC758\uD558\uC138\uC694.",
action: /*#__PURE__*/React.createElement(Button, {
variant: "secondary",
leadingIcon: /*#__PURE__*/React.createElement(Icon, {
name: "LogOut",
size: 15
})
}, "\uB85C\uADF8\uC544\uC6C3")
})));
}
function AiRSFlowRoot() {
const [authed, setAuthed] = React.useState(false);
const [theme, setTheme] = React.useState('light');
const [project, setProject] = React.useState('demo');
const [mode, setMode] = React.useState('shell'); // 'shell' | 'error'
React.useEffect(() => {
document.documentElement.classList.toggle('dark', theme === 'dark');
}, [theme]);
if (!authed) {
return /*#__PURE__*/React.createElement(LoginScreen, {
logo: "../../assets/logos/airsflow.svg",
product: "AiRSFlow",
title: "Airflow\uB97C \uAD8C\uD55C \uBAA8\uB378 \uC548\uC5D0\uC11C",
subtitle: "\uD504\uB85C\uC81D\uD2B8 \uAD8C\uD55C\uC73C\uB85C AiRSFlow(Airflow 3) UI\uC5D0 \uC548\uC804\uD558\uAC8C \uC811\uADFC\uD569\uB2C8\uB2E4.",
buttonLabel: "SSO \uB85C\uADF8\uC778",
onLogin: () => setAuthed(true),
note: /*#__PURE__*/React.createElement(React.Fragment, null, "OSS \uACC4\uC815\uC73C\uB85C \uB85C\uADF8\uC778\uD569\uB2C8\uB2E4 \xB7 ", /*#__PURE__*/React.createElement("a", {
href: "#",
onClick: e => e.preventDefault()
}, "\uAC00\uC774\uB4DC"))
});
}
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Shell, {
theme: theme,
onToggle: () => setTheme(t => t === 'dark' ? 'light' : 'dark'),
hasProjects: mode === 'shell',
project: project,
setProject: setProject,
showError: mode === 'error'
}), /*#__PURE__*/React.createElement("div", {
className: "demo-toggle"
}, /*#__PURE__*/React.createElement(Button, {
size: "sm",
variant: "secondary",
onClick: () => setMode(m => m === 'shell' ? 'error' : 'shell')
}, mode === 'shell' ? '403 에러 화면 보기' : 'shell 화면 보기')));
}
ReactDOM.createRoot(document.getElementById('root')).render(/*#__PURE__*/React.createElement(AiRSFlowRoot, null));
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/ui_kits/airsflow/screens.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/ui_kits/files/screens.jsx
try { (() => {
/* MONA Files — interactive 3-pane S3 browser. Composes family components +
Files-specific layout (tree / file pane / details). */
const NS = window.MONAFamilyDesignSystem_3cb9a3;
const {
AppHeader,
LoginScreen,
EnvBanner,
ProjectSwitcher,
Input,
Button,
IconButton,
Badge,
RoleBadge,
EmptyState,
Skeleton
} = NS;
function Icon({
name,
size = 16,
stroke = 2,
...rest
}) {
const ico = window.lucide && window.lucide.icons && window.lucide.icons[name];
if (!ico) return null;
const kids = (ico[2] || []).map((c, i) => React.createElement(c[0], {
key: i,
...c[1]
}));
return React.createElement('svg', {
width: size,
height: size,
viewBox: '0 0 24 24',
fill: 'none',
stroke: 'currentColor',
strokeWidth: stroke,
strokeLinecap: 'round',
strokeLinejoin: 'round',
...rest
}, kids);
}
/* ---- File-type icon mapping (Files-specific colors, tokenized) ---- */
function FileIcon({
kind,
size = 19
}) {
const map = {
folder: {
name: 'Folder',
color: 'var(--color-file-folder)'
},
json: {
name: 'FileJson',
color: 'var(--color-file-doc)'
},
yaml: {
name: 'FileCode2',
color: 'var(--color-file-doc)'
},
csv: {
name: 'FileSpreadsheet',
color: 'var(--color-file-doc)'
},
text: {
name: 'FileText',
color: 'var(--color-file-text)'
},
model: {
name: 'Box',
color: 'var(--color-file-folder)'
},
archive: {
name: 'FileArchive',
color: 'var(--color-file-doc)'
},
binary: {
name: 'HardDrive',
color: 'var(--color-file-folder)'
},
file: {
name: 'File',
color: 'var(--color-file-folder)'
}
};
const m = map[kind] || map.file;
return /*#__PURE__*/React.createElement("span", {
style: {
color: m.color,
display: 'flex'
}
}, /*#__PURE__*/React.createElement(Icon, {
name: m.name,
size: size
}));
}
const PROJECTS = [{
id: 'ad-ai-ad-management',
name: 'ad-ai-ad-management',
role: 'admin',
group: 'ad-ai',
favorite: true
}, {
id: 'ad-ai-ava',
name: 'ad-ai-ava',
role: 'admin',
group: 'ad-ai'
}, {
id: 'ad-ai-gfa-serving',
name: 'ad-ai-gfa-serving',
role: 'admin',
group: 'ad-ai'
}, {
id: 'ad-ai-pmax-prediction',
name: 'ad-ai-pmax-prediction',
role: 'admin',
group: 'ad-ai'
}, {
id: 'ad-ai-pmax-training-status-collector',
name: 'ad-ai-pmax-training-status-collector',
role: 'admin',
group: 'ad-ai'
}, {
id: 'ad-ai-sa-ranker',
name: 'ad-ai-sa-ranker',
role: 'admin',
group: 'ad-ai'
}, {
id: 'mona-ad-routing',
name: 'mona-ad-routing',
role: 'admin',
group: 'mona'
}, {
id: 'mona-demo',
name: 'mona-demo',
role: 'admin',
group: 'mona'
}, {
id: 'mona-mdp',
name: 'mona-mdp',
role: 'admin',
group: 'mona'
}, {
id: 'mona-shoppingvm-v2',
name: 'mona-shoppingvm-v2',
role: 'admin',
group: 'mona'
}, {
id: 'mona-system',
name: 'mona-system',
role: 'admin',
group: 'mona',
favorite: true
}, {
id: 'mona-test',
name: 'mona-test',
role: 'admin',
group: 'mona'
}];
const GROUPS = [{
key: 'ad-ai',
label: 'AD-AI',
accent: '#2563eb'
}, {
key: 'mona',
label: 'MONA',
accent: '#7e22ce'
}];
const RECENT_IDS = ['ad-ai-ad-management', 'mona-system', 'ad-ai-sa-ranker', 'mona-shoppingvm-v2'];
const BUCKET = 'mpd-ad-ai-ad-management';
const CRUMB = ['test'];
const TREE = [{
name: 'test',
open: false,
children: []
}, {
name: 'test2',
open: false,
children: []
}];
const FILES = [{
name: 'checkpoints',
kind: 'folder',
type: '폴더',
size: '—',
mod: '2026-06-14'
}, {
name: 'model.tar.gz',
kind: 'archive',
type: 'GZ',
size: '143 MB',
mod: '2026-06-13'
}, {
name: 'pycharm-2026.1.2-aarch64.dmg',
kind: 'binary',
type: 'DMG',
size: '1.1 GB',
mod: '2026-06-14'
}, {
name: 'train_config.yaml',
kind: 'yaml',
type: 'YAML',
size: '4.2 KB',
mod: '2026-06-12'
}, {
name: 'metrics.json',
kind: 'json',
type: 'JSON',
size: '18 KB',
mod: '2026-06-12'
}, {
name: 'eval_results.csv',
kind: 'csv',
type: 'CSV',
size: '212 KB',
mod: '2026-06-11'
}, {
name: 'README.md',
kind: 'text',
type: 'Markdown',
size: '2.1 KB',
mod: '2026-06-09'
}];
/* ---- Tree pane ---- */
function TreeNode({
node,
depth,
path,
active,
onSelect
}) {
const [open, setOpen] = React.useState(!!node.open);
const hasKids = node.children && node.children.length > 0;
const full = path + '/' + node.name;
return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
className: 'mf-treerow' + (open ? ' open' : '') + (active === full ? ' on' : ''),
style: {
paddingLeft: 8 + depth * 14
},
onClick: () => {
onSelect(full);
if (hasKids) setOpen(o => !o);
}
}, /*#__PURE__*/React.createElement("span", {
className: "chev",
style: {
visibility: hasKids ? 'visible' : 'hidden'
}
}, /*#__PURE__*/React.createElement(Icon, {
name: "ChevronRight",
size: 14
})), /*#__PURE__*/React.createElement(FileIcon, {
kind: "folder",
size: 16
}), /*#__PURE__*/React.createElement("span", null, node.name)), open && hasKids && node.children.map(c => /*#__PURE__*/React.createElement(TreeNode, {
key: c.name,
node: c,
depth: depth + 1,
path: full,
active: active,
onSelect: onSelect
})));
}
/* ---- Files main ---- */
function MainApp() {
const [view, setView] = React.useState('list');
const [sel, setSel] = React.useState(FILES[2]);
const [treeSel, setTreeSel] = React.useState('/');
const selFile = sel || FILES[0];
const isFolder = selFile.kind === 'folder';
return /*#__PURE__*/React.createElement("div", {
className: "mf-app"
}, /*#__PURE__*/React.createElement(EnvBanner, {
env: "dev"
}), /*#__PURE__*/React.createElement(AppHeader, {
logo: "../../assets/logos/files.svg",
product: "Files",
center: /*#__PURE__*/React.createElement(ProjectSwitcher, {
projects: PROJECTS,
groups: GROUPS,
recentIds: RECENT_IDS,
value: "ad-ai-ad-management",
onChange: () => {}
}),
rightExtra: /*#__PURE__*/React.createElement("div", {
className: "mf-search"
}, /*#__PURE__*/React.createElement(Input, {
placeholder: "\uC774 \uBC84\uD0B7\uC758 \uD30C\uC77C \uAC80\uC0C9",
leadingIcon: /*#__PURE__*/React.createElement(Icon, {
name: "Search",
size: 15
})
})),
theme: window.__filesTheme,
onThemeToggle: window.__toggleTheme,
user: {
name: 'RK'
}
}), /*#__PURE__*/React.createElement("div", {
className: "mf-context"
}, /*#__PURE__*/React.createElement("div", {
className: "mf-context__left"
}, /*#__PURE__*/React.createElement("div", {
style: {
display: 'flex',
alignItems: 'center',
gap: 6,
font: 'var(--font-medium) var(--text-sm)/1 var(--font-sans)',
color: 'var(--text-body)',
flexWrap: 'wrap'
}
}, /*#__PURE__*/React.createElement("span", {
style: {
color: 'var(--color-primary)',
display: 'flex'
}
}, /*#__PURE__*/React.createElement(Icon, {
name: "Database",
size: 15
})), /*#__PURE__*/React.createElement("span", null, "ad-ai-ad-management"), CRUMB.map((c, i) => /*#__PURE__*/React.createElement(React.Fragment, {
key: c
}, /*#__PURE__*/React.createElement("span", {
style: {
color: 'var(--text-disabled)',
display: 'flex'
}
}, /*#__PURE__*/React.createElement(Icon, {
name: "ChevronRight",
size: 13
})), /*#__PURE__*/React.createElement("span", {
style: {
color: i === CRUMB.length - 1 ? 'var(--text-body)' : 'var(--text-secondary)',
fontWeight: i === CRUMB.length - 1 ? 'var(--font-semibold)' : 'var(--font-medium)'
}
}, c)))), /*#__PURE__*/React.createElement("div", {
className: "mf-bucketline"
}, "\uBC84\uD0B7 ", BUCKET, "/")), /*#__PURE__*/React.createElement("div", {
className: "mf-context__actions"
}, /*#__PURE__*/React.createElement("div", {
className: "mf-seg"
}, /*#__PURE__*/React.createElement("button", {
className: view === 'list' ? 'on' : '',
onClick: () => setView('list'),
"aria-label": "\uB9AC\uC2A4\uD2B8"
}, /*#__PURE__*/React.createElement(Icon, {
name: "List",
size: 16
})), /*#__PURE__*/React.createElement("button", {
className: view === 'grid' ? 'on' : '',
onClick: () => setView('grid'),
"aria-label": "\uCE74\uB4DC"
}, /*#__PURE__*/React.createElement(Icon, {
name: "Grid2x2",
size: 16
}))), /*#__PURE__*/React.createElement(Button, {
size: "sm",
leadingIcon: /*#__PURE__*/React.createElement(Icon, {
name: "Upload",
size: 15
})
}, "\uC5C5\uB85C\uB4DC"), /*#__PURE__*/React.createElement(Button, {
size: "sm",
variant: "secondary",
leadingIcon: /*#__PURE__*/React.createElement(Icon, {
name: "FolderPlus",
size: 15
})
}, "\uC0C8 \uD3F4\uB354"), /*#__PURE__*/React.createElement(Button, {
size: "sm",
variant: "danger-outline",
leadingIcon: /*#__PURE__*/React.createElement(Icon, {
name: "Trash2",
size: 15
})
}, "\uC0AD\uC81C"))), /*#__PURE__*/React.createElement("div", {
className: "mf-main"
}, /*#__PURE__*/React.createElement("aside", {
className: "mf-tree"
}, /*#__PURE__*/React.createElement("div", {
className: "mf-paneltitle"
}, "\uBC84\uD0B7 \uD30C\uC77C \uD2B8\uB9AC"), /*#__PURE__*/React.createElement("div", {
className: 'mf-treerow' + (treeSel === '/' ? ' on' : ''),
onClick: () => setTreeSel('/')
}, /*#__PURE__*/React.createElement("span", {
className: "chev",
style: {
visibility: 'hidden'
}
}), /*#__PURE__*/React.createElement(FileIcon, {
kind: "folder",
size: 16
}), /*#__PURE__*/React.createElement("span", null, "/")), TREE.map(n => /*#__PURE__*/React.createElement(TreeNode, {
key: n.name,
node: n,
depth: 1,
path: "",
active: treeSel,
onSelect: setTreeSel
}))), /*#__PURE__*/React.createElement("section", {
className: "mf-files"
}, view === 'list' ? /*#__PURE__*/React.createElement("div", {
className: "mf-list"
}, /*#__PURE__*/React.createElement("div", {
className: "mf-listhead"
}, /*#__PURE__*/React.createElement("span", null, "\uC774\uB984"), /*#__PURE__*/React.createElement("span", null, "\uC720\uD615"), /*#__PURE__*/React.createElement("span", null, "\uD06C\uAE30"), /*#__PURE__*/React.createElement("span", null, "\uC218\uC815\uC77C")), FILES.map(f => /*#__PURE__*/React.createElement("div", {
key: f.name,
className: 'mf-row' + (selFile.name === f.name ? ' sel' : ''),
onClick: () => setSel(f)
}, /*#__PURE__*/React.createElement("div", {
className: "mf-name"
}, /*#__PURE__*/React.createElement(FileIcon, {
kind: f.kind
}), /*#__PURE__*/React.createElement("span", null, f.name)), /*#__PURE__*/React.createElement("div", {
className: "mf-meta"
}, f.type), /*#__PURE__*/React.createElement("div", {
className: "mf-meta"
}, f.size), /*#__PURE__*/React.createElement("div", {
className: "mf-meta"
}, f.mod)))) : /*#__PURE__*/React.createElement("div", {
className: "mf-grid"
}, FILES.map(f => /*#__PURE__*/React.createElement("div", {
key: f.name,
className: 'mf-tile' + (selFile.name === f.name ? ' sel' : ''),
onClick: () => setSel(f)
}, /*#__PURE__*/React.createElement(FileIcon, {
kind: f.kind,
size: 40
}), /*#__PURE__*/React.createElement("div", {
className: "mf-tile__name"
}, f.name), /*#__PURE__*/React.createElement("div", {
className: "mf-tile__meta"
}, f.size))))), /*#__PURE__*/React.createElement("aside", {
className: "mf-details"
}, /*#__PURE__*/React.createElement("div", {
className: "mf-paneltitle"
}, "\uC0C1\uC138 \uC815\uBCF4"), /*#__PURE__*/React.createElement("div", {
className: "mf-preview"
}, /*#__PURE__*/React.createElement("div", {
className: "mf-preview__icon"
}, /*#__PURE__*/React.createElement(FileIcon, {
kind: selFile.kind,
size: 34
})), /*#__PURE__*/React.createElement("div", {
className: "mf-preview__name"
}, selFile.name), /*#__PURE__*/React.createElement("div", {
className: "mf-preview__type"
}, selFile.type, " \xB7 ", selFile.size)), /*#__PURE__*/React.createElement("div", {
className: "mf-detail-actions"
}, /*#__PURE__*/React.createElement(Button, {
block: true,
disabled: isFolder,
leadingIcon: /*#__PURE__*/React.createElement(Icon, {
name: "Download",
size: 15
})
}, "\uB2E4\uC6B4\uB85C\uB4DC"), /*#__PURE__*/React.createElement(Button, {
block: true,
variant: "danger-outline",
leadingIcon: /*#__PURE__*/React.createElement(Icon, {
name: "Trash2",
size: 15
})
}, "\uC0AD\uC81C")), /*#__PURE__*/React.createElement("div", {
className: "mf-metalist"
}, /*#__PURE__*/React.createElement("div", {
className: "mf-metarow"
}, /*#__PURE__*/React.createElement("span", null, "\uC720\uD615"), /*#__PURE__*/React.createElement("b", null, selFile.type)), /*#__PURE__*/React.createElement("div", {
className: "mf-metarow"
}, /*#__PURE__*/React.createElement("span", null, "\uC218\uC815\uC77C"), /*#__PURE__*/React.createElement("b", null, selFile.mod, " 17:31")), /*#__PURE__*/React.createElement("div", {
className: "mf-metarow"
}, /*#__PURE__*/React.createElement("span", null, "\uC5C5\uB85C\uB4DC"), /*#__PURE__*/React.createElement("b", {
className: "dim"
}, "\uC815\uBCF4 \uC5C6\uC74C")), /*#__PURE__*/React.createElement("div", {
className: "mf-pathwrap"
}, /*#__PURE__*/React.createElement("span", {
className: "mf-pathlabel"
}, "\uACBD\uB85C"), /*#__PURE__*/React.createElement("code", {
className: "mf-pathbox"
}, BUCKET, "/", CRUMB.join('/'), "/", selFile.name))), /*#__PURE__*/React.createElement("div", {
className: "mf-usage"
}, /*#__PURE__*/React.createElement("div", {
className: "mf-paneltitle",
style: {
paddingLeft: 0
}
}, "\uBC84\uD0B7 \uC0AC\uC6A9\uB7C9"), /*#__PURE__*/React.createElement("div", {
className: "mf-statgrid"
}, /*#__PURE__*/React.createElement("div", {
className: "mf-statbox"
}, /*#__PURE__*/React.createElement("div", {
className: "mf-stat__v"
}, "1.4 GB"), /*#__PURE__*/React.createElement("div", {
className: "mf-stat__l"
}, "\uC0AC\uC6A9 \uC6A9\uB7C9")), /*#__PURE__*/React.createElement("div", {
className: "mf-statbox"
}, /*#__PURE__*/React.createElement("div", {
className: "mf-stat__v"
}, "7"), /*#__PURE__*/React.createElement("div", {
className: "mf-stat__l"
}, "\uAC1D\uCCB4 \uC218"))), /*#__PURE__*/React.createElement("div", {
className: "mf-usage-note"
}, "\uCD1D \uD55C\uB3C4 \uC815\uBCF4 \uBBF8\uC81C\uACF5 \xB7 ", BUCKET)))));
}
/* ---- Root: login → app, theme toggle ---- */
function FilesRoot() {
const [authed, setAuthed] = React.useState(false);
const [theme, setTheme] = React.useState('light');
React.useEffect(() => {
document.documentElement.classList.toggle('dark', theme === 'dark');
}, [theme]);
window.__filesTheme = theme;
window.__toggleTheme = () => setTheme(t => t === 'dark' ? 'light' : 'dark');
if (!authed) {
return /*#__PURE__*/React.createElement(LoginScreen, {
logo: "../../assets/logos/files.svg",
product: "Files",
title: "\uD504\uB85C\uC81D\uD2B8 \uD30C\uC77C\uC744 \uC548\uC804\uD558\uAC8C \uD0D0\uC0C9\uD569\uB2C8\uB2E4",
subtitle: "Keycloak \uAD8C\uD55C\uC73C\uB85C \uC811\uADFC \uAC00\uB2A5\uD55C \uD504\uB85C\uC81D\uD2B8 S3 \uBC84\uD0B7\uB9CC \uD45C\uC2DC\uB429\uB2C8\uB2E4.",
buttonLabel: "SSO \uB85C\uADF8\uC778",
onLogin: () => setAuthed(true),
note: /*#__PURE__*/React.createElement(React.Fragment, null, "OSS \uACC4\uC815\uC73C\uB85C \uB85C\uADF8\uC778\uD569\uB2C8\uB2E4 \xB7 ", /*#__PURE__*/React.createElement("a", {
href: "#",
onClick: e => e.preventDefault()
}, "\uB3C4\uC6C0\uB9D0"))
});
}
return /*#__PURE__*/React.createElement(MainApp, null);
}
ReactDOM.createRoot(document.getElementById('root')).render(/*#__PURE__*/React.createElement(FilesRoot, null));
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/ui_kits/files/screens.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/ui_kits/pass/screens-admin.jsx
try { (() => {
/* MONA Pass — Admin console (8 tabs). Demonstrates Tabs+counts, Table,
SortableHeader, ProgressBar, StatCard, EmptyState, EnvChip, settings cards. */
(() => {
const NS = window.MONAFamilyDesignSystem_3cb9a3;
const {
Tabs,
Card,
Table,
SortableHeader,
Badge,
RoleBadge,
Button,
IconButton,
EmptyState,
Input,
Select,
Switch,
Pagination,
EnvChip,
Checkbox
} = NS;
function Icon({
name,
size = 16,
stroke = 2,
...rest
}) {
const ico = window.lucide && window.lucide.icons && window.lucide.icons[name];
if (!ico) return null;
const kids = (ico[2] || []).map((c, i) => React.createElement(c[0], {
key: i,
...c[1]
}));
return React.createElement('svg', {
width: size,
height: size,
viewBox: '0 0 24 24',
fill: 'none',
stroke: 'currentColor',
strokeWidth: stroke,
strokeLinecap: 'round',
strokeLinejoin: 'round',
...rest
}, kids);
}
const lbl = {
font: 'var(--font-medium) var(--text-2xs)/1 var(--font-mono)',
color: 'var(--text-muted)'
};
const mono = {
fontFamily: 'var(--font-mono)',
fontSize: 'var(--text-xs)',
color: 'var(--text-secondary)'
};
const PROJECTS = [['ad-ai-ad-management', '광고주센터 api', 'Platform Team', 2], ['ad-ai-ava', 'ava atm', 'Platform Team', 6], ['ad-ai-gfa-serving', 'GFA', 'Platform Team', 2], ['ad-ai-pmax-prediction', 'pmax', 'Platform Team', 1], ['mona-ad-routing', '홈피드 쇼핑, da 분류 라우팅 모델', 'Platform Team', 3], ['mona-demo', 'MONA - DEMO', 'Platform Team', 5]];
const AUDIT = [['김준석', 'rock.kim@navercorp.com', '로그인', '-', '2026-06-14 19:56:19', '10.25.91.60'], ['bestend', 'sftpgo-poc@navercorp.com', 'S3_TOKEN_ISSUE', 'mpd-mona-test', '2026-06-14 05:08:22', '10.25.101.65'], ['박인영', 'inyeong.park@navercorp.com', '프로젝트 수정', 'ad-ai-sa-ranker', '2026-06-13 18:12:26', '10.25.90.184']];
const RBAC = [{
name: 'mona-platform-admin',
scope: 'platform',
rules: [['*', '*', 'ALL'], ['""', '*', 'ALL']]
}, {
name: 'mona-project-developer',
scope: 'project',
rules: [['""', 'pods, services, configmaps', 'ALL'], ['apps', 'deployments, statefulsets', 'ALL'], ['batch', 'jobs, cronjobs', 'ALL']]
}];
const SETTINGS = [{
name: '프로젝트 삭제',
key: 'project_delete_enabled',
tag: 'MODIFIED',
desc: '프로젝트 삭제 기능을 활성화합니다.',
type: 'toggle',
on: true
}, {
name: '요청 만료 기간',
key: 'request_expiry_days',
tag: 'DEFAULT',
desc: '미승인 요청의 자동 만료 기간(일).',
type: 'num',
val: '30'
}, {
name: '토큰 유효 기간',
key: 'token_expiration_days',
tag: 'DEFAULT',
desc: 'Kubeconfig 토큰 유효 기간(일).',
type: 'num',
val: '365'
}];
window.PassAdmin = function Admin() {
const [tab, setTab] = React.useState('projects');
const [page, setPage] = React.useState(1);
const tabs = [{
id: 'pending',
label: '승인 대기',
count: 0
}, {
id: 'projects',
label: '전체 프로젝트',
count: 12
}, {
id: 'users',
label: '사용자 관리',
count: 38
}, {
id: 'clusters',
label: '클러스터',
count: 3
}, {
id: 'notices',
label: '공지사항',
count: 9
}, {
id: 'audit',
label: '감사 로그'
}, {
id: 'roles',
label: '클러스터 롤'
}, {
id: 'settings',
label: '시스템 설정'
}];
return /*#__PURE__*/React.createElement("div", {
className: "pg"
}, /*#__PURE__*/React.createElement("div", {
className: "pg__head"
}, /*#__PURE__*/React.createElement("span", {
className: "pg__title"
}, "\uAD00\uB9AC\uC790 \uCF58\uC194")), /*#__PURE__*/React.createElement("div", {
className: "pg__sub"
}, "\uD504\uB85C\uC81D\uD2B8 \uC2E0\uCCAD \uAD00\uB9AC \uBC0F \uD50C\uB7AB\uD3FC \uB9AC\uC18C\uC2A4 \uD604\uD669"), /*#__PURE__*/React.createElement(Tabs, {
value: tab,
onChange: setTab,
tabs: tabs
}), /*#__PURE__*/React.createElement("div", {
style: {
marginTop: 18
}
}, tab === 'pending' && /*#__PURE__*/React.createElement(Card, {
flat: true
}, /*#__PURE__*/React.createElement("div", {
style: {
padding: 18
}
}, /*#__PURE__*/React.createElement(EmptyState, {
icon: /*#__PURE__*/React.createElement(Icon, {
name: "Inbox",
size: 24
}),
title: "\uB300\uAE30 \uC911\uC778 \uC694\uCCAD\uC774 \uC5C6\uC2B5\uB2C8\uB2E4",
description: "\uC0C8 \uC2E0\uCCAD\uC774 \uB4E4\uC5B4\uC624\uBA74 \uC5EC\uAE30\uC5D0\uC11C \uC2B9\uC778\uD558\uAC70\uB098 \uBC18\uB824\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4."
}))), tab === 'projects' && /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
style: {
display: 'flex',
justifyContent: 'flex-end',
gap: 8,
marginBottom: 12
}
}, /*#__PURE__*/React.createElement(Button, {
size: "sm",
variant: "secondary",
leadingIcon: /*#__PURE__*/React.createElement(Icon, {
name: "Filter",
size: 14
})
}, "OutOfSync\uB9CC \uC120\uD0DD"), /*#__PURE__*/React.createElement(Button, {
size: "sm",
leadingIcon: /*#__PURE__*/React.createElement(Icon, {
name: "RefreshCw",
size: 14
})
}, "\uC120\uD0DD \uD56D\uBAA9 \uB3D9\uAE30\uD654")), /*#__PURE__*/React.createElement(Table, null, /*#__PURE__*/React.createElement("thead", null, /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("th", {
style: {
width: 32
}
}, /*#__PURE__*/React.createElement(Checkbox, null)), /*#__PURE__*/React.createElement("th", null, "\uD504\uB85C\uC81D\uD2B8 ID"), /*#__PURE__*/React.createElement("th", null, "\uC774\uB984"), /*#__PURE__*/React.createElement("th", null, "\uD300"), /*#__PURE__*/React.createElement("th", null, "\uD658\uACBD"), /*#__PURE__*/React.createElement("th", {
style: {
textAlign: 'right'
}
}, "\uBA64\uBC84"), /*#__PURE__*/React.createElement("th", null, "\uC0C1\uD0DC"), /*#__PURE__*/React.createElement("th", null))), /*#__PURE__*/React.createElement("tbody", null, PROJECTS.map(p => /*#__PURE__*/React.createElement("tr", {
key: p[0]
}, /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement(Checkbox, null)), /*#__PURE__*/React.createElement("td", {
style: mono
}, p[0]), /*#__PURE__*/React.createElement("td", {
style: {
fontWeight: 600
}
}, p[1]), /*#__PURE__*/React.createElement("td", {
style: {
color: 'var(--text-secondary)'
}
}, p[2]), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement(EnvChip, {
env: "dev",
dot: false
})), /*#__PURE__*/React.createElement("td", {
style: {
textAlign: 'right'
}
}, p[3]), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement(Badge, {
variant: "success",
dot: true,
size: "sm"
}, "Synced")), /*#__PURE__*/React.createElement("td", {
style: {
textAlign: 'right',
whiteSpace: 'nowrap'
}
}, /*#__PURE__*/React.createElement(IconButton, {
size: "sm",
"aria-label": "sync"
}, /*#__PURE__*/React.createElement(Icon, {
name: "RefreshCw",
size: 14
})), /*#__PURE__*/React.createElement(IconButton, {
size: "sm",
variant: "ghost",
"aria-label": "\uC0AD\uC81C"
}, /*#__PURE__*/React.createElement(Icon, {
name: "Trash2",
size: 14
}))))))), /*#__PURE__*/React.createElement("div", {
style: {
display: 'flex',
justifyContent: 'flex-end',
marginTop: 14
}
}, /*#__PURE__*/React.createElement(Pagination, {
page: page,
pageCount: 2,
total: 12,
pageSize: 10,
onChange: setPage
}))), tab === 'users' && /*#__PURE__*/React.createElement(Table, null, /*#__PURE__*/React.createElement("thead", null, /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("th", null, "\uC0AC\uC6A9\uC790"), /*#__PURE__*/React.createElement("th", null, "\uBD80\uC11C"), /*#__PURE__*/React.createElement("th", null, "\uD50C\uB7AB\uD3FC \uAD8C\uD55C"), /*#__PURE__*/React.createElement("th", null, "\uCC38\uC5EC \uD504\uB85C\uC81D\uD2B8"), /*#__PURE__*/React.createElement("th", null, "\uCD5C\uADFC \uC811\uC18D"))), /*#__PURE__*/React.createElement("tbody", null, /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement("div", {
style: {
fontWeight: 600
}
}, "\uAC15\uCC3D\uD55C"), /*#__PURE__*/React.createElement("div", {
style: mono
}, "changhan.kang@navercorp.com")), /*#__PURE__*/React.createElement("td", {
style: {
color: 'var(--text-secondary)'
}
}, "Agent Platform"), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement(RoleBadge, {
role: "admin",
isPlatform: true
})), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement("a", {
href: "#",
onClick: e => e.preventDefault(),
style: {
color: 'var(--color-primary)'
}
}, "2\uAC1C")), /*#__PURE__*/React.createElement("td", {
style: mono
}, "2026-06-04 15:39")), /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement("div", {
style: {
fontWeight: 600
}
}, "\uC815\uB2E4\uC6B4"), /*#__PURE__*/React.createElement("div", {
style: mono
}, "daun.jeong@navercorp.com")), /*#__PURE__*/React.createElement("td", {
style: {
color: 'var(--text-secondary)'
}
}, "Agent Action Engine"), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement(Badge, {
variant: "neutral",
size: "sm"
}, "User")), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement("a", {
href: "#",
onClick: e => e.preventDefault(),
style: {
color: 'var(--color-primary)'
}
}, "3\uAC1C")), /*#__PURE__*/React.createElement("td", {
style: mono
}, "2026-06-12 11:15")), /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement("div", {
style: {
fontWeight: 600
}
}, "\uAE40\uD5CC"), /*#__PURE__*/React.createElement("div", {
style: mono
}, "hkim.1@navercorp.com")), /*#__PURE__*/React.createElement("td", {
style: {
color: 'var(--text-secondary)'
}
}, "\uAD11\uACE0 \uB9AC\uD3EC\uD2B8 \uAC1C\uBC1C2"), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement(Badge, {
variant: "neutral",
size: "sm"
}, "User")), /*#__PURE__*/React.createElement("td", {
style: {
color: 'var(--text-muted)'
}
}, "0\uAC1C"), /*#__PURE__*/React.createElement("td", {
style: mono
}, "2026-06-03 12:06")))), tab === 'clusters' && /*#__PURE__*/React.createElement("div", {
style: {
display: 'grid',
gridTemplateColumns: 'repeat(3,1fr)',
gap: 14
}
}, [['rancher-dev', '랜처 클러스터(개발)', '평촌'], ['common-dev', '관리 클러스터(개발)', '평촌'], ['service-dev', '서비스 클러스터(개발)', '세종']].map(c => /*#__PURE__*/React.createElement(Card, {
key: c[0],
interactive: true,
icon: /*#__PURE__*/React.createElement("span", {
style: {
color: 'var(--color-primary)'
}
}, /*#__PURE__*/React.createElement(Icon, {
name: "Server",
size: 17
})),
title: c[0],
headerActions: c[0] === 'service-dev' ? /*#__PURE__*/React.createElement(EnvChip, {
env: "dev",
dot: false
}) : null
}, /*#__PURE__*/React.createElement("div", {
style: {
font: 'var(--font-regular) var(--text-sm)/1.5 var(--font-sans)',
color: 'var(--text-secondary)'
}
}, c[1]), /*#__PURE__*/React.createElement("div", {
style: {
display: 'flex',
alignItems: 'center',
gap: 5,
marginTop: 8,
font: 'var(--font-regular) var(--text-xs)/1 var(--font-sans)',
color: 'var(--text-muted)'
}
}, /*#__PURE__*/React.createElement(Icon, {
name: "MapPin",
size: 12
}), c[2])))), tab === 'notices' && /*#__PURE__*/React.createElement(Table, null, /*#__PURE__*/React.createElement("thead", null, /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("th", null, "\uC81C\uBAA9"), /*#__PURE__*/React.createElement("th", null, "\uC0C1\uD0DC"), /*#__PURE__*/React.createElement("th", null, "\uC218\uC2E0 \uB300\uC0C1"), /*#__PURE__*/React.createElement("th", null, "\uC791\uC131\uC790"), /*#__PURE__*/React.createElement("th", null, "\uC608\uC57D/\uBC1C\uC1A1 \uC77C\uC2DC"))), /*#__PURE__*/React.createElement("tbody", null, /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", {
style: {
fontWeight: 600
}
}, "2\uC6D4 \uC815\uAE30 \uC810\uAC80 \uC0AC\uC804 \uC548\uB0B4"), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement(Badge, {
variant: "success",
size: "sm"
}, "\uBC1C\uC1A1\uB428")), /*#__PURE__*/React.createElement("td", {
style: {
color: 'var(--text-secondary)'
}
}, "\uC804\uCCB4 \uC0AC\uC6A9\uC790"), /*#__PURE__*/React.createElement("td", {
style: mono
}, "jeehoon.lim"), /*#__PURE__*/React.createElement("td", {
style: mono
}, "2026-01-29 13:22")), /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", {
style: {
fontWeight: 600
}
}, "Kubeconfig \uBC1C\uAE09 \uC815\uCC45 \uBCC0\uACBD \uC608\uC815"), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement(Badge, {
variant: "neutral",
size: "sm"
}, "\uCD08\uC548")), /*#__PURE__*/React.createElement("td", {
style: {
color: 'var(--text-secondary)'
}
}, "\uC804\uCCB4 \uC0AC\uC6A9\uC790"), /*#__PURE__*/React.createElement("td", {
style: mono
}, "jeehoon.lim"), /*#__PURE__*/React.createElement("td", {
style: mono
}, "2026-01-22 10:22")), /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", {
style: {
fontWeight: 600
}
}, "[\uAE34\uAE09] \uC2DC\uC2A4\uD15C \uC810\uAC80 \uC548\uB0B4"), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement(Badge, {
variant: "success",
size: "sm"
}, "\uBC1C\uC1A1\uB428")), /*#__PURE__*/React.createElement("td", {
style: {
color: 'var(--text-secondary)'
}
}, "\uC804\uCCB4 \uC0AC\uC6A9\uC790"), /*#__PURE__*/React.createElement("td", {
style: mono
}, "jeehoon.lim"), /*#__PURE__*/React.createElement("td", {
style: mono
}, "2026-01-20 13:22")))), tab === 'audit' && /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
style: {
display: 'flex',
gap: 10,
marginBottom: 12,
flexWrap: 'wrap'
}
}, /*#__PURE__*/React.createElement("div", {
style: {
flex: 1,
minWidth: 180,
maxWidth: 280
}
}, /*#__PURE__*/React.createElement(Input, {
placeholder: "\uC0AC\uC6A9\uC790 \uAC80\uC0C9\u2026",
leadingIcon: /*#__PURE__*/React.createElement(Icon, {
name: "Search",
size: 15
})
})), /*#__PURE__*/React.createElement(Select, {
options: [{
value: 'all',
label: '모든 작업'
}, {
value: 'login',
label: '로그인'
}]
}), /*#__PURE__*/React.createElement("div", {
style: {
marginLeft: 'auto'
}
}, /*#__PURE__*/React.createElement(Button, {
size: "sm",
variant: "secondary",
leadingIcon: /*#__PURE__*/React.createElement(Icon, {
name: "Download",
size: 14
})
}, "CSV \uB0B4\uBCF4\uB0B4\uAE30"))), /*#__PURE__*/React.createElement(Table, null, /*#__PURE__*/React.createElement("thead", null, /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("th", null, "\uC0AC\uC6A9\uC790"), /*#__PURE__*/React.createElement("th", null, "\uC791\uC5C5"), /*#__PURE__*/React.createElement("th", null, "\uB300\uC0C1"), /*#__PURE__*/React.createElement("th", null, "\uACB0\uACFC"), /*#__PURE__*/React.createElement("th", null, "\uC2DC\uAC04"), /*#__PURE__*/React.createElement("th", null, "IP \uC8FC\uC18C"))), /*#__PURE__*/React.createElement("tbody", null, AUDIT.map((a, i) => /*#__PURE__*/React.createElement("tr", {
key: i
}, /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement("div", {
style: {
fontWeight: 600
}
}, a[0]), /*#__PURE__*/React.createElement("div", {
style: mono
}, a[1])), /*#__PURE__*/React.createElement("td", null, a[2]), /*#__PURE__*/React.createElement("td", {
style: mono
}, a[3]), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement("span", {
style: {
color: 'var(--color-success)',
font: 'var(--font-medium) var(--text-xs)/1 var(--font-sans)'
}
}, "Success")), /*#__PURE__*/React.createElement("td", {
style: mono
}, a[4]), /*#__PURE__*/React.createElement("td", {
style: mono
}, a[5])))))), tab === 'roles' && /*#__PURE__*/React.createElement("div", {
style: {
display: 'grid',
gridTemplateColumns: 'repeat(2,1fr)',
gap: 14
}
}, RBAC.map(r => /*#__PURE__*/React.createElement(Card, {
key: r.name,
icon: /*#__PURE__*/React.createElement("span", {
style: {
color: 'var(--color-primary)'
}
}, /*#__PURE__*/React.createElement(Icon, {
name: "ShieldCheck",
size: 17
})),
title: /*#__PURE__*/React.createElement("span", {
style: mono
}, r.name),
headerActions: /*#__PURE__*/React.createElement(Badge, {
variant: r.scope === 'platform' ? 'purple' : 'primary',
size: "sm"
}, r.scope)
}, /*#__PURE__*/React.createElement(Table, {
hover: false
}, /*#__PURE__*/React.createElement("thead", null, /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("th", null, "API GROUPS"), /*#__PURE__*/React.createElement("th", null, "RESOURCES"), /*#__PURE__*/React.createElement("th", null, "VERBS"))), /*#__PURE__*/React.createElement("tbody", null, r.rules.map((rule, i) => /*#__PURE__*/React.createElement("tr", {
key: i
}, /*#__PURE__*/React.createElement("td", {
style: mono
}, rule[0]), /*#__PURE__*/React.createElement("td", {
style: mono
}, rule[1]), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement("span", {
style: {
color: rule[2] === 'ALL' ? 'var(--color-danger)' : 'var(--text-secondary)',
font: 'var(--font-semibold) var(--text-2xs)/1 var(--font-mono)'
}
}, rule[2]))))))))), tab === 'settings' && /*#__PURE__*/React.createElement("div", {
style: {
display: 'grid',
gridTemplateColumns: 'repeat(3,1fr)',
gap: 14
}
}, SETTINGS.map(s => /*#__PURE__*/React.createElement(Card, {
key: s.key
}, /*#__PURE__*/React.createElement("div", {
style: {
display: 'flex',
alignItems: 'center',
gap: 8
}
}, /*#__PURE__*/React.createElement("span", {
style: {
font: 'var(--font-semibold) var(--text-sm)/1 var(--font-sans)',
color: 'var(--text-body)'
}
}, s.name), /*#__PURE__*/React.createElement(Badge, {
variant: s.tag === 'MODIFIED' ? 'primary' : 'neutral',
size: "sm"
}, s.tag)), /*#__PURE__*/React.createElement("div", {
style: {
font: 'var(--font-regular) var(--text-xs)/1.5 var(--font-sans)',
color: 'var(--text-muted)',
margin: '8px 0'
}
}, s.desc), /*#__PURE__*/React.createElement("div", {
style: lbl
}, s.key), /*#__PURE__*/React.createElement("div", {
style: {
marginTop: 12
}
}, s.type === 'toggle' ? /*#__PURE__*/React.createElement(Switch, {
defaultChecked: s.on
}) : /*#__PURE__*/React.createElement(Input, {
defaultValue: s.val
})))))));
};
})();
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/ui_kits/pass/screens-admin.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/ui_kits/pass/screens-detail.jsx
try { (() => {
/* MONA Pass — ProjectDetail screen (overview / status / members / activity).
Demonstrates Tabs, StatCard, ProgressBar, StatusGrid, Timeline, RoleBadge,
ConfirmDialog (destructive delete with policy + type-to-confirm). */
(() => {
const NS = window.MONAFamilyDesignSystem_3cb9a3;
const {
Tabs,
Card,
StatCard,
ProgressBar,
StatusGrid,
Timeline,
RoleBadge,
Badge,
Button,
Breadcrumb,
ConfirmDialog
} = NS;
function Icon({
name,
size = 16,
stroke = 2,
...rest
}) {
const ico = window.lucide && window.lucide.icons && window.lucide.icons[name];
if (!ico) return null;
const kids = (ico[2] || []).map((c, i) => React.createElement(c[0], {
key: i,
...c[1]
}));
return React.createElement('svg', {
width: size,
height: size,
viewBox: '0 0 24 24',
fill: 'none',
stroke: 'currentColor',
strokeWidth: stroke,
strokeLinecap: 'round',
strokeLinejoin: 'round',
...rest
}, kids);
}
const RES_LINKS = [{
name: 'ArgoCD',
url: 'https://argocd.sys.dev-mona.navercorp.com'
}, {
name: 'Grafana',
url: 'https://grafana.sys.dev-mona.navercorp.com/?orgId=769'
}, {
name: 'MLflow',
url: 'https://mona-demo-mlflow.sys.dev-mona.navercorp.com'
}, {
name: 'Airflow',
url: 'https://airflow.sys.dev-mona.navercorp.com/?project=mona-demo'
}];
const SYSTEMS = [{
name: 'ArgoCD',
status: 'ok'
}, {
name: 'Grafana',
status: 'ok'
}, {
name: 'Keycloak',
status: 'ok'
}, {
name: 'Mimir',
status: 'ok'
}, {
name: 'Namespace',
status: 'ok'
}, {
name: 'NELO',
status: 'ok'
}, {
name: 'OTel',
status: 'ok'
}, {
name: 'S3',
status: 'ok'
}, {
name: 'MLflow',
status: 'ok'
}, {
name: 'AiRSFlow',
status: 'ok'
}];
const MEMBERS = [{
name: '강창한',
email: 'changhan.kang@navercorp.com',
dept: 'Agent Platform'
}, {
name: '하재권',
email: 'jaekwon.ha@navercorp.com',
dept: 'Agent Platform'
}, {
name: '임지훈[ newry ]',
email: 'jeehoon.lim@navercorp.com',
dept: 'Agent Platform'
}, {
name: '김준석',
email: 'rock.kim@navercorp.com',
dept: 'Agent Platform'
}, {
name: '권서연',
email: 'seoyeon.kwon@navercorp.com',
dept: 'Agent Platform'
}];
const ACTIVITY = [{
title: '프로젝트 설정이 수정되었습니다.',
status: 'primary',
meta: 'jaekwon.ha@navercorp.com · 2026-06-12 10:13:32'
}, {
title: 'MODIFY 요청이 반려되었습니다. 사유: aa',
status: 'danger',
meta: 'jaekwon.ha@navercorp.com · 2026-06-12 07:26:08'
}, {
title: "'jaekwon.ha@navercorp.com'님이 admin 역할로 추가되었습니다.",
status: 'success',
meta: '2026-06-05 18:09:18'
}, {
title: "프로젝트 'mona-demo'가 생성되었습니다.",
status: 'success',
meta: 'jaekwon.ha@navercorp.com · 2026-05-27 19:53:18'
}];
function Quota({
icon,
label,
used,
hard,
variant
}) {
return /*#__PURE__*/React.createElement("div", {
style: {
display: 'grid',
gridTemplateColumns: '120px 1fr',
gap: 14,
alignItems: 'center',
padding: '6px 0'
}
}, /*#__PURE__*/React.createElement("span", {
style: {
display: 'flex',
alignItems: 'center',
gap: 7,
font: 'var(--font-medium) var(--text-sm)/1 var(--font-sans)',
color: 'var(--text-secondary)'
}
}, /*#__PURE__*/React.createElement("span", {
style: {
color: 'var(--color-primary)',
display: 'flex'
}
}, /*#__PURE__*/React.createElement(Icon, {
name: icon,
size: 15
})), label), /*#__PURE__*/React.createElement(ProgressBar, {
value: used,
max: hard,
threshold: true,
valueText: `${used} / ${hard}`,
showValue: true,
size: "sm"
}));
}
window.PassProjectDetail = function ProjectDetail({
onBack
}) {
const [tab, setTab] = React.useState('overview');
const [del, setDel] = React.useState(false);
const [policy, setPolicy] = React.useState('delete');
return /*#__PURE__*/React.createElement("div", {
className: "pg"
}, /*#__PURE__*/React.createElement("div", {
style: {
marginBottom: 12
}
}, /*#__PURE__*/React.createElement(Breadcrumb, {
items: [{
label: '프로젝트',
icon: /*#__PURE__*/React.createElement(Icon, {
name: "FolderOpen",
size: 14
}),
onClick: onBack
}, {
label: 'MONA - DEMO'
}]
})), /*#__PURE__*/React.createElement("div", {
style: {
display: 'flex',
alignItems: 'flex-start',
gap: 14,
flexWrap: 'wrap'
}
}, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
style: {
display: 'flex',
alignItems: 'center',
gap: 10
}
}, /*#__PURE__*/React.createElement("span", {
className: "pg__title"
}, "MONA - DEMO"), /*#__PURE__*/React.createElement(RoleBadge, {
role: "admin"
}), /*#__PURE__*/React.createElement(RoleBadge, {
role: "admin",
isPlatform: true
})), /*#__PURE__*/React.createElement("div", {
style: {
font: 'var(--font-regular) var(--text-sm)/1.7 var(--font-mono)',
color: 'var(--text-muted)',
marginTop: 4
}
}, "ID: mona-demo")), /*#__PURE__*/React.createElement("div", {
style: {
marginLeft: 'auto',
display: 'flex',
gap: 8,
flexWrap: 'wrap'
}
}, /*#__PURE__*/React.createElement(Button, {
size: "sm",
variant: "secondary",
leadingIcon: /*#__PURE__*/React.createElement(Icon, {
name: "Settings",
size: 14
})
}, "\uBCC0\uACBD \uC694\uCCAD"), /*#__PURE__*/React.createElement(Button, {
size: "sm",
variant: "secondary",
leadingIcon: /*#__PURE__*/React.createElement(Icon, {
name: "Copy",
size: 14
})
}, "\uBCF5\uC81C \uC2E0\uCCAD"), /*#__PURE__*/React.createElement(Button, {
size: "sm",
variant: "danger-outline",
leadingIcon: /*#__PURE__*/React.createElement(Icon, {
name: "Trash2",
size: 14
}),
onClick: () => setDel(true)
}, "\uC0AD\uC81C \uC694\uCCAD"), /*#__PURE__*/React.createElement(Button, {
size: "sm",
variant: "ghost",
leadingIcon: /*#__PURE__*/React.createElement(Icon, {
name: "LogOut",
size: 14
})
}, "\uD0C8\uD1F4"))), /*#__PURE__*/React.createElement("div", {
style: {
marginTop: 18
}
}, /*#__PURE__*/React.createElement(Tabs, {
value: tab,
onChange: setTab,
tabs: [{
id: 'overview',
label: '개요'
}, {
id: 'status',
label: '상태'
}, {
id: 'members',
label: '멤버',
count: MEMBERS.length
}, {
id: 'activity',
label: '활동 로그'
}]
})), /*#__PURE__*/React.createElement("div", {
style: {
marginTop: 20
}
}, tab === 'overview' && /*#__PURE__*/React.createElement("div", {
className: "col",
style: {
display: 'flex',
flexDirection: 'column',
gap: 18
}
}, /*#__PURE__*/React.createElement(Card, {
title: "\uB9AC\uC18C\uC2A4 \uB9C1\uD06C",
icon: /*#__PURE__*/React.createElement("span", {
style: {
color: 'var(--color-primary)'
}
}, /*#__PURE__*/React.createElement(Icon, {
name: "Link",
size: 17
}))
}, RES_LINKS.map(r => /*#__PURE__*/React.createElement("div", {
key: r.name,
style: {
display: 'flex',
justifyContent: 'space-between',
alignItems: 'center',
padding: '7px 0',
borderBottom: '1px solid var(--color-border)'
}
}, /*#__PURE__*/React.createElement("span", {
style: {
font: 'var(--font-medium) var(--text-sm)/1 var(--font-sans)',
color: 'var(--text-body)'
}
}, r.name), /*#__PURE__*/React.createElement("a", {
href: r.url,
onClick: e => e.preventDefault(),
style: {
font: 'var(--font-regular) var(--text-xs)/1 var(--font-mono)',
color: 'var(--color-primary)',
display: 'flex',
alignItems: 'center',
gap: 5
}
}, r.url, /*#__PURE__*/React.createElement(Icon, {
name: "ExternalLink",
size: 12
}))))), /*#__PURE__*/React.createElement("div", {
style: {
display: 'grid',
gridTemplateColumns: 'repeat(4,1fr)',
gap: 14
}
}, /*#__PURE__*/React.createElement(StatCard, {
size: "md",
label: "\uC18C\uC720 \uD300",
value: "Platform Team",
icon: /*#__PURE__*/React.createElement(Icon, {
name: "Users",
size: 16
})
}), /*#__PURE__*/React.createElement(StatCard, {
size: "md",
label: "\uBA64\uBC84",
value: "5\uBA85",
icon: /*#__PURE__*/React.createElement(Icon, {
name: "User",
size: 16
})
}), /*#__PURE__*/React.createElement(StatCard, {
size: "md",
label: "\uD658\uACBD",
value: "1\uAC1C",
icon: /*#__PURE__*/React.createElement(Icon, {
name: "Server",
size: 16
})
}), /*#__PURE__*/React.createElement(StatCard, {
size: "md",
label: "\uC0DD\uC131\uC77C",
value: "2026-05-27",
icon: /*#__PURE__*/React.createElement(Icon, {
name: "Calendar",
size: 16
})
}))), tab === 'status' && /*#__PURE__*/React.createElement("div", {
style: {
display: 'flex',
flexDirection: 'column',
gap: 18
}
}, /*#__PURE__*/React.createElement(Card, {
title: "\uC2DC\uC2A4\uD15C \uC5F0\uB3D9",
headerActions: /*#__PURE__*/React.createElement(Badge, {
variant: "success",
dot: true,
size: "sm"
}, "Synced")
}, /*#__PURE__*/React.createElement(StatusGrid, {
items: SYSTEMS
})), /*#__PURE__*/React.createElement(Card, {
title: "DEV \xB7 service-dev",
icon: /*#__PURE__*/React.createElement("span", {
style: {
color: 'var(--color-primary)'
}
}, /*#__PURE__*/React.createElement(Icon, {
name: "Boxes",
size: 17
})),
headerActions: /*#__PURE__*/React.createElement(Badge, {
variant: "success",
dot: true,
size: "sm"
}, "Synced")
}, /*#__PURE__*/React.createElement(Quota, {
icon: "Cpu",
label: "CPU",
used: 12,
hard: 96
}), /*#__PURE__*/React.createElement(Quota, {
icon: "MemoryStick",
label: "Memory",
used: 74,
hard: 96
}), /*#__PURE__*/React.createElement(Quota, {
icon: "Box",
label: "Pods",
used: 11,
hard: 25
}))), tab === 'members' && /*#__PURE__*/React.createElement(Card, {
flat: true,
tight: true
}, MEMBERS.map(m => /*#__PURE__*/React.createElement("div", {
key: m.email,
style: {
display: 'flex',
alignItems: 'center',
gap: 12,
padding: '11px 6px',
borderBottom: '1px solid var(--color-border)'
}
}, /*#__PURE__*/React.createElement("span", {
style: {
width: 32,
height: 32,
borderRadius: '50%',
display: 'grid',
placeItems: 'center',
background: 'var(--surface-sunken)',
color: 'var(--text-secondary)',
font: 'var(--font-semibold) var(--text-xs)/1 var(--font-sans)'
}
}, m.name.slice(0, 1)), /*#__PURE__*/React.createElement("div", {
style: {
flex: 1
}
}, /*#__PURE__*/React.createElement("div", {
style: {
font: 'var(--font-medium) var(--text-sm)/1.3 var(--font-sans)',
color: 'var(--text-body)'
}
}, m.name), /*#__PURE__*/React.createElement("div", {
style: {
font: 'var(--font-regular) var(--text-xs)/1.3 var(--font-sans)',
color: 'var(--text-muted)'
}
}, m.email, " \xB7 ", m.dept)), /*#__PURE__*/React.createElement(RoleBadge, {
role: "admin"
}), /*#__PURE__*/React.createElement(Button, {
size: "sm",
variant: "ghost"
}, "\uAD00\uB9AC")))), tab === 'activity' && /*#__PURE__*/React.createElement(Card, {
title: "\uD65C\uB3D9 \uB85C\uADF8",
icon: /*#__PURE__*/React.createElement("span", {
style: {
color: 'var(--color-primary)'
}
}, /*#__PURE__*/React.createElement(Icon, {
name: "Activity",
size: 17
}))
}, /*#__PURE__*/React.createElement(Timeline, {
items: ACTIVITY
}))), /*#__PURE__*/React.createElement(ConfirmDialog, {
open: del,
tone: "destructive",
title: "\uD504\uB85C\uC81D\uD2B8 \uC0AD\uC81C \uC694\uCCAD",
message: "\uC0AD\uC81C \uC815\uCC45\uC744 \uC120\uD0DD\uD558\uC138\uC694.",
policies: [{
value: 'delete',
label: 'Delete — 모든 Kubernetes 리소스 삭제',
description: 'Namespace, Deployment 등 모든 리소스가 영구적으로 삭제됩니다.',
danger: true
}, {
value: 'retain',
label: 'Retain — MONA Pass에서만 제거',
description: 'Kubernetes 리소스는 유지되고, 관리 목록에서만 제거됩니다.'
}],
policyValue: policy,
onPolicyChange: setPolicy,
confirmPhrase: "mona-demo",
confirmLabel: "\uC0AD\uC81C \uC694\uCCAD",
onConfirm: () => setDel(false),
onCancel: () => setDel(false)
}));
};
})();
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/ui_kits/pass/screens-detail.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/ui_kits/pass/screens-request-project.jsx
try { (() => {
/* MONA Pass — RequestProject form (single-scroll, numbered sections).
Demonstrates the family form pattern: Input/Select/Textarea/RadioGroup/
Switch/Checkbox/EnvChip/Button over DS tokens. No new primitives required. */
(() => {
const NS = window.MONAFamilyDesignSystem_3cb9a3;
const {
Card,
Input,
Select,
Textarea,
RadioGroup,
Switch,
Checkbox,
Button,
Badge,
EnvChip,
Tabs
} = NS;
function Icon({
name,
size = 16,
stroke = 2,
...rest
}) {
const ico = window.lucide && window.lucide.icons && window.lucide.icons[name];
if (!ico) return null;
const kids = (ico[2] || []).map((c, i) => React.createElement(c[0], {
key: i,
...c[1]
}));
return React.createElement('svg', {
width: size,
height: size,
viewBox: '0 0 24 24',
fill: 'none',
stroke: 'currentColor',
strokeWidth: stroke,
strokeLinecap: 'round',
strokeLinejoin: 'round',
...rest
}, kids);
}
function Section({
n,
title,
badge,
toggle,
children
}) {
return /*#__PURE__*/React.createElement("div", {
style: {
background: 'var(--surface-card)',
border: '1px solid var(--color-border)',
borderRadius: 'var(--radius-lg)',
boxShadow: 'var(--shadow-sm)',
padding: '22px 24px',
marginBottom: 18
}
}, /*#__PURE__*/React.createElement("div", {
style: {
display: 'flex',
alignItems: 'center',
gap: 10,
marginBottom: 18
}
}, /*#__PURE__*/React.createElement("span", {
style: {
width: 24,
height: 24,
borderRadius: '50%',
background: 'var(--text-body)',
color: 'var(--color-bg)',
display: 'grid',
placeItems: 'center',
font: 'var(--font-bold) var(--text-xs)/1 var(--font-sans)'
}
}, n), /*#__PURE__*/React.createElement("span", {
style: {
font: 'var(--font-bold) var(--text-md)/1 var(--font-sans)',
color: 'var(--text-body)'
}
}, title), badge, toggle && /*#__PURE__*/React.createElement("div", {
style: {
marginLeft: 'auto'
}
}, toggle)), children);
}
const labelStyle = {
display: 'block',
font: 'var(--font-medium) var(--text-xs)/1.4 var(--font-sans)',
color: 'var(--text-secondary)',
marginBottom: 6
};
const QuotaRow = ({
label,
value
}) => /*#__PURE__*/React.createElement("div", {
style: {
display: 'flex',
alignItems: 'center',
justifyContent: 'space-between',
gap: 12,
padding: '9px 0',
borderBottom: '1px solid var(--color-border)'
}
}, /*#__PURE__*/React.createElement("span", {
style: {
font: 'var(--font-regular) var(--text-sm)/1 var(--font-sans)',
color: 'var(--text-secondary)'
}
}, label), /*#__PURE__*/React.createElement("div", {
style: {
width: 110
}
}, /*#__PURE__*/React.createElement(Input, {
defaultValue: value,
style: {
textAlign: 'right'
}
})));
window.PassRequestProject = function RequestProject({
onCancel
}) {
const [size, setSize] = React.useState('small');
const [env, setEnv] = React.useState(true);
const [argo, setArgo] = React.useState(true);
const [airs, setAirs] = React.useState(true);
const [mlflow, setMlflow] = React.useState(true);
return /*#__PURE__*/React.createElement("div", {
className: "pg",
style: {
maxWidth: 980
}
}, /*#__PURE__*/React.createElement("div", {
style: {
marginBottom: 6,
font: 'var(--font-regular) var(--text-xs)/1 var(--font-sans)',
color: 'var(--text-muted)'
}
}, /*#__PURE__*/React.createElement("a", {
href: "#",
onClick: e => {
e.preventDefault();
onCancel && onCancel();
},
style: {
color: 'var(--text-muted)'
}
}, "\uC2E0\uCCAD"), " \u203A \uD504\uB85C\uC81D\uD2B8 \uC2E0\uCCAD"), /*#__PURE__*/React.createElement("div", {
className: "pg__head"
}, /*#__PURE__*/React.createElement("span", {
className: "pg__title"
}, "\uD504\uB85C\uC81D\uD2B8 \uC2E0\uCCAD")), /*#__PURE__*/React.createElement("div", {
className: "pg__sub"
}, "\uC0C8 \uD504\uB85C\uC81D\uD2B8 \uD658\uACBD\uC744 \uAD6C\uC131\uD558\uACE0 \uB9AC\uC18C\uC2A4\uB97C \uD560\uB2F9\uD569\uB2C8\uB2E4."), /*#__PURE__*/React.createElement(Section, {
n: "1",
title: "\uAE30\uBCF8 \uC815\uBCF4"
}, /*#__PURE__*/React.createElement("div", {
style: {
display: 'grid',
gridTemplateColumns: '1fr 1fr',
gap: 18
}
}, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("label", {
style: labelStyle
}, "Project ID *"), /*#__PURE__*/React.createElement("div", {
style: {
display: 'flex',
alignItems: 'center',
gap: 8
}
}, /*#__PURE__*/React.createElement("div", {
style: {
width: 110
}
}, /*#__PURE__*/React.createElement(Select, {
options: [{
value: 'mona',
label: 'mona'
}, {
value: 'ad-ai',
label: 'ad-ai'
}]
})), /*#__PURE__*/React.createElement("span", {
style: {
color: 'var(--text-muted)'
}
}, "\u2014"), /*#__PURE__*/React.createElement("div", {
style: {
flex: 1
}
}, /*#__PURE__*/React.createElement(Input, {
placeholder: "my-ml-project"
}))), /*#__PURE__*/React.createElement("div", {
style: {
font: 'var(--font-regular) var(--text-2xs)/1.4 var(--font-mono)',
color: 'var(--text-muted)',
marginTop: 6
}
}, "\uCD5C\uC885 ID: mona-(\uC785\uB825)")), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("label", {
style: labelStyle
}, "Display Name *"), /*#__PURE__*/React.createElement(Input, {
placeholder: "ML \uCD94\uCC9C \uBAA8\uB378 \uD504\uB85C\uC81D\uD2B8"
}))), /*#__PURE__*/React.createElement("div", {
style: {
marginTop: 16
}
}, /*#__PURE__*/React.createElement(Textarea, {
label: "\uC124\uBA85",
placeholder: "\uD504\uB85C\uC81D\uD2B8 \uBAA9\uC801\uC774\uB098 \uC6A9\uB3C4\uB97C \uAC04\uB7B5\uD788 \uC124\uBA85\uD558\uC138\uC694"
})), /*#__PURE__*/React.createElement("div", {
style: {
display: 'grid',
gridTemplateColumns: '1fr 1fr',
gap: 18,
marginTop: 16
}
}, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("label", {
style: labelStyle
}, "Owner *"), /*#__PURE__*/React.createElement(Input, {
defaultValue: "Platform Team"
})), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("label", {
style: labelStyle
}, "Deletion Policy"), /*#__PURE__*/React.createElement(Select, {
options: [{
value: 'delete',
label: 'Delete (리소스 함께 삭제)'
}, {
value: 'retain',
label: 'Retain (리소스 유지)'
}]
})))), /*#__PURE__*/React.createElement(Section, {
n: "2",
title: "\uD658\uACBD \uBC0F \uB9AC\uC18C\uC2A4 \uC124\uC815",
badge: /*#__PURE__*/React.createElement(EnvChip, {
env: "dev",
dot: false
})
}, /*#__PURE__*/React.createElement("div", {
style: {
display: 'flex',
alignItems: 'center',
gap: 12,
background: 'var(--color-primary-subtle)',
border: '1px solid var(--color-border)',
borderRadius: 'var(--radius-md)',
padding: '14px 16px',
marginBottom: 18
}
}, /*#__PURE__*/React.createElement(Checkbox, {
checked: env,
onChange: e => setEnv(e.target.checked)
}), /*#__PURE__*/React.createElement("div", {
style: {
flex: 1
}
}, /*#__PURE__*/React.createElement("div", {
style: {
font: 'var(--font-semibold) var(--text-sm)/1.3 var(--font-sans)',
color: 'var(--text-body)'
}
}, "DEV \uD658\uACBD \uD65C\uC131\uD654"), /*#__PURE__*/React.createElement("div", {
style: {
font: 'var(--font-regular) var(--text-xs)/1.4 var(--font-sans)',
color: 'var(--text-secondary)'
}
}, "k8s \uD074\uB7EC\uC2A4\uD130 DEV \uD658\uACBD\uC758 Namespace\xB7ResourceQuota\uB97C \uC0DD\uC131\uD569\uB2C8\uB2E4.")), /*#__PURE__*/React.createElement(Switch, {
checked: env,
onChange: e => setEnv(e.target.checked)
})), /*#__PURE__*/React.createElement("label", {
style: labelStyle
}, "Resource Size"), /*#__PURE__*/React.createElement(Tabs, {
variant: "pill",
value: size,
onChange: setSize,
tabs: [{
id: 'small',
label: 'Small'
}, {
id: 'medium',
label: 'Medium'
}, {
id: 'large',
label: 'Large'
}, {
id: 'custom',
label: 'Custom'
}]
}), /*#__PURE__*/React.createElement("div", {
style: {
display: 'grid',
gridTemplateColumns: '1fr 1fr',
gap: 18,
marginTop: 16
}
}, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
style: {
display: 'flex',
alignItems: 'center',
gap: 8,
marginBottom: 6
}
}, /*#__PURE__*/React.createElement("span", {
style: {
font: 'var(--font-semibold) var(--text-sm)/1 var(--font-sans)',
color: 'var(--text-body)'
}
}, "ResourceQuota"), /*#__PURE__*/React.createElement(Badge, {
variant: "neutral",
size: "sm"
}, "Namespace Limit")), /*#__PURE__*/React.createElement(QuotaRow, {
label: "Requests CPU",
value: "96"
}), /*#__PURE__*/React.createElement(QuotaRow, {
label: "Requests Memory",
value: "96Gi"
}), /*#__PURE__*/React.createElement(QuotaRow, {
label: "Limits CPU",
value: "96"
}), /*#__PURE__*/React.createElement(QuotaRow, {
label: "Limits Memory",
value: "96Gi"
}), /*#__PURE__*/React.createElement(QuotaRow, {
label: "Ephemeral Storage",
value: "192Gi"
}), /*#__PURE__*/React.createElement(QuotaRow, {
label: "Max Pods",
value: "25"
})), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
style: {
display: 'flex',
alignItems: 'center',
gap: 8,
marginBottom: 6
}
}, /*#__PURE__*/React.createElement("span", {
style: {
font: 'var(--font-semibold) var(--text-sm)/1 var(--font-sans)',
color: 'var(--text-body)'
}
}, "LimitRange"), /*#__PURE__*/React.createElement(Badge, {
variant: "neutral",
size: "sm"
}, "Per Pod/Container")), /*#__PURE__*/React.createElement(QuotaRow, {
label: "Container CPU Default",
value: "4"
}), /*#__PURE__*/React.createElement(QuotaRow, {
label: "Container CPU Max",
value: "8"
}), /*#__PURE__*/React.createElement(QuotaRow, {
label: "Container Mem Default",
value: "4Gi"
}), /*#__PURE__*/React.createElement(QuotaRow, {
label: "Container Mem Max",
value: "16Gi"
}), /*#__PURE__*/React.createElement(QuotaRow, {
label: "Pod CPU Max",
value: "16"
}), /*#__PURE__*/React.createElement(QuotaRow, {
label: "Pod Mem Max",
value: "16Gi"
})))), /*#__PURE__*/React.createElement(Section, {
n: "3",
title: "ArgoCD \uC124\uC815",
toggle: /*#__PURE__*/React.createElement(Switch, {
checked: argo,
onChange: e => setArgo(e.target.checked)
})
}, argo && /*#__PURE__*/React.createElement(Textarea, {
label: "Source Repositories",
mono: true,
defaultValue: 'https://oss.navercorp.com/ad-ai/*\nhttps://oss.navercorp.com/mona/*',
hint: "ArgoCD Application\uC774 \uCC38\uC870\uD560 Git \uB808\uD3EC\uC9C0\uD1A0\uB9AC URL\uC744 \uC785\uB825\uD558\uC138\uC694 (\uC904\uBC14\uAFC8\uC73C\uB85C \uAD6C\uBD84)."
})), /*#__PURE__*/React.createElement(Section, {
n: "4",
title: "AiRSFlow \uC5F0\uB3D9",
toggle: /*#__PURE__*/React.createElement(Switch, {
checked: airs,
onChange: e => setAirs(e.target.checked)
})
}, airs && /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("label", {
style: labelStyle
}, "AIDA \uC778\uC99D"), /*#__PURE__*/React.createElement(Button, {
size: "sm",
variant: "secondary",
leadingIcon: /*#__PURE__*/React.createElement(Icon, {
name: "ExternalLink",
size: 14
})
}, "AIDA \uB85C\uADF8\uC778"), /*#__PURE__*/React.createElement("div", {
style: {
font: 'var(--font-regular) var(--text-xs)/1.5 var(--font-sans)',
color: 'var(--text-muted)',
margin: '8px 0 16px'
}
}, "\uBCF8\uC778 AIDA \uACC4\uC815\uC73C\uB85C \uB85C\uADF8\uC778\uD574 \uC778\uC99D \uC815\uBCF4\uB97C MONA Pass\uC5D0 \uC5F0\uB3D9\uD569\uB2C8\uB2E4."), /*#__PURE__*/React.createElement("div", {
style: {
display: 'flex',
alignItems: 'center',
gap: 8,
background: 'var(--color-warning-subtle)',
color: 'var(--color-warning)',
borderRadius: 'var(--radius-md)',
padding: '10px 13px',
font: 'var(--font-medium) var(--text-xs)/1.5 var(--font-sans)'
}
}, /*#__PURE__*/React.createElement(Icon, {
name: "Info",
size: 14
}), "AIDA \uC778\uC99D\uC744 \uC644\uB8CC\uD558\uBA74 \uC120\uD0DD\uD55C \uD504\uB85C\uC81D\uD2B8\uC758 AiRSFlow App \uBAA9\uB85D\uC744 \uBD88\uB7EC\uC62C \uC218 \uC788\uC2B5\uB2C8\uB2E4."), /*#__PURE__*/React.createElement("div", {
style: {
display: 'flex',
gap: 8,
alignItems: 'flex-end',
marginTop: 14
}
}, /*#__PURE__*/React.createElement("div", {
style: {
flex: 1
}
}, /*#__PURE__*/React.createElement("label", {
style: labelStyle
}, "\uC2E0\uADDC AiRSFlow App ", /*#__PURE__*/React.createElement("span", {
style: {
color: 'var(--text-muted)'
}
}, "\uAE30\uBCF8\uAC12: mona")), /*#__PURE__*/React.createElement(Input, {
placeholder: "mona"
})), /*#__PURE__*/React.createElement(Button, {
variant: "secondary",
leadingIcon: /*#__PURE__*/React.createElement(Icon, {
name: "Plus",
size: 14
})
}, "\uC2E0\uADDC \uC0DD\uC131")))), /*#__PURE__*/React.createElement(Section, {
n: "5",
title: "MLflow \uC5F0\uB3D9",
toggle: /*#__PURE__*/React.createElement(Switch, {
checked: mlflow,
onChange: e => setMlflow(e.target.checked)
})
}, mlflow && /*#__PURE__*/React.createElement("div", {
style: {
font: 'var(--font-regular) var(--text-sm)/1.6 var(--font-sans)',
color: 'var(--text-secondary)'
}
}, "\uD504\uB85C\uC81D\uD2B8 \uC804\uC6A9 MLflow \uC778\uC2A4\uD134\uC2A4\uB97C \uD504\uB85C\uBE44\uC800\uB2DD\uD569\uB2C8\uB2E4. \uC2E4\uD5D8\xB7run \uBA54\uD0C0\uB370\uC774\uD130\uB294 \uC804\uC6A9 DB, \uC544\uD2F0\uD329\uD2B8\uB294 \uACF5\uC720 S3(", /*#__PURE__*/React.createElement("code", {
style: {
fontFamily: 'var(--font-mono)'
}
}, '{project}/mlflow'), ")\uC5D0 \uC800\uC7A5\uB429\uB2C8\uB2E4.")), /*#__PURE__*/React.createElement(Section, {
n: "6",
title: "\uC2E0\uCCAD \uC0AC\uC720",
badge: /*#__PURE__*/React.createElement("span", {
style: {
color: 'var(--color-danger)'
}
}, "*")
}, /*#__PURE__*/React.createElement(Textarea, {
placeholder: "\uD504\uB85C\uC81D\uD2B8 \uC0DD\uC131 \uBAA9\uC801 \uBC0F \uD544\uC694 \uB9AC\uC18C\uC2A4\uC5D0 \uB300\uD55C \uC124\uBA85\uC744 \uC785\uB825\uD558\uC138\uC694...",
required: true
})), /*#__PURE__*/React.createElement("div", {
style: {
display: 'flex',
justifyContent: 'flex-end',
gap: 10,
marginTop: 4
}
}, /*#__PURE__*/React.createElement(Button, {
variant: "ghost",
onClick: onCancel
}, "\uCDE8\uC18C"), /*#__PURE__*/React.createElement(Button, {
leadingIcon: /*#__PURE__*/React.createElement(Icon, {
name: "Send",
size: 15
}),
onClick: onCancel
}, "\uD504\uB85C\uC81D\uD2B8 \uC2E0\uCCAD")));
};
})();
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/ui_kits/pass/screens-request-project.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/ui_kits/pass/screens-requests.jsx
try { (() => {
/* MONA Pass — Requests (전체 공개 list + detail with Timeline). */
(() => {
const NS = window.MONAFamilyDesignSystem_3cb9a3;
const {
Tabs,
Card,
Badge,
Button,
Input,
Select,
Pagination,
Timeline,
Table
} = NS;
function Icon({
name,
size = 16,
stroke = 2,
...rest
}) {
const ico = window.lucide && window.lucide.icons && window.lucide.icons[name];
if (!ico) return null;
const kids = (ico[2] || []).map((c, i) => React.createElement(c[0], {
key: i,
...c[1]
}));
return React.createElement('svg', {
width: size,
height: size,
viewBox: '0 0 24 24',
fill: 'none',
stroke: 'currentColor',
strokeWidth: stroke,
strokeLinecap: 'round',
strokeLinejoin: 'round',
...rest
}, kids);
}
const REQS = [{
id: 'REQ-2026-1252',
type: '생성',
title: '쇼핑예측모델 프로젝트 mona version',
who: '하재권 (jaekwon.ha@navercorp.com)',
date: '2026-06-13',
status: 'success',
label: '승인'
}, {
id: 'REQ-2026-1238',
type: '생성',
title: 'sadf',
who: '김준석 (rock.kim@navercorp.com)',
date: '2026-06-11',
status: 'success',
label: '승인'
}, {
id: 'REQ-2026-1235',
type: '생성',
title: 'jaekwon-20260608-1',
who: '하재권 (jaekwon.ha@navercorp.com)',
date: '2026-06-08',
status: 'neutral',
label: '삭제됨'
}, {
id: 'REQ-2026-1219',
type: '생성',
title: '광고주센터 api',
who: '박인영 (inyeong.park@navercorp.com)',
date: '2026-06-01',
status: 'success',
label: '승인'
}, {
id: 'REQ-2026-1218',
type: '생성',
title: '홈피드 쇼핑, da 분류 라우팅 모델',
who: '송승민 (seungmin.song@navercorp.com)',
date: '2026-05-28',
status: 'success',
label: '승인'
}, {
id: 'REQ-2026-1211',
type: '생성',
title: 'MONA - DEMO',
who: '하재권 (jaekwon.ha@navercorp.com)',
date: '2026-05-27',
status: 'success',
label: '승인'
}];
window.PassRequests = function Requests() {
const [scope, setScope] = React.useState('all');
const [sel, setSel] = React.useState(REQS[0]);
const [page, setPage] = React.useState(1);
return /*#__PURE__*/React.createElement("div", {
className: "pg"
}, /*#__PURE__*/React.createElement("div", {
style: {
display: 'flex',
alignItems: 'flex-start'
}
}, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
className: "pg__head"
}, /*#__PURE__*/React.createElement("span", {
className: "pg__title"
}, "\uC2E0\uCCAD")), /*#__PURE__*/React.createElement("div", {
className: "pg__sub"
}, "\uC804\uCCB4 \uACF5\uAC1C \xB7 125\uAC74")), /*#__PURE__*/React.createElement("div", {
style: {
marginLeft: 'auto'
}
}, /*#__PURE__*/React.createElement(Button, {
leadingIcon: /*#__PURE__*/React.createElement(Icon, {
name: "Plus",
size: 15
}),
onClick: () => window.__passOpenForm && window.__passOpenForm()
}, "\uC0C8 \uC2E0\uCCAD"))), /*#__PURE__*/React.createElement(Card, {
flat: true,
tight: true,
className: ""
}, /*#__PURE__*/React.createElement("div", {
style: {
display: 'flex',
gap: 12,
alignItems: 'center',
flexWrap: 'wrap'
}
}, /*#__PURE__*/React.createElement(Tabs, {
variant: "pill",
value: scope,
onChange: setScope,
tabs: [{
id: 'all',
label: '전체 공개'
}, {
id: 'mine',
label: '내 신청'
}]
}), /*#__PURE__*/React.createElement("div", {
style: {
flex: 1,
minWidth: 180,
maxWidth: 320
}
}, /*#__PURE__*/React.createElement(Input, {
placeholder: "\uAC80\uC0C9\u2026",
leadingIcon: /*#__PURE__*/React.createElement(Icon, {
name: "Search",
size: 15
})
})), /*#__PURE__*/React.createElement(Select, {
options: [{
value: 'all',
label: '모든 상태 (125)'
}, {
value: 'approved',
label: '승인'
}, {
value: 'pending',
label: '신청 중'
}]
}))), /*#__PURE__*/React.createElement("div", {
style: {
display: 'grid',
gridTemplateColumns: '420px 1fr',
gap: 18,
alignItems: 'start',
marginTop: 16
}
}, /*#__PURE__*/React.createElement(Card, {
flat: true,
tight: true
}, REQS.map(r => /*#__PURE__*/React.createElement("button", {
key: r.id,
onClick: () => setSel(r),
style: {
display: 'block',
width: '100%',
textAlign: 'left',
border: 0,
background: sel.id === r.id ? 'var(--color-primary-subtle)' : 'transparent',
borderLeft: '3px solid ' + (sel.id === r.id ? 'var(--color-primary)' : 'transparent'),
padding: '12px 14px',
cursor: 'pointer',
borderBottom: '1px solid var(--color-border)'
}
}, /*#__PURE__*/React.createElement("div", {
style: {
display: 'flex',
alignItems: 'center',
gap: 8
}
}, /*#__PURE__*/React.createElement("span", {
style: {
font: 'var(--font-semibold) var(--text-sm)/1 var(--font-sans)',
color: 'var(--text-body)'
}
}, r.id), /*#__PURE__*/React.createElement(Badge, {
variant: r.status,
size: "sm"
}, r.label)), /*#__PURE__*/React.createElement("div", {
style: {
font: 'var(--font-medium) var(--text-sm)/1.4 var(--font-sans)',
color: 'var(--text-body)',
marginTop: 5
}
}, /*#__PURE__*/React.createElement(Badge, {
variant: "neutral",
size: "sm"
}, r.type), " ", r.title), /*#__PURE__*/React.createElement("div", {
style: {
font: 'var(--font-regular) var(--text-xs)/1.4 var(--font-sans)',
color: 'var(--text-muted)',
marginTop: 4
}
}, r.who, " \xB7 ", r.date))), /*#__PURE__*/React.createElement("div", {
style: {
padding: 12,
display: 'flex',
justifyContent: 'flex-end'
}
}, /*#__PURE__*/React.createElement(Pagination, {
page: page,
pageCount: 13,
onChange: setPage
}))), /*#__PURE__*/React.createElement(Card, null, /*#__PURE__*/React.createElement("div", {
style: {
display: 'flex',
alignItems: 'center',
gap: 9
}
}, /*#__PURE__*/React.createElement("span", {
style: {
font: 'var(--font-bold) var(--text-lg)/1 var(--font-sans)',
color: 'var(--text-body)'
}
}, "#", sel.id), /*#__PURE__*/React.createElement(Badge, {
variant: sel.status,
dot: true,
size: "sm"
}, sel.label)), /*#__PURE__*/React.createElement("div", {
style: {
font: 'var(--font-regular) var(--text-sm)/1.5 var(--font-sans)',
color: 'var(--text-secondary)',
marginTop: 6
}
}, "\uD504\uB85C\uC81D\uD2B8 \uC0DD\uC131 \xB7 ", sel.title), /*#__PURE__*/React.createElement("div", {
style: {
marginTop: 18,
font: 'var(--font-semibold) var(--text-sm)/1 var(--font-sans)',
color: 'var(--text-body)',
marginBottom: 10
}
}, "\uC2E0\uCCAD \uB0B4\uC6A9"), /*#__PURE__*/React.createElement(Table, {
hover: false
}, /*#__PURE__*/React.createElement("thead", null, /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("th", null, "\uD658\uACBD"), /*#__PURE__*/React.createElement("th", null, "CPU"), /*#__PURE__*/React.createElement("th", null, "Memory"))), /*#__PURE__*/React.createElement("tbody", null, /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", {
style: {
fontWeight: 600
}
}, "DEV"), /*#__PURE__*/React.createElement("td", {
style: {
fontFamily: 'var(--font-mono)',
fontSize: 'var(--text-xs)'
}
}, "96 ~ 96"), /*#__PURE__*/React.createElement("td", {
style: {
fontFamily: 'var(--font-mono)',
fontSize: 'var(--text-xs)'
}
}, "96Gi ~ 96Gi")))), /*#__PURE__*/React.createElement("div", {
style: {
marginTop: 18,
font: 'var(--font-semibold) var(--text-sm)/1 var(--font-sans)',
color: 'var(--text-body)',
marginBottom: 12
}
}, "\uD0C0\uC784\uB77C\uC778"), /*#__PURE__*/React.createElement(Timeline, {
items: [{
title: '프로젝트 생성 완료',
status: 'success',
meta: '2026-06-13',
description: '→ mona-shoppingvm-v2'
}, {
title: '승인됨',
status: 'success',
meta: '하재권 · 2026-06-13'
}, {
title: '신청됨',
status: 'primary',
meta: '하재권 · 2026-06-13'
}]
}))));
};
})();
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/ui_kits/pass/screens-requests.jsx", error: String((e && e.message) || e) }); }
// uploads/MONA Family Design System-handoff/project/ui_kits/pass/screens.jsx
try { (() => {
/* MONA Pass — interactive UI kit screens. Composes the family components. */
const NS = window.MONAFamilyDesignSystem_3cb9a3;
const {
AppHeader,
LoginScreen,
EnvBanner,
Card,
Button,
IconButton,
Badge,
RoleBadge,
EmptyState,
Tabs,
Table,
SortableHeader,
Pagination,
Input,
Modal,
Tooltip
} = NS;
/* ---- Lucide icon helper (real Lucide glyphs, not hand-rolled) ---- */
function Icon({
name,
size = 16,
stroke = 2,
...rest
}) {
const ico = window.lucide && window.lucide.icons && window.lucide.icons[name];
if (!ico) return null;
const kids = (ico[2] || []).map((c, i) => React.createElement(c[0], {
key: i,
...c[1]
}));
return React.createElement('svg', {
width: size,
height: size,
viewBox: '0 0 24 24',
fill: 'none',
stroke: 'currentColor',
strokeWidth: stroke,
strokeLinecap: 'round',
strokeLinejoin: 'round',
...rest
}, kids);
}
/* ---- Mock data ---- */
const PROJECTS = [{
id: 'ads',
name: '광고주센터 api',
ns: 'ads-api',
status: 'Synced',
role: 'developer',
members: 12,
env: 'dev'
}, {
id: 'demo',
name: 'MONA-DEMO',
ns: 'mona-demo',
status: 'OutOfSync',
role: 'admin',
members: 4,
env: 'dev'
}, {
id: 'swif',
name: 'swif',
ns: 'swif',
status: 'Provisioning',
role: 'viewer',
members: 7,
env: 'stage'
}, {
id: 'reco',
name: '추천 파이프라인',
ns: 'reco-pipe',
status: 'Synced',
role: 'developer',
members: 9,
env: 'prod'
}];
const REQUESTS = [{
id: 'REQ-2026-1252',
type: 'MODIFY',
status: 'warning',
label: '신청 중',
when: '2시간 전 · CPU 8→16'
}, {
id: 'REQ-2026-1248',
type: 'NEW',
status: 'success',
label: '승인됨',
when: '어제 · swif'
}, {
id: 'REQ-2026-1240',
type: 'DELETE',
status: 'danger',
label: '반려됨',
when: '3일 전 · tmp-test'
}];
const STATUS_VARIANT = {
Synced: 'success',
OutOfSync: 'warning',
Provisioning: 'info',
Terminating: 'danger'
};
/* ---- Stat card ---- */
function Stat({
label,
value,
icon,
accent
}) {
return /*#__PURE__*/React.createElement(Card, {
tight: true
}, /*#__PURE__*/React.createElement("div", {
style: {
display: 'flex',
justifyContent: 'space-between',
alignItems: 'flex-start'
}
}, /*#__PURE__*/React.createElement("div", {
className: "stat__label"
}, label), /*#__PURE__*/React.createElement("span", {
style: {
color: accent || 'var(--color-primary)'
}
}, /*#__PURE__*/React.createElement(Icon, {
name: icon,
size: 18
}))), /*#__PURE__*/React.createElement("div", {
className: "stat__value"
}, value));
}
/* ---- Dashboard ---- */
function DashboardScreen() {
return /*#__PURE__*/React.createElement("div", {
className: "pg"
}, /*#__PURE__*/React.createElement("div", {
className: "pg__head"
}, /*#__PURE__*/React.createElement("span", {
className: "pg__title"
}, "\uB300\uC2DC\uBCF4\uB4DC"), /*#__PURE__*/React.createElement(RoleBadge, {
role: "admin",
isPlatform: true
})), /*#__PURE__*/React.createElement("div", {
className: "pg__sub"
}, "\uB0B4 \uD504\uB85C\uC81D\uD2B8\uC640 \uD074\uB7EC\uC2A4\uD130 \uC811\uADFC \uD604\uD669\uC744 \uD55C\uB208\uC5D0 \uD655\uC778\uD558\uC138\uC694."), /*#__PURE__*/React.createElement("div", {
className: "grid-stat"
}, /*#__PURE__*/React.createElement(Stat, {
label: "\uB0B4 \uD504\uB85C\uC81D\uD2B8",
value: "4",
icon: "FolderOpen"
}), /*#__PURE__*/React.createElement(Stat, {
label: "\uC811\uADFC \uD074\uB7EC\uC2A4\uD130",
value: "3",
icon: "Server"
}), /*#__PURE__*/React.createElement(Stat, {
label: "\uC9C4\uD589 \uC911 \uC2E0\uCCAD",
value: "1",
icon: "ClipboardList",
accent: "var(--color-warning)"
}), /*#__PURE__*/React.createElement(Stat, {
label: "S3 \uBC84\uD0B7",
value: "6",
icon: "Database"
})), /*#__PURE__*/React.createElement("div", {
className: "dash"
}, /*#__PURE__*/React.createElement("div", {
className: "col"
}, /*#__PURE__*/React.createElement(Card, {
title: "Kubeconfig \uB2E4\uC6B4\uB85C\uB4DC",
icon: /*#__PURE__*/React.createElement("span", {
style: {
color: 'var(--color-primary)'
}
}, /*#__PURE__*/React.createElement(Icon, {
name: "Download",
size: 18
})),
headerActions: /*#__PURE__*/React.createElement(Button, {
size: "sm"
}, "\uC804\uCCB4 \uB2E4\uC6B4\uB85C\uB4DC")
}, /*#__PURE__*/React.createElement("div", {
className: "muted"
}, "\uC811\uADFC \uAC00\uB2A5\uD55C \uCEE8\uD14D\uC2A4\uD2B8\uB97C \uC120\uD0DD\uD574 kubeconfig\uB97C \uBC1C\uAE09\uD569\uB2C8\uB2E4."), /*#__PURE__*/React.createElement("div", {
className: "codebox"
}, /*#__PURE__*/React.createElement("span", {
className: "b"
}, "kubectl"), " config use-context ", /*#__PURE__*/React.createElement("span", {
className: "g"
}, "mona-demo"), /*#__PURE__*/React.createElement("br", null), /*#__PURE__*/React.createElement("span", {
className: "b"
}, "kubectl"), " get pods ", /*#__PURE__*/React.createElement("span", {
className: "g"
}, "-n mona-demo")), /*#__PURE__*/React.createElement("div", {
style: {
display: 'flex',
gap: 8,
marginTop: 12
}
}, /*#__PURE__*/React.createElement(Badge, {
variant: "info",
shape: "pill",
size: "sm",
dot: true
}, "dev \xB7 idc-a"), /*#__PURE__*/React.createElement(Badge, {
variant: "purple",
shape: "pill",
size: "sm",
dot: true
}, "platform"), /*#__PURE__*/React.createElement(Badge, {
variant: "info",
shape: "pill",
size: "sm",
dot: true
}, "stage \xB7 idc-b"))), /*#__PURE__*/React.createElement(Card, {
title: "S3 \uC561\uC138\uC2A4 \uD0A4",
icon: /*#__PURE__*/React.createElement("span", {
style: {
color: 'var(--color-primary)'
}
}, /*#__PURE__*/React.createElement(Icon, {
name: "KeyRound",
size: 18
})),
headerActions: /*#__PURE__*/React.createElement(Button, {
size: "sm",
variant: "secondary",
leadingIcon: /*#__PURE__*/React.createElement(Icon, {
name: "RefreshCw",
size: 14
})
}, "\uC0C8 \uD0A4 \uBC1C\uAE09")
}, /*#__PURE__*/React.createElement("div", {
className: "kv"
}, /*#__PURE__*/React.createElement("span", null, "Endpoint"), /*#__PURE__*/React.createElement("b", {
style: {
fontFamily: 'var(--font-mono)',
fontSize: 'var(--text-xs)'
}
}, "s3.dev-mona.navercorp.com")), /*#__PURE__*/React.createElement("div", {
className: "kv"
}, /*#__PURE__*/React.createElement("span", null, "Access Key"), /*#__PURE__*/React.createElement("b", {
style: {
fontFamily: 'var(--font-mono)',
fontSize: 'var(--text-xs)'
}
}, "AKIA\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u20227Q2F")), /*#__PURE__*/React.createElement("div", {
className: "kv"
}, /*#__PURE__*/React.createElement("span", null, "\uBC84\uD0B7"), /*#__PURE__*/React.createElement("b", null, "mpd-ads-api / mpd-reco"))), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
className: "sectitle"
}, "\uB0B4 \uD504\uB85C\uC81D\uD2B8"), /*#__PURE__*/React.createElement("div", {
className: "projgrid"
}, PROJECTS.map(p => /*#__PURE__*/React.createElement(Card, {
key: p.id,
interactive: true,
onClick: () => window.__passOpenDetail && window.__passOpenDetail(),
icon: /*#__PURE__*/React.createElement("span", {
style: {
color: 'var(--color-primary)'
}
}, /*#__PURE__*/React.createElement(Icon, {
name: "Boxes",
size: 18
})),
title: p.name,
headerActions: /*#__PURE__*/React.createElement(Badge, {
variant: STATUS_VARIANT[p.status],
dot: true,
size: "sm"
}, p.status)
}, /*#__PURE__*/React.createElement("div", {
className: "kv"
}, /*#__PURE__*/React.createElement("span", null, "\uB124\uC784\uC2A4\uD398\uC774\uC2A4"), /*#__PURE__*/React.createElement("b", {
style: {
fontFamily: 'var(--font-mono)',
fontSize: 'var(--text-xs)'
}
}, p.ns)), /*#__PURE__*/React.createElement("div", {
className: "kv"
}, /*#__PURE__*/React.createElement("span", null, "\uB0B4 \uC5ED\uD560"), /*#__PURE__*/React.createElement(RoleBadge, {
role: p.role
}))))))), /*#__PURE__*/React.createElement("div", {
className: "col"
}, /*#__PURE__*/React.createElement(Card, {
title: "\uCD5C\uADFC \uC2E0\uCCAD \uB0B4\uC5ED"
}, REQUESTS.map(r => /*#__PURE__*/React.createElement("div", {
className: "reqitem",
key: r.id
}, /*#__PURE__*/React.createElement("div", {
className: "reqitem__top"
}, /*#__PURE__*/React.createElement("span", {
className: "reqitem__id"
}, r.id), /*#__PURE__*/React.createElement(Badge, {
variant: r.status,
size: "sm"
}, r.label)), /*#__PURE__*/React.createElement("div", {
className: "reqitem__meta"
}, /*#__PURE__*/React.createElement(Badge, {
variant: "neutral",
size: "sm"
}, r.type), " \xA0", r.when)))), /*#__PURE__*/React.createElement(Card, {
title: "\uCC38\uC5EC \uC694\uCCAD",
headerActions: /*#__PURE__*/React.createElement(Badge, {
variant: "warning",
size: "sm"
}, "2")
}, /*#__PURE__*/React.createElement("div", {
className: "kv"
}, /*#__PURE__*/React.createElement("span", null, "\uAE40\uB2E4\uC740 \u2192 ads-api"), /*#__PURE__*/React.createElement(Button, {
size: "sm",
variant: "ghost"
}, "\uAC80\uD1A0")), /*#__PURE__*/React.createElement("div", {
className: "kv"
}, /*#__PURE__*/React.createElement("span", null, "\uC774\uC900\uD638 \u2192 reco-pipe"), /*#__PURE__*/React.createElement(Button, {
size: "sm",
variant: "ghost"
}, "\uAC80\uD1A0"))))));
}
/* ---- Projects ---- */
function ProjectsScreen() {
const [seg, setSeg] = React.useState('mine');
const [sort, setSort] = React.useState({
key: 'name',
dir: 'asc'
});
const [page, setPage] = React.useState(1);
const set = key => dir => setSort({
key,
dir
});
return /*#__PURE__*/React.createElement("div", {
className: "pg"
}, /*#__PURE__*/React.createElement("div", {
className: "pg__head"
}, /*#__PURE__*/React.createElement("span", {
className: "pg__title"
}, "\uD504\uB85C\uC81D\uD2B8")), /*#__PURE__*/React.createElement("div", {
className: "pg__sub"
}, "\uCC38\uC5EC \uC911\uC774\uAC70\uB098 \uC2E0\uCCAD \uAC00\uB2A5\uD55C \uD504\uB85C\uC81D\uD2B8\uB97C \uD0D0\uC0C9\uD558\uC138\uC694."), /*#__PURE__*/React.createElement("div", {
className: "toolbar"
}, /*#__PURE__*/React.createElement(Tabs, {
variant: "pill",
value: seg,
onChange: setSeg,
tabs: [{
id: 'mine',
label: '소속'
}, {
id: 'other',
label: '미소속'
}, {
id: 'all',
label: '전체'
}]
}), /*#__PURE__*/React.createElement("div", {
style: {
flex: 1
}
}), /*#__PURE__*/React.createElement("div", {
className: "toolbar__search"
}, /*#__PURE__*/React.createElement(Input, {
placeholder: "\uD504\uB85C\uC81D\uD2B8 \uAC80\uC0C9",
leadingIcon: /*#__PURE__*/React.createElement(Icon, {
name: "Search",
size: 15
})
})), /*#__PURE__*/React.createElement(Button, {
leadingIcon: /*#__PURE__*/React.createElement(Icon, {
name: "Plus",
size: 15
}),
onClick: () => window.__passOpenForm && window.__passOpenForm()
}, "\uC0C8 \uD504\uB85C\uC81D\uD2B8 \uC2E0\uCCAD")), /*#__PURE__*/React.createElement(Table, null, /*#__PURE__*/React.createElement("thead", null, /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement(SortableHeader, {
label: "\uD504\uB85C\uC81D\uD2B8",
direction: sort.key === 'name' ? sort.dir : 'none',
onSort: set('name')
}), /*#__PURE__*/React.createElement(SortableHeader, {
label: "\uB124\uC784\uC2A4\uD398\uC774\uC2A4",
direction: sort.key === 'ns' ? sort.dir : 'none',
onSort: set('ns')
}), /*#__PURE__*/React.createElement("th", null, "\uC0C1\uD0DC"), /*#__PURE__*/React.createElement("th", null, "\uC18C\uC720 \uD300"), /*#__PURE__*/React.createElement("th", null, "\uB0B4 \uC5ED\uD560"), /*#__PURE__*/React.createElement(SortableHeader, {
label: "\uBA64\uBC84",
align: "right",
direction: sort.key === 'm' ? sort.dir : 'none',
onSort: set('m')
}), /*#__PURE__*/React.createElement("th", null))), /*#__PURE__*/React.createElement("tbody", null, PROJECTS.map(p => /*#__PURE__*/React.createElement("tr", {
key: p.id
}, /*#__PURE__*/React.createElement("td", {
style: {
fontWeight: 600
}
}, p.name), /*#__PURE__*/React.createElement("td", {
style: {
fontFamily: 'var(--font-mono)',
fontSize: 'var(--text-xs)',
color: 'var(--text-secondary)'
}
}, p.ns), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement(Badge, {
variant: STATUS_VARIANT[p.status],
dot: true,
size: "sm"
}, p.status)), /*#__PURE__*/React.createElement("td", {
style: {
color: 'var(--text-secondary)'
}
}, "Platform Team"), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement(RoleBadge, {
role: p.role
})), /*#__PURE__*/React.createElement("td", {
style: {
textAlign: 'right'
}
}, p.members), /*#__PURE__*/React.createElement("td", {
style: {
textAlign: 'right'
}
}, /*#__PURE__*/React.createElement(Button, {
size: "sm",
variant: "ghost",
onClick: () => window.__passOpenDetail && window.__passOpenDetail()
}, "\uC0C1\uC138")))))), /*#__PURE__*/React.createElement("div", {
style: {
display: 'flex',
justifyContent: 'flex-end',
marginTop: 16
}
}, /*#__PURE__*/React.createElement(Pagination, {
page: page,
pageCount: 4,
total: 38,
pageSize: 10,
onChange: setPage
})));
}
/* ---- Admin ---- */
function AdminScreen() {
const [tab, setTab] = React.useState('pending');
const tabs = [{
id: 'pending',
label: '승인 대기',
count: 0
}, {
id: 'projects',
label: '프로젝트'
}, {
id: 'users',
label: '사용자'
}, {
id: 'clusters',
label: '클러스터'
}, {
id: 'roles',
label: '클러스터 롤'
}, {
id: 'audit',
label: '감사'
}, {
id: 'notice',
label: '공지'
}, {
id: 'settings',
label: '시스템 설정'
}];
return /*#__PURE__*/React.createElement("div", {
className: "pg"
}, /*#__PURE__*/React.createElement("div", {
className: "pg__head"
}, /*#__PURE__*/React.createElement("span", {
className: "pg__title"
}, "\uAD00\uB9AC\uC790 \uCF58\uC194")), /*#__PURE__*/React.createElement("div", {
className: "pg__sub"
}, "\uD074\uB7EC\uC2A4\uD130, \uC0AC\uC6A9\uC790, \uC2E0\uCCAD\uC744 \uAD00\uB9AC\uD569\uB2C8\uB2E4."), /*#__PURE__*/React.createElement(Tabs, {
value: tab,
onChange: setTab,
tabs: tabs
}), /*#__PURE__*/React.createElement("div", {
style: {
marginTop: 18
}
}, /*#__PURE__*/React.createElement(Card, {
flat: true
}, /*#__PURE__*/React.createElement("div", {
className: "admin-empty"
}, /*#__PURE__*/React.createElement(EmptyState, {
icon: /*#__PURE__*/React.createElement(Icon, {
name: "Inbox",
size: 24
}),
title: "\uB300\uAE30 \uC911\uC778 \uC694\uCCAD\uC774 \uC5C6\uC2B5\uB2C8\uB2E4",
description: "\uC0C8 \uD504\uB85C\uC81D\uD2B8\xB7\uC218\uC815\xB7\uC0AD\uC81C \uC2E0\uCCAD\uC774 \uB4E4\uC5B4\uC624\uBA74 \uC5EC\uAE30\uC5D0\uC11C \uC2B9\uC778\uD558\uAC70\uB098 \uBC18\uB824\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4."
})))));
}
/* ---- App shell ---- */
function PassApp() {
const [authed, setAuthed] = React.useState(false);
const [nav, setNav] = React.useState('dashboard');
const [view, setView] = React.useState(null); // null | 'detail'
const [theme, setTheme] = React.useState('light');
React.useEffect(() => {
document.documentElement.classList.toggle('dark', theme === 'dark');
}, [theme]);
React.useEffect(() => {
window.__passOpenDetail = () => setView('detail');
window.__passOpenForm = () => setView('form');
}, []);
if (!authed) {
return /*#__PURE__*/React.createElement(LoginScreen, {
logo: "../../assets/logos/pass.svg",
product: "Pass",
title: "Kubernetes \uAD8C\uD55C \uD1B5\uD569 \uAD00\uB9AC",
subtitle: "\uD504\uB85C\uC81D\uD2B8\uB97C \uC2E0\uCCAD\uD558\uACE0 \uC2B9\uC778\uBC1B\uC544 kubeconfig\xB7S3 \uD0A4\uB97C \uBC1C\uAE09\uD558\uC138\uC694.",
buttonLabel: "SSO \uB85C\uADF8\uC778",
onLogin: () => setAuthed(true),
note: /*#__PURE__*/React.createElement(React.Fragment, null, "OSS \uACC4\uC815\uC73C\uB85C \uB85C\uADF8\uC778\uD569\uB2C8\uB2E4 \xB7 ", /*#__PURE__*/React.createElement("a", {
href: "#",
onClick: e => e.preventDefault()
}, "\uB3C4\uC6C0\uB9D0"))
});
}
const externalLinks = /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Tooltip, {
label: "REST API"
}, /*#__PURE__*/React.createElement(IconButton, {
"aria-label": "api"
}, /*#__PURE__*/React.createElement(Icon, {
name: "Code",
size: 17
}))), /*#__PURE__*/React.createElement(Tooltip, {
label: "\uC774\uC288 \uB9AC\uD3EC\uD2B8"
}, /*#__PURE__*/React.createElement(IconButton, {
"aria-label": "issues"
}, /*#__PURE__*/React.createElement(Icon, {
name: "Bug",
size: 17
}))));
return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(EnvBanner, {
env: "dev"
}), /*#__PURE__*/React.createElement(AppHeader, {
logo: "../../assets/logos/pass.svg",
product: "Pass",
nav: [{
id: 'dashboard',
label: '대시보드',
icon: /*#__PURE__*/React.createElement(Icon, {
name: "LayoutDashboard",
size: 15
})
}, {
id: 'projects',
label: '프로젝트',
icon: /*#__PURE__*/React.createElement(Icon, {
name: "FolderOpen",
size: 15
})
}, {
id: 'requests',
label: '신청',
icon: /*#__PURE__*/React.createElement(Icon, {
name: "ClipboardList",
size: 15
})
}, {
id: 'help',
label: '도움말',
icon: /*#__PURE__*/React.createElement(Icon, {
name: "BookOpen",
size: 15
})
}, {
id: 'admin',
label: '관리자',
icon: /*#__PURE__*/React.createElement(Icon, {
name: "Settings",
size: 15
})
}],
activeNav: nav,
onNav: id => {
setNav(id);
setView(null);
},
theme: theme,
onThemeToggle: () => setTheme(t => t === 'dark' ? 'light' : 'dark'),
rightExtra: externalLinks,
user: {
name: 'RK',
meta: 'Platform Team'
}
}), view === 'detail' ? /*#__PURE__*/React.createElement(window.PassProjectDetail, {
onBack: () => setView(null)
}) : view === 'form' ? /*#__PURE__*/React.createElement(window.PassRequestProject, {
onCancel: () => setView(null)
}) : /*#__PURE__*/React.createElement(React.Fragment, null, nav === 'dashboard' && /*#__PURE__*/React.createElement(DashboardScreen, null), nav === 'projects' && /*#__PURE__*/React.createElement(ProjectsScreen, null), nav === 'admin' && /*#__PURE__*/React.createElement(window.PassAdmin, null), nav === 'requests' && /*#__PURE__*/React.createElement(window.PassRequests, null), nav === 'help' && /*#__PURE__*/React.createElement("div", {
className: "pg"
}, /*#__PURE__*/React.createElement("div", {
className: "pg__head"
}, /*#__PURE__*/React.createElement("span", {
className: "pg__title"
}, "\uB3C4\uC6C0\uB9D0")), /*#__PURE__*/React.createElement(Card, {
flat: true
}, /*#__PURE__*/React.createElement("div", {
className: "admin-empty"
}, /*#__PURE__*/React.createElement(EmptyState, {
icon: /*#__PURE__*/React.createElement(Icon, {
name: "BookOpen",
size: 24
}),
title: "\uB3C4\uC6C0\uB9D0 \uC13C\uD130",
description: "\uCE74\uD14C\uACE0\uB9AC \uAC00\uC774\uB4DC + \uB9C8\uD06C\uB2E4\uC6B4 \uBB38\uC11C(prose) \uD654\uBA74\uC740 \uB2E4\uC74C \uCC28\uC218\uC5D0 \uCD94\uAC00 \uC608\uC815\uC785\uB2C8\uB2E4."
}))))));
}
ReactDOM.createRoot(document.getElementById('root')).render(/*#__PURE__*/React.createElement(PassApp, null));
})(); } catch (e) { __ds_ns.__errors.push({ path: "uploads/MONA Family Design System-handoff/project/ui_kits/pass/screens.jsx", error: String((e && e.message) || e) }); }
__ds_ns.AppHeader = __ds_scope.AppHeader;
__ds_ns.LoginScreen = __ds_scope.LoginScreen;
__ds_ns.SortableHeader = __ds_scope.SortableHeader;
__ds_ns.Table = __ds_scope.Table;
__ds_ns.Badge = __ds_scope.Badge;
__ds_ns.EmptyState = __ds_scope.EmptyState;
__ds_ns.EnvChip = __ds_scope.EnvChip;
__ds_ns.ErrorState = __ds_scope.ErrorState;
__ds_ns.ProgressBar = __ds_scope.ProgressBar;
__ds_ns.RoleBadge = __ds_scope.RoleBadge;
__ds_ns.Skeleton = __ds_scope.Skeleton;
__ds_ns.StatusGrid = __ds_scope.StatusGrid;
__ds_ns.Timeline = __ds_scope.Timeline;
__ds_ns.Toast = __ds_scope.Toast;
__ds_ns.ToastStack = __ds_scope.ToastStack;
__ds_ns.Tooltip = __ds_scope.Tooltip;
__ds_ns.Button = __ds_scope.Button;
__ds_ns.Checkbox = __ds_scope.Checkbox;
__ds_ns.CodeBlock = __ds_scope.CodeBlock;
__ds_ns.CopyButton = __ds_scope.CopyButton;
__ds_ns.IconButton = __ds_scope.IconButton;
__ds_ns.Input = __ds_scope.Input;
__ds_ns.MaskedField = __ds_scope.MaskedField;
__ds_ns.RadioGroup = __ds_scope.RadioGroup;
__ds_ns.Select = __ds_scope.Select;
__ds_ns.Switch = __ds_scope.Switch;
__ds_ns.Textarea = __ds_scope.Textarea;
__ds_ns.Breadcrumb = __ds_scope.Breadcrumb;
__ds_ns.Pagination = __ds_scope.Pagination;
__ds_ns.ProjectSwitcher = __ds_scope.ProjectSwitcher;
__ds_ns.Tabs = __ds_scope.Tabs;
__ds_ns.Card = __ds_scope.Card;
__ds_ns.ConfirmDialog = __ds_scope.ConfirmDialog;
__ds_ns.EnvBanner = __ds_scope.EnvBanner;
__ds_ns.Modal = __ds_scope.Modal;
__ds_ns.StatCard = __ds_scope.StatCard;
})();