222 lines
10 KiB
JSON
222 lines
10 KiB
JSON
{
|
||
"schemaVersion": "1.0.0",
|
||
"components": [
|
||
{
|
||
"id": "glass-surface",
|
||
"status": "baseline",
|
||
"package": "@nodedc/ui-react",
|
||
"exports": ["GlassSurface"],
|
||
"domContract": ["nodedc-glass", "nodedc-material-rim"],
|
||
"summary": "Canonical matte/glossy glass surface for cards, panels and window shells.",
|
||
"anatomy": ["theme-provided surface", "optional material rim", "backdrop blur", "content"],
|
||
"variants": ["default", "strong", "soft"],
|
||
"rules": [
|
||
"Geometry is invariant across application themes.",
|
||
"A material rim is a glass highlight, not a hard product-colored border.",
|
||
"Nested surfaces must use a softer tone to avoid card-inside-card noise."
|
||
]
|
||
},
|
||
{
|
||
"id": "button",
|
||
"status": "baseline",
|
||
"package": "@nodedc/ui-react",
|
||
"exports": ["Button", "IconButton"],
|
||
"domContract": ["nodedc-button", "nodedc-icon-button"],
|
||
"summary": "Text and icon actions with shared sizing, states and computed accent contrast.",
|
||
"variants": ["primary", "secondary", "ghost", "danger", "accent"],
|
||
"shapes": ["default", "pill", "rounded"],
|
||
"rules": [
|
||
"Icon-only actions are circular by default.",
|
||
"Filled accent actions derive foreground contrast from the actual accent.",
|
||
"Destructive actions remain neutral until confirmation unless danger is the principal message."
|
||
]
|
||
},
|
||
{
|
||
"id": "field",
|
||
"status": "baseline",
|
||
"package": "@nodedc/ui-react",
|
||
"exports": ["FieldFrame", "TextField", "TextAreaField"],
|
||
"domContract": ["nodedc-field", "nodedc-field__control"],
|
||
"summary": "Textual form controls with consistent labels, hints, geometry and focus surface.",
|
||
"rules": [
|
||
"Labels and validation copy are part of the field contract.",
|
||
"Keyboard focus changes the surface and remains visible without a browser-blue outline."
|
||
]
|
||
},
|
||
{
|
||
"id": "checker",
|
||
"status": "baseline",
|
||
"package": "@nodedc/ui-react",
|
||
"exports": ["Checker"],
|
||
"domContract": ["nodedc-checker"],
|
||
"summary": "Binary setting control derived from the redesigned Engine environment settings.",
|
||
"rules": [
|
||
"The visual anchor is circular, not a square native checkbox.",
|
||
"The control exposes checkbox semantics through role and aria-checked."
|
||
]
|
||
},
|
||
{
|
||
"id": "range-control",
|
||
"status": "baseline",
|
||
"package": "@nodedc/ui-react",
|
||
"exports": ["RangeControl"],
|
||
"domContract": ["nodedc-range"],
|
||
"summary": "Filled pill range control with embedded label and value from redesigned Engine settings.",
|
||
"rules": [
|
||
"The accent fill follows the active application theme.",
|
||
"The native range remains the accessible input while its chrome is visually replaced."
|
||
]
|
||
},
|
||
{
|
||
"id": "color-field",
|
||
"status": "baseline",
|
||
"package": "@nodedc/ui-react",
|
||
"exports": ["ColorField"],
|
||
"domContract": ["nodedc-color-field"],
|
||
"summary": "Combined color picker and textual value for settings/inspectors."
|
||
},
|
||
{
|
||
"id": "dropdown",
|
||
"status": "baseline",
|
||
"package": "@nodedc/ui-react",
|
||
"exports": ["Dropdown"],
|
||
"domPackage": "@nodedc/ui-dom",
|
||
"domExports": ["createFloatingLayer"],
|
||
"domContract": ["nodedc-dropdown-surface", "nodedc-dropdown-option"],
|
||
"summary": "Shared portal/fixed floating layer for action and selection menus.",
|
||
"behavior": ["portal to document body", "viewport clamp", "vertical flip", "outside pointer close", "Escape close", "scroll and resize reposition", "one open dropdown per window"],
|
||
"rules": [
|
||
"Never render a runtime dropdown as an absolute child of a card, sticky header or scroll container.",
|
||
"Action menus and selection menus share floating behavior even when their row content differs."
|
||
]
|
||
},
|
||
{
|
||
"id": "select",
|
||
"status": "baseline",
|
||
"package": "@nodedc/ui-react",
|
||
"exports": ["Select"],
|
||
"domPackage": "@nodedc/ui-dom",
|
||
"domExports": ["createSelectController"],
|
||
"summary": "Theme-independent selection control using the canonical dropdown layer.",
|
||
"variants": ["integrated", "split"],
|
||
"behavior": ["controlled value", "optional search", "disabled options", "selected state", "portal menu"],
|
||
"rules": [
|
||
"Integrated is the single-pill Hub/Launcher form.",
|
||
"Split is the Engine form: a separate value surface and a 46 px toggle separated by an 8 px gap.",
|
||
"The portal menu preserves its source-family row geometry instead of inheriting card radii."
|
||
]
|
||
},
|
||
{
|
||
"id": "window",
|
||
"status": "baseline",
|
||
"package": "@nodedc/ui-react",
|
||
"exports": ["Window", "WindowFooterActions"],
|
||
"domPackage": "@nodedc/ui-dom",
|
||
"domExports": ["createModalController"],
|
||
"domContract": ["nodedc-overlay", "nodedc-window"],
|
||
"summary": "Canonical controlled window for modal and right-side panel presentations.",
|
||
"behavior": ["portal to body", "focus entry", "modal-only focus trap", "focus restore", "Escape close", "backdrop close policy", "modal-only body scroll lock"],
|
||
"rules": [
|
||
"Open state belongs to the application; focus/layer behavior belongs to the component.",
|
||
"The same window contract is used by Launcher, CMS and SEO; theme variables supply color differences.",
|
||
"A right-side inspector is modeless by default: no dimming, no backdrop blur, no backdrop close, no focus trap and no body scroll lock."
|
||
]
|
||
},
|
||
{
|
||
"id": "confirmation-modal",
|
||
"status": "baseline",
|
||
"package": "@nodedc/ui-react",
|
||
"exports": ["ConfirmationModal"],
|
||
"summary": "Async-safe confirmation window for destructive and consequential operations.",
|
||
"behavior": ["pending state", "double-submit protection", "disabled close policy while pending"]
|
||
},
|
||
{
|
||
"id": "segmented-control",
|
||
"status": "baseline",
|
||
"package": "@nodedc/ui-react",
|
||
"exports": ["SegmentedControl"],
|
||
"domContract": ["nodedc-segmented"],
|
||
"summary": "Pill navigation used in the shared top header and compact mode switches."
|
||
},
|
||
{
|
||
"id": "app-header",
|
||
"status": "baseline",
|
||
"package": "@nodedc/ui-react",
|
||
"exports": ["AppHeader", "HeaderProfile", "HeaderProfileButton", "HeaderWorkspace", "HeaderAvatar"],
|
||
"domContract": ["nodedc-header-shell", "nodedc-header"],
|
||
"summary": "Three-axis NODE.DC application header with fixed brand geometry and composable center/right slots.",
|
||
"anatomy": ["left brand", "optional left context", "center navigation/workspace", "right actions/profile"],
|
||
"rules": [
|
||
"The logo occupies the same visual position and geometry across applications.",
|
||
"Product routes and profile content are application data passed into stable slots.",
|
||
"The canonical application header is fixed and preserves the Launcher three-axis logo / navigation / profile positions."
|
||
]
|
||
},
|
||
{
|
||
"id": "application-shell",
|
||
"status": "baseline",
|
||
"package": "@nodedc/ui-react",
|
||
"exports": ["ApplicationShell", "ApplicationPanel"],
|
||
"domContract": ["nodedc-app-shell", "nodedc-application-panel"],
|
||
"summary": "Launcher-derived application template with fixed header, media stage, left navigation and a separate expandable content window.",
|
||
"anatomy": ["fixed AppHeader", "stage", "left navigation", "right content window", "expand and close actions"],
|
||
"behavior": ["navigation shifts stage", "content opens beside navigation", "expanded content replaces stage", "mobile panels use the available viewport sequentially", "independent content scrolling"],
|
||
"rules": [
|
||
"The bottom Launcher service rail is product-specific and is not part of the general application template.",
|
||
"Desktop page gap is 20 px and navigation width follows the Launcher 332–352 px range.",
|
||
"Applications supply routes, profile data, stage media and panel content without changing shell geometry."
|
||
]
|
||
},
|
||
{
|
||
"id": "icon",
|
||
"status": "baseline",
|
||
"package": "@nodedc/ui-react",
|
||
"exports": ["Icon"],
|
||
"domContract": ["svg using currentColor"],
|
||
"summary": "Audited semantic icon subset shared by NODE.DC applications instead of product-local vendor imports.",
|
||
"variants": ["16 px", "18 px", "20 px"],
|
||
"rules": [
|
||
"Use semantic names from registry/icons.json.",
|
||
"The containing component owns surface, hit target and state; the icon owns only the glyph.",
|
||
"Do not copy complete Lucide or Font Awesome catalogs into an application."
|
||
]
|
||
},
|
||
{
|
||
"id": "admin-navigation-panel",
|
||
"status": "baseline",
|
||
"package": "@nodedc/ui-react",
|
||
"exports": ["AdminNavigationPanel"],
|
||
"domContract": ["nodedc-admin-panel"],
|
||
"summary": "Hub-derived left administration panel with context selectors, route navigation, close action and footer identity.",
|
||
"anatomy": ["eyebrow and title", "close action", "workspace context", "company context", "route items", "footer identity"],
|
||
"rules": [
|
||
"The panel shell, full-bleed pills and icon circles are library geometry; routes and identity data remain application-owned.",
|
||
"The desktop panel follows the Launcher 332–352 px width range with a 21.6 px shell radius and a 20 px page gap.",
|
||
"Active route state uses the active surface and icon contrast from the theme."
|
||
]
|
||
},
|
||
{
|
||
"id": "status-badge",
|
||
"status": "baseline",
|
||
"package": "@nodedc/ui-react",
|
||
"exports": ["StatusBadge"],
|
||
"domContract": ["nodedc-status"],
|
||
"summary": "Semantic status pill whose tone is independent from the application accent."
|
||
},
|
||
{
|
||
"id": "inspector",
|
||
"status": "baseline",
|
||
"package": "@nodedc/ui-react",
|
||
"exports": ["Inspector", "ControlRow"],
|
||
"domContract": ["nodedc-inspector", "nodedc-control-row"],
|
||
"summary": "Accordion settings/definition inspector derived only from the redesigned Engine environment and NDC agent inspector.",
|
||
"rules": [
|
||
"Legacy Engine inspectors are not reference implementations.",
|
||
"Domain-specific field definitions remain in Engine; reusable layout and controls live here.",
|
||
"Desktop Engine geometry is fixed at 390 px panel, 330 px content, 154/14/162 px control rows and 50 px section headers with a 12 px radius.",
|
||
"Accent-filled section headers belong to Environment Settings; neutral headers remain available for other approved inspector contexts."
|
||
]
|
||
}
|
||
]
|
||
}
|