noecosystem-design 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.editorconfig +12 -0
- package/.github/CODEOWNERS +10 -0
- package/.github/dependabot.yml +12 -0
- package/.github/pull_request_template.md +17 -0
- package/.github/workflows/ci.yml +173 -0
- package/.github/workflows/security.yml +40 -0
- package/.mcp.json +8 -0
- package/.node-version +1 -0
- package/AGENTS.md +62 -0
- package/CONTRIBUTING.md +9 -0
- package/README.md +48 -0
- package/SECURITY.md +7 -0
- package/apps/showcase/index.html +28 -0
- package/apps/showcase/package.json +30 -0
- package/apps/showcase/src/app.css +8 -0
- package/apps/showcase/src/app.tsx +10 -0
- package/apps/showcase/src/catalog/agent-composer-preview.tsx +17 -0
- package/apps/showcase/src/catalog/catalog-index.tsx +2676 -0
- package/apps/showcase/src/catalog/catalog-shell.browser.test.tsx +73 -0
- package/apps/showcase/src/catalog/catalog-shell.tsx +506 -0
- package/apps/showcase/src/main.tsx +17 -0
- package/apps/showcase/tsconfig.json +11 -0
- package/apps/showcase/vite.config.ts +15 -0
- package/apps/storybook/.storybook/main.ts +21 -0
- package/apps/storybook/.storybook/preview.tsx +87 -0
- package/apps/storybook/.storybook/vitest.setup.ts +26 -0
- package/apps/storybook/README.md +5 -0
- package/apps/storybook/package.json +31 -0
- package/apps/storybook/stories/AgentStates.stories.tsx +72 -0
- package/apps/storybook/stories/Bidi.stories.tsx +31 -0
- package/apps/storybook/stories/Button.stories.tsx +19 -0
- package/apps/storybook/stories/Surfaces.stories.tsx +28 -0
- package/apps/storybook/stories/catalog/about-page.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/activity-feed.stories.tsx +50 -0
- package/apps/storybook/stories/catalog/activity-gauge.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/agent-composer.stories.tsx +49 -0
- package/apps/storybook/stories/catalog/agent-message.stories.tsx +37 -0
- package/apps/storybook/stories/catalog/agent-plan.stories.tsx +35 -0
- package/apps/storybook/stories/catalog/agent-workspace.stories.tsx +60 -0
- package/apps/storybook/stories/catalog/alert.stories.tsx +41 -0
- package/apps/storybook/stories/catalog/app-frame.stories.tsx +47 -0
- package/apps/storybook/stories/catalog/approval-request.stories.tsx +30 -0
- package/apps/storybook/stories/catalog/avatar.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/badge-group.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/badge.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/banner.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/bidi-text.stories.tsx +47 -0
- package/apps/storybook/stories/catalog/blog-index-page.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/blog-post-page.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/blog-section.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/bottom-navigation.stories.tsx +27 -0
- package/apps/storybook/stories/catalog/button-group.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/button.stories.tsx +27 -0
- package/apps/storybook/stories/catalog/calendar.stories.tsx +47 -0
- package/apps/storybook/stories/catalog/card.stories.tsx +40 -0
- package/apps/storybook/stories/catalog/careers-section.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/carousel.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/chart-frame.stories.tsx +34 -0
- package/apps/storybook/stories/catalog/chart.stories.tsx +43 -0
- package/apps/storybook/stories/catalog/checkbox.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/code-and-terminal.stories.tsx +39 -0
- package/apps/storybook/stories/catalog/color-picker.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/command-menu.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/contact-page.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/contact-section.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/content-divider.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/content-section.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/context-menu.stories.tsx +66 -0
- package/apps/storybook/stories/catalog/credit-card.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/cta-section.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/dashboard-01.stories.tsx +28 -0
- package/apps/storybook/stories/catalog/dashboard-02.stories.tsx +28 -0
- package/apps/storybook/stories/catalog/dashboard-shell.stories.tsx +65 -0
- package/apps/storybook/stories/catalog/data-list.stories.tsx +37 -0
- package/apps/storybook/stories/catalog/data-table.stories.tsx +51 -0
- package/apps/storybook/stories/catalog/date-picker.stories.tsx +31 -0
- package/apps/storybook/stories/catalog/dialog.stories.tsx +68 -0
- package/apps/storybook/stories/catalog/direction-provider.stories.tsx +36 -0
- package/apps/storybook/stories/catalog/drawer.stories.tsx +58 -0
- package/apps/storybook/stories/catalog/dropdown.stories.tsx +67 -0
- package/apps/storybook/stories/catalog/email-template.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/empty-state.stories.tsx +19 -0
- package/apps/storybook/stories/catalog/error-state.stories.tsx +19 -0
- package/apps/storybook/stories/catalog/fab.stories.tsx +22 -0
- package/apps/storybook/stories/catalog/faq-page.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/faq-section.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/feature-section.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/featured-icon.stories.tsx +45 -0
- package/apps/storybook/stories/catalog/field.stories.tsx +35 -0
- package/apps/storybook/stories/catalog/file-uploader.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/filter-bar.stories.tsx +33 -0
- package/apps/storybook/stories/catalog/footer.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/forgot-password-page.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/gradient-picker.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/header-navigation.stories.tsx +46 -0
- package/apps/storybook/stories/catalog/hero-header.stories.tsx +36 -0
- package/apps/storybook/stories/catalog/icon-system.stories.tsx +48 -0
- package/apps/storybook/stories/catalog/illustration.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/image-picker.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/informational-page-01.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/informational-page-02.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/inline-cta.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/input.stories.tsx +21 -0
- package/apps/storybook/stories/catalog/landing-page.stories.tsx +28 -0
- package/apps/storybook/stories/catalog/legal-page.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/login-page.stories.tsx +42 -0
- package/apps/storybook/stories/catalog/marketing-404-page.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/marketing-header.stories.tsx +35 -0
- package/apps/storybook/stories/catalog/menu.stories.tsx +46 -0
- package/apps/storybook/stories/catalog/messaging.stories.tsx +33 -0
- package/apps/storybook/stories/catalog/metric-card.stories.tsx +20 -0
- package/apps/storybook/stories/catalog/metrics-section.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/mobile-screen.stories.tsx +56 -0
- package/apps/storybook/stories/catalog/multi-select.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/newsletter.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/not-found.stories.tsx +30 -0
- package/apps/storybook/stories/catalog/notification.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/page-header.stories.tsx +37 -0
- package/apps/storybook/stories/catalog/pagination.stories.tsx +27 -0
- package/apps/storybook/stories/catalog/pie-chart.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/pricing-page.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/pricing-section.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/progress-indicator.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/progress-steps.stories.tsx +33 -0
- package/apps/storybook/stories/catalog/qr-code.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/radar-chart.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/radio-group.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/rating.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/rich-text-editor.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/run-inspector.stories.tsx +23 -0
- package/apps/storybook/stories/catalog/section-footer.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/section-header.stories.tsx +31 -0
- package/apps/storybook/stories/catalog/select.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/settings-01.stories.tsx +24 -0
- package/apps/storybook/stories/catalog/settings-02.stories.tsx +24 -0
- package/apps/storybook/stories/catalog/settings-page.stories.tsx +48 -0
- package/apps/storybook/stories/catalog/sidebar-navigation.stories.tsx +40 -0
- package/apps/storybook/stories/catalog/sign-in-form.stories.tsx +28 -0
- package/apps/storybook/stories/catalog/sign-up-page.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/skeleton.stories.tsx +21 -0
- package/apps/storybook/stories/catalog/slider.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/social-button.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/social-proof.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/spinner.stories.tsx +15 -0
- package/apps/storybook/stories/catalog/store-button.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/tabs.stories.tsx +38 -0
- package/apps/storybook/stories/catalog/tags.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/team-page.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/team-section.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/testimonial-section.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/textarea.stories.tsx +22 -0
- package/apps/storybook/stories/catalog/toggle.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/tool-call.stories.tsx +40 -0
- package/apps/storybook/stories/catalog/tooltip.stories.tsx +30 -0
- package/apps/storybook/stories/catalog/tree-view.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/utility-button.stories.tsx +60 -0
- package/apps/storybook/stories/catalog/verification-code.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/verification-page.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/video-player.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/workflow-canvas.stories.tsx +45 -0
- package/apps/storybook/stories/catalog/workflow-node.stories.tsx +24 -0
- package/apps/storybook/vitest.config.ts +39 -0
- package/apps/web/README.md +13 -0
- package/apps/web/app.js +483 -0
- package/apps/web/favicon.svg +6 -0
- package/apps/web/index.html +205 -0
- package/apps/web/styles.css +1823 -0
- package/artifacts/original-delivery/NOE-Design-System-Delivery/README-FIRST.txt +20 -0
- package/artifacts/original-delivery/NOE-Design-System-Delivery/SHA256SUMS.txt +11 -0
- package/artifacts/original-delivery/NOE-Design-System-Delivery/noe-delivery-metadata.json +25 -0
- package/artifacts/original-delivery/NOE-Design-System-Delivery/noe-design-system-evidence.zip +0 -0
- package/artifacts/original-delivery/NOE-Design-System-Delivery/noe-design-system-execution-report.md +60 -0
- package/artifacts/original-delivery/NOE-Design-System-Delivery/noe-design-system-manifest.json +106 -0
- package/artifacts/original-delivery/NOE-Design-System-Delivery/noe-design-system-source.tar.gz +0 -0
- package/artifacts/original-delivery/NOE-Design-System-Delivery/noe-design-system-source.zip +0 -0
- package/artifacts/original-delivery/NOE-Design-System-Delivery/noe-design-system.bundle +0 -0
- package/artifacts/original-delivery/NOE-Design-System-Delivery/noe-evidence-index.html +38 -0
- package/artifacts/original-delivery/NOE-Design-System-Delivery/noe-verification-status.txt +15 -0
- package/artifacts/original-delivery/NOE-Design-System-Delivery/noe-visual-contact-sheet.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/README.txt +13 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/browser-console.json +4 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/layout-audit.json +4 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/review/contact-sheet.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-en-dark-1024.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-en-dark-1280.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-en-dark-1440.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-en-dark-390.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-en-dark-768.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-en-light-1024.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-en-light-1280.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-en-light-1440.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-en-light-390.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-en-light-768.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-fa-dark-1024.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-fa-dark-1280.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-fa-dark-1440.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-fa-dark-390.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-fa-dark-768.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-fa-light-1024.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-fa-light-1280.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-fa-light-1440.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-fa-light-390.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-fa-light-768.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-pseudo-ltr-1024.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-pseudo-rtl-1024.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/consumer-en-light-1440.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/consumer-fa-dark-1440.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/dashboard-en-light-1440.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/dashboard-fa-dark-1440.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/workflow-en-light-1440.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/workflow-fa-dark-1440.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots-manifest.json +203 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/verification-result.json +165 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/verification-result.txt +32 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/visual-index.html +1 -0
- package/artifacts/original-delivery/noe-design-system-evidence/noe-delivery-metadata.json +25 -0
- package/artifacts/original-delivery/noe-design-system-evidence/noe-design-system-execution-report.md +60 -0
- package/artifacts/original-delivery/noe-design-system-evidence/noe-design-system-manifest.json +106 -0
- package/artifacts/original-delivery/noe-design-system-evidence/noe-verification-status.txt +15 -0
- package/artifacts/original-delivery/noe-design-system.bundle +0 -0
- package/artifacts/original-delivery/source-evidence/verification-result.json +165 -0
- package/artifacts/original-delivery/source-evidence/verification-result.txt +32 -0
- package/artifacts/registry-consumer-report.json +153 -0
- package/artifacts/source-inputs/persian-fonts/Woff/IRANYekanXFaNum-Black.woff +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff/IRANYekanXFaNum-Bold.woff +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff/IRANYekanXFaNum-DemiBold.woff +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff/IRANYekanXFaNum-ExtraBlack.woff +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff/IRANYekanXFaNum-ExtraBold.woff +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff/IRANYekanXFaNum-Heavy.woff +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff/IRANYekanXFaNum-Light.woff +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff/IRANYekanXFaNum-Medium.woff +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff/IRANYekanXFaNum-Regular.woff +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff/IRANYekanXFaNum-Thin.woff +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff/IRANYekanXFaNum-UltraLight.woff +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff2/IRANYekanXFaNum-Black.woff2 +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff2/IRANYekanXFaNum-Bold.woff2 +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff2/IRANYekanXFaNum-DemiBold.woff2 +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff2/IRANYekanXFaNum-ExtraBlack.woff2 +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff2/IRANYekanXFaNum-ExtraBold.woff2 +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff2/IRANYekanXFaNum-Heavy.woff2 +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff2/IRANYekanXFaNum-Light.woff2 +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff2/IRANYekanXFaNum-Medium.woff2 +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff2/IRANYekanXFaNum-Regular.woff2 +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff2/IRANYekanXFaNum-Thin.woff2 +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff2/IRANYekanXFaNum-UltraLight.woff2 +0 -0
- package/biome.json +170 -0
- package/components.json +23 -0
- package/docs/adr/0001-semantic-foundation.md +5 -0
- package/docs/adr/0002-locale-direction.md +5 -0
- package/docs/adr/0003-registry-mcp.md +5 -0
- package/docs/adr/0004-testing-evidence.md +5 -0
- package/docs/adr/0005-noe-package-namespace.md +9 -0
- package/docs/adr/0006-icons8-icon-policy.md +9 -0
- package/docs/adr/0007-registry-publication-contract.md +9 -0
- package/docs/adr/0008-capability-library-adapter-boundaries.md +16 -0
- package/docs/adr/0009-calendar-system-jalali.md +29 -0
- package/docs/adr/0010-canonical-manifest-ownership.md +29 -0
- package/docs/adr/0011-palette-graphite-governance.md +27 -0
- package/docs/adr/0012-persian-font-gating.md +25 -0
- package/docs/adr/0013-cinematic-token-exception.md +32 -0
- package/docs/design-system/README.md +16 -0
- package/docs/design-system/accessibility.md +20 -0
- package/docs/design-system/agent-guide.md +11 -0
- package/docs/design-system/agentic-ui.md +21 -0
- package/docs/design-system/architecture.md +40 -0
- package/docs/design-system/brand.md +59 -0
- package/docs/design-system/ci-cd.md +46 -0
- package/docs/design-system/components.md +88 -0
- package/docs/design-system/contributing.md +7 -0
- package/docs/design-system/foundations.md +40 -0
- package/docs/design-system/i18n.md +24 -0
- package/docs/design-system/inventory.md +389 -0
- package/docs/design-system/mcp.md +7 -0
- package/docs/design-system/motion.md +7 -0
- package/docs/design-system/noe-brand-audit.md +33 -0
- package/docs/design-system/registry.md +16 -0
- package/docs/design-system/rtl.md +27 -0
- package/docs/design-system/security.md +16 -0
- package/docs/design-system/testing.md +39 -0
- package/docs/design-system/tokens.md +38 -0
- package/docs/design-system/visual-qa.md +10 -0
- package/docs/superpowers/plans/2026-08-25-noe-design-system-development-ready.md +833 -0
- package/docs/superpowers/plans/2026-08-26-noe-complete-catalog.md +422 -0
- package/docs/superpowers/specs/2026-08-25-noe-design-system-development-ready-design.md +260 -0
- package/docs/superpowers/specs/2026-08-26-noe-complete-catalog-design.md +187 -0
- package/llms.txt +20 -0
- package/package.json +68 -0
- package/packages/ai-ui/package.json +15 -0
- package/packages/ai-ui/src/activity-feed.tsx +60 -0
- package/packages/ai-ui/src/agent-composer.tsx +54 -0
- package/packages/ai-ui/src/agent-message.tsx +50 -0
- package/packages/ai-ui/src/agent-plan.tsx +69 -0
- package/packages/ai-ui/src/agent-workspace.tsx +63 -0
- package/packages/ai-ui/src/approval-request.tsx +93 -0
- package/packages/ai-ui/src/index.ts +8 -0
- package/packages/ai-ui/src/run-inspector.tsx +54 -0
- package/packages/ai-ui/src/tool-call.tsx +71 -0
- package/packages/data-ui/package.json +16 -0
- package/packages/data-ui/src/activity-gauge.tsx +38 -0
- package/packages/data-ui/src/chart-frame.tsx +41 -0
- package/packages/data-ui/src/chart.tsx +131 -0
- package/packages/data-ui/src/dashboard-01.tsx +39 -0
- package/packages/data-ui/src/dashboard-02.tsx +33 -0
- package/packages/data-ui/src/dashboard-shell.tsx +56 -0
- package/packages/data-ui/src/data-table.tsx +99 -0
- package/packages/data-ui/src/filter-bar.tsx +28 -0
- package/packages/data-ui/src/index.ts +12 -0
- package/packages/data-ui/src/metric-card.tsx +43 -0
- package/packages/data-ui/src/pagination.tsx +67 -0
- package/packages/data-ui/src/pie-chart.tsx +38 -0
- package/packages/data-ui/src/radar-chart.tsx +38 -0
- package/packages/design-tokens/package.json +23 -0
- package/packages/design-tokens/src/base.css +255 -0
- package/packages/design-tokens/src/fonts/IRANYekanXFaNum-Bold.woff2 +0 -0
- package/packages/design-tokens/src/fonts/IRANYekanXFaNum-DemiBold.woff2 +0 -0
- package/packages/design-tokens/src/fonts/IRANYekanXFaNum-Medium.woff2 +0 -0
- package/packages/design-tokens/src/fonts/IRANYekanXFaNum-Regular.woff2 +0 -0
- package/packages/design-tokens/src/fonts/IRANYekanXVF.ttf +0 -0
- package/packages/design-tokens/src/fonts/README.md +13 -0
- package/packages/design-tokens/src/fonts.css +49 -0
- package/packages/design-tokens/src/index.test.ts +36 -0
- package/packages/design-tokens/src/index.ts +5 -0
- package/packages/design-tokens/src/palette.ts +27 -0
- package/packages/design-tokens/src/tailwind.css +3 -0
- package/packages/design-tokens/src/theme.css +67 -0
- package/packages/design-tokens/src/tokens.css +251 -0
- package/packages/design-tokens/src/tokens.json +275 -0
- package/packages/design-tokens/src/tokens.mjs +276 -0
- package/packages/i18n/package.json +13 -0
- package/packages/i18n/src/index.ts +17 -0
- package/packages/i18n/src/messages/en.json +116 -0
- package/packages/i18n/src/messages/fa.json +116 -0
- package/packages/i18n/src/runtime.d.mts +42 -0
- package/packages/i18n/src/runtime.mjs +113 -0
- package/packages/i18n/src/translate.test.ts +50 -0
- package/packages/i18n/src/translate.ts +29 -0
- package/packages/icons/package.json +12 -0
- package/packages/icons/src/adapters.tsx +167 -0
- package/packages/icons/src/index.tsx +103 -0
- package/packages/registry/README.md +7 -0
- package/packages/registry/catalog-index.json +1345 -0
- package/packages/registry/component-audit.json +1038 -0
- package/packages/registry/coss-adoption.json +281 -0
- package/packages/registry/docs-index.json +1881 -0
- package/packages/registry/manifest.json +11081 -0
- package/packages/registry/manifest.schema.json +135 -0
- package/packages/registry/package.json +10 -0
- package/packages/registry/r/activity-feed.json +67 -0
- package/packages/registry/r/agent-composer.json +79 -0
- package/packages/registry/r/agent-message.json +72 -0
- package/packages/registry/r/agent-plan.json +67 -0
- package/packages/registry/r/agent-workspace.json +67 -0
- package/packages/registry/r/alert.json +68 -0
- package/packages/registry/r/app-frame.json +67 -0
- package/packages/registry/r/approval-request.json +84 -0
- package/packages/registry/r/badge.json +68 -0
- package/packages/registry/r/bidi-text.json +70 -0
- package/packages/registry/r/bottom-navigation.json +67 -0
- package/packages/registry/r/button.json +83 -0
- package/packages/registry/r/calendar.json +97 -0
- package/packages/registry/r/card.json +67 -0
- package/packages/registry/r/chart-frame.json +67 -0
- package/packages/registry/r/chart.json +67 -0
- package/packages/registry/r/code-block.json +67 -0
- package/packages/registry/r/context-menu.json +81 -0
- package/packages/registry/r/dashboard-01.json +86 -0
- package/packages/registry/r/dashboard-02.json +84 -0
- package/packages/registry/r/dashboard-shell.json +67 -0
- package/packages/registry/r/data-list.json +67 -0
- package/packages/registry/r/data-table.json +72 -0
- package/packages/registry/r/date-picker.json +117 -0
- package/packages/registry/r/dialog.json +84 -0
- package/packages/registry/r/direction-provider.json +54 -0
- package/packages/registry/r/drawer.json +80 -0
- package/packages/registry/r/dropdown.json +78 -0
- package/packages/registry/r/empty-state.json +67 -0
- package/packages/registry/r/error-state.json +67 -0
- package/packages/registry/r/fab.json +80 -0
- package/packages/registry/r/featured-icon.json +71 -0
- package/packages/registry/r/filter-bar.json +69 -0
- package/packages/registry/r/gradient-picker.json +62 -0
- package/packages/registry/r/header-navigation.json +67 -0
- package/packages/registry/r/hero-header.json +63 -0
- package/packages/registry/r/icon-system.json +59 -0
- package/packages/registry/r/image-picker.json +62 -0
- package/packages/registry/r/inline-cta.json +73 -0
- package/packages/registry/r/input.json +73 -0
- package/packages/registry/r/landing-page.json +70 -0
- package/packages/registry/r/login-page.json +71 -0
- package/packages/registry/r/marketing-header.json +63 -0
- package/packages/registry/r/menu.json +74 -0
- package/packages/registry/r/messaging.json +69 -0
- package/packages/registry/r/metric-card.json +67 -0
- package/packages/registry/r/mobile-screen.json +67 -0
- package/packages/registry/r/not-found.json +63 -0
- package/packages/registry/r/page-header.json +67 -0
- package/packages/registry/r/pagination.json +91 -0
- package/packages/registry/r/progress-steps.json +69 -0
- package/packages/registry/r/run-inspector.json +72 -0
- package/packages/registry/r/section-header.json +67 -0
- package/packages/registry/r/settings-01.json +94 -0
- package/packages/registry/r/settings-02.json +99 -0
- package/packages/registry/r/settings-page.json +67 -0
- package/packages/registry/r/sidebar-navigation.json +67 -0
- package/packages/registry/r/sign-in-form.json +89 -0
- package/packages/registry/r/skeleton.json +67 -0
- package/packages/registry/r/spinner.json +67 -0
- package/packages/registry/r/tabs.json +69 -0
- package/packages/registry/r/textarea.json +73 -0
- package/packages/registry/r/tool-call.json +72 -0
- package/packages/registry/r/tooltip.json +73 -0
- package/packages/registry/r/utility-button.json +83 -0
- package/packages/registry/r/workflow-canvas.json +67 -0
- package/packages/registry/r/workflow-node.json +72 -0
- package/packages/registry/r-planned-backup/about-page.json +14 -0
- package/packages/registry/r-planned-backup/activity-gauge.json +14 -0
- package/packages/registry/r-planned-backup/avatar.json +14 -0
- package/packages/registry/r-planned-backup/badge-group.json +14 -0
- package/packages/registry/r-planned-backup/banner.json +14 -0
- package/packages/registry/r-planned-backup/blog-index-page.json +14 -0
- package/packages/registry/r-planned-backup/blog-post-page.json +14 -0
- package/packages/registry/r-planned-backup/blog-section.json +14 -0
- package/packages/registry/r-planned-backup/button-group.json +14 -0
- package/packages/registry/r-planned-backup/careers-section.json +14 -0
- package/packages/registry/r-planned-backup/carousel.json +14 -0
- package/packages/registry/r-planned-backup/checkbox.json +14 -0
- package/packages/registry/r-planned-backup/color-picker.json +14 -0
- package/packages/registry/r-planned-backup/command-menu.json +14 -0
- package/packages/registry/r-planned-backup/contact-page.json +14 -0
- package/packages/registry/r-planned-backup/contact-section.json +14 -0
- package/packages/registry/r-planned-backup/content-divider.json +14 -0
- package/packages/registry/r-planned-backup/content-section.json +14 -0
- package/packages/registry/r-planned-backup/credit-card.json +14 -0
- package/packages/registry/r-planned-backup/cta-section.json +14 -0
- package/packages/registry/r-planned-backup/email-template.json +14 -0
- package/packages/registry/r-planned-backup/faq-page.json +14 -0
- package/packages/registry/r-planned-backup/faq-section.json +14 -0
- package/packages/registry/r-planned-backup/feature-section.json +14 -0
- package/packages/registry/r-planned-backup/file-uploader.json +14 -0
- package/packages/registry/r-planned-backup/footer.json +14 -0
- package/packages/registry/r-planned-backup/forgot-password-page.json +14 -0
- package/packages/registry/r-planned-backup/illustration.json +14 -0
- package/packages/registry/r-planned-backup/informational-page-01.json +14 -0
- package/packages/registry/r-planned-backup/informational-page-02.json +14 -0
- package/packages/registry/r-planned-backup/legal-page.json +14 -0
- package/packages/registry/r-planned-backup/marketing-404-page.json +14 -0
- package/packages/registry/r-planned-backup/metrics-section.json +14 -0
- package/packages/registry/r-planned-backup/multi-select.json +14 -0
- package/packages/registry/r-planned-backup/newsletter.json +14 -0
- package/packages/registry/r-planned-backup/notification.json +14 -0
- package/packages/registry/r-planned-backup/pie-chart.json +14 -0
- package/packages/registry/r-planned-backup/pricing-page.json +14 -0
- package/packages/registry/r-planned-backup/pricing-section.json +14 -0
- package/packages/registry/r-planned-backup/progress-indicator.json +14 -0
- package/packages/registry/r-planned-backup/qr-code.json +14 -0
- package/packages/registry/r-planned-backup/radar-chart.json +14 -0
- package/packages/registry/r-planned-backup/radio-group.json +14 -0
- package/packages/registry/r-planned-backup/rating.json +14 -0
- package/packages/registry/r-planned-backup/rich-text-editor.json +14 -0
- package/packages/registry/r-planned-backup/section-footer.json +14 -0
- package/packages/registry/r-planned-backup/select.json +14 -0
- package/packages/registry/r-planned-backup/sign-up-page.json +14 -0
- package/packages/registry/r-planned-backup/slider.json +14 -0
- package/packages/registry/r-planned-backup/social-button.json +14 -0
- package/packages/registry/r-planned-backup/social-proof.json +14 -0
- package/packages/registry/r-planned-backup/store-button.json +14 -0
- package/packages/registry/r-planned-backup/tags.json +14 -0
- package/packages/registry/r-planned-backup/team-page.json +14 -0
- package/packages/registry/r-planned-backup/team-section.json +14 -0
- package/packages/registry/r-planned-backup/testimonial-section.json +14 -0
- package/packages/registry/r-planned-backup/toggle.json +14 -0
- package/packages/registry/r-planned-backup/tree-view.json +14 -0
- package/packages/registry/r-planned-backup/verification-code.json +14 -0
- package/packages/registry/r-planned-backup/verification-page.json +14 -0
- package/packages/registry/r-planned-backup/video-player.json +14 -0
- package/packages/registry/registry.json +1997 -0
- package/packages/registry/search-index.json +3942 -0
- package/packages/testing/package.json +9 -0
- package/packages/testing/src/index.mjs +10 -0
- package/packages/ui/package.json +26 -0
- package/packages/ui/src/about-page.tsx +19 -0
- package/packages/ui/src/alert.tsx +67 -0
- package/packages/ui/src/app-frame.tsx +63 -0
- package/packages/ui/src/avatar.tsx +19 -0
- package/packages/ui/src/badge-group.tsx +19 -0
- package/packages/ui/src/badge.tsx +35 -0
- package/packages/ui/src/banner.tsx +19 -0
- package/packages/ui/src/bidi.tsx +80 -0
- package/packages/ui/src/blog-index-page.tsx +19 -0
- package/packages/ui/src/blog-post-page.tsx +19 -0
- package/packages/ui/src/blog-section.tsx +19 -0
- package/packages/ui/src/bottom-navigation.tsx +60 -0
- package/packages/ui/src/button-group.tsx +19 -0
- package/packages/ui/src/button.browser.test.tsx +38 -0
- package/packages/ui/src/button.tsx +81 -0
- package/packages/ui/src/calendar-system.test.ts +103 -0
- package/packages/ui/src/calendar-system.ts +120 -0
- package/packages/ui/src/calendar.browser.test.tsx +52 -0
- package/packages/ui/src/calendar.tsx +339 -0
- package/packages/ui/src/card.tsx +63 -0
- package/packages/ui/src/careers-section.tsx +19 -0
- package/packages/ui/src/carousel.tsx +19 -0
- package/packages/ui/src/checkbox.tsx +17 -0
- package/packages/ui/src/cinematic/cinematic.css +2020 -0
- package/packages/ui/src/cinematic/ecosystem-motion-showcase.tsx +265 -0
- package/packages/ui/src/cinematic/ecosystem-sphere.tsx +627 -0
- package/packages/ui/src/cinematic/index.ts +5 -0
- package/packages/ui/src/cinematic/kinetic-experience.tsx +207 -0
- package/packages/ui/src/cinematic/portfolio.ts +132 -0
- package/packages/ui/src/cinematic/system-anatomy.tsx +173 -0
- package/packages/ui/src/code.tsx +119 -0
- package/packages/ui/src/color-picker.tsx +22 -0
- package/packages/ui/src/command-menu.tsx +19 -0
- package/packages/ui/src/contact-page.tsx +19 -0
- package/packages/ui/src/contact-section.tsx +19 -0
- package/packages/ui/src/content-divider.tsx +19 -0
- package/packages/ui/src/content-section.tsx +19 -0
- package/packages/ui/src/context-menu.tsx +208 -0
- package/packages/ui/src/credit-card.tsx +19 -0
- package/packages/ui/src/cta-section.tsx +19 -0
- package/packages/ui/src/data-list.tsx +81 -0
- package/packages/ui/src/date-picker.browser.test.tsx +48 -0
- package/packages/ui/src/date-picker.tsx +248 -0
- package/packages/ui/src/dialog.browser.test.tsx +32 -0
- package/packages/ui/src/dialog.tsx +144 -0
- package/packages/ui/src/direction.tsx +46 -0
- package/packages/ui/src/drawer.tsx +179 -0
- package/packages/ui/src/dropdown.tsx +200 -0
- package/packages/ui/src/email-template.tsx +19 -0
- package/packages/ui/src/empty-state.tsx +43 -0
- package/packages/ui/src/error-state.tsx +44 -0
- package/packages/ui/src/fab.tsx +32 -0
- package/packages/ui/src/faq-page.tsx +19 -0
- package/packages/ui/src/faq-section.tsx +19 -0
- package/packages/ui/src/feature-section.tsx +19 -0
- package/packages/ui/src/featured-icon.tsx +63 -0
- package/packages/ui/src/field.browser.test.tsx +33 -0
- package/packages/ui/src/field.tsx +117 -0
- package/packages/ui/src/file-uploader.tsx +19 -0
- package/packages/ui/src/footer.tsx +19 -0
- package/packages/ui/src/forgot-password-page.tsx +19 -0
- package/packages/ui/src/gradient-picker.tsx +65 -0
- package/packages/ui/src/header-navigation.tsx +71 -0
- package/packages/ui/src/hero-header.tsx +57 -0
- package/packages/ui/src/illustration.tsx +19 -0
- package/packages/ui/src/image-picker.tsx +56 -0
- package/packages/ui/src/index.ts +110 -0
- package/packages/ui/src/informational-page-01.tsx +19 -0
- package/packages/ui/src/informational-page-02.tsx +19 -0
- package/packages/ui/src/inline-cta.tsx +29 -0
- package/packages/ui/src/input.tsx +44 -0
- package/packages/ui/src/landing-page.tsx +56 -0
- package/packages/ui/src/legal-page.tsx +19 -0
- package/packages/ui/src/lib/cn.ts +6 -0
- package/packages/ui/src/lib/i18n-messages.ts +40 -0
- package/packages/ui/src/login-page.tsx +78 -0
- package/packages/ui/src/marketing-404-page.tsx +19 -0
- package/packages/ui/src/marketing-header.tsx +53 -0
- package/packages/ui/src/menu.tsx +220 -0
- package/packages/ui/src/messaging.tsx +62 -0
- package/packages/ui/src/metrics-section.tsx +19 -0
- package/packages/ui/src/mobile-screen.tsx +37 -0
- package/packages/ui/src/multi-select.tsx +16 -0
- package/packages/ui/src/newsletter.tsx +19 -0
- package/packages/ui/src/not-found.tsx +60 -0
- package/packages/ui/src/notification.tsx +19 -0
- package/packages/ui/src/page-header.tsx +80 -0
- package/packages/ui/src/pricing-page.tsx +19 -0
- package/packages/ui/src/pricing-section.tsx +19 -0
- package/packages/ui/src/progress-indicator.tsx +19 -0
- package/packages/ui/src/progress-steps.tsx +85 -0
- package/packages/ui/src/qr-code.tsx +19 -0
- package/packages/ui/src/radio-group.tsx +26 -0
- package/packages/ui/src/rating.tsx +19 -0
- package/packages/ui/src/rich-text-editor.tsx +18 -0
- package/packages/ui/src/section-footer.tsx +19 -0
- package/packages/ui/src/section-header.tsx +37 -0
- package/packages/ui/src/select.tsx +27 -0
- package/packages/ui/src/settings-01.tsx +49 -0
- package/packages/ui/src/settings-02.tsx +58 -0
- package/packages/ui/src/settings-page.tsx +62 -0
- package/packages/ui/src/sidebar-navigation.tsx +77 -0
- package/packages/ui/src/sign-in-form.tsx +60 -0
- package/packages/ui/src/sign-up-page.tsx +19 -0
- package/packages/ui/src/skeleton.tsx +14 -0
- package/packages/ui/src/slider.tsx +13 -0
- package/packages/ui/src/social-button.tsx +19 -0
- package/packages/ui/src/social-proof.tsx +19 -0
- package/packages/ui/src/spinner.tsx +26 -0
- package/packages/ui/src/store-button.tsx +19 -0
- package/packages/ui/src/tabs.browser.test.tsx +33 -0
- package/packages/ui/src/tabs.tsx +175 -0
- package/packages/ui/src/tags.tsx +11 -0
- package/packages/ui/src/team-page.tsx +19 -0
- package/packages/ui/src/team-section.tsx +19 -0
- package/packages/ui/src/testimonial-section.tsx +19 -0
- package/packages/ui/src/textarea.tsx +45 -0
- package/packages/ui/src/theme-provider.browser.test.tsx +90 -0
- package/packages/ui/src/theme-provider.tsx +417 -0
- package/packages/ui/src/theme-toggle.tsx +107 -0
- package/packages/ui/src/toggle.tsx +34 -0
- package/packages/ui/src/tooltip.tsx +50 -0
- package/packages/ui/src/tree-view.tsx +19 -0
- package/packages/ui/src/utility-button.tsx +33 -0
- package/packages/ui/src/utils.ts +13 -0
- package/packages/ui/src/verification-code.tsx +27 -0
- package/packages/ui/src/verification-page.tsx +19 -0
- package/packages/ui/src/video-player.tsx +19 -0
- package/packages/workflow-ui/package.json +15 -0
- package/packages/workflow-ui/src/index.ts +2 -0
- package/packages/workflow-ui/src/workflow-canvas.tsx +51 -0
- package/packages/workflow-ui/src/workflow-node.tsx +61 -0
- package/playwright.config.ts +58 -0
- package/pnpm-workspace.yaml +5 -0
- package/registry.json +216 -0
- package/scripts/build-static.mjs +68 -0
- package/scripts/capture-visuals.py +106 -0
- package/scripts/capture-visuals.sh +10 -0
- package/scripts/create-visual-index.mjs +16 -0
- package/scripts/enrich-registry-payloads.mjs +83 -0
- package/scripts/fix-noe-imports.mjs +134 -0
- package/scripts/fix-registry-closure.mjs +110 -0
- package/scripts/fix-registry-deps-cleanup.mjs +149 -0
- package/scripts/fix-relative-for-registry.mjs +103 -0
- package/scripts/generate-design-tokens.mjs +134 -0
- package/scripts/generate-inventory.mjs +62 -0
- package/scripts/generate-manifest.mjs +1149 -0
- package/scripts/generate-phase4.mjs +875 -0
- package/scripts/validate-manifest.mjs +477 -0
- package/scripts/validate-pngs.mjs +31 -0
- package/scripts/verify-registry-consumer.mjs +319 -0
- package/scripts/verify-registry-dependencies.mjs +162 -0
- package/scripts/verify.mjs +316 -0
- package/tests/catalog-audit.test.mjs +156 -0
- package/tests/e2e/capture-visuals.mjs +34 -0
- package/tests/e2e/catalog-typography.spec.ts +110 -0
- package/tests/e2e/catalog.spec.ts +68 -0
- package/tests/e2e/direction.spec.ts +60 -0
- package/tests/e2e/responsive.spec.ts +30 -0
- package/tests/e2e/surfaces.spec.ts +51 -0
- package/tests/i18n.test.mjs +36 -0
- package/tests/icons.test.mjs +21 -0
- package/tests/registry-publication.test.mjs +88 -0
- package/tests/registry.test.mjs +51 -0
- package/tests/rtl.test.mjs +21 -0
- package/tests/static-app.test.mjs +49 -0
- package/tests/tokens.test.mjs +24 -0
- package/tests/workspace.test.mjs +25 -0
- package/tsconfig.base.json +69 -0
- package/tsconfig.json +27 -0
- package/tsconfig.verify.json +19 -0
- package/types/offline-react.d.ts +73 -0
- package/vitest.config.ts +91 -0
|
@@ -0,0 +1,1149 @@
|
|
|
1
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
|
|
5
|
+
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
6
|
+
const auditPath = path.join(root, 'packages/registry/component-audit.json');
|
|
7
|
+
const manifestPath = path.join(root, 'packages/registry/manifest.json');
|
|
8
|
+
const schemaPath = path.join(root, 'packages/registry/manifest.schema.json');
|
|
9
|
+
|
|
10
|
+
const audit = JSON.parse(await readFile(auditPath, 'utf8'));
|
|
11
|
+
const _schema = JSON.parse(await readFile(schemaPath, 'utf8'));
|
|
12
|
+
|
|
13
|
+
function toExportName(id) {
|
|
14
|
+
const map = {
|
|
15
|
+
'bidi-text': 'BidiText',
|
|
16
|
+
'direction-provider': 'DirectionProvider',
|
|
17
|
+
'code-and-terminal': 'Terminal',
|
|
18
|
+
'icon-system': 'ChevronIcon',
|
|
19
|
+
button: 'Button',
|
|
20
|
+
input: 'Input',
|
|
21
|
+
field: 'Field',
|
|
22
|
+
textarea: 'Textarea',
|
|
23
|
+
card: 'Card',
|
|
24
|
+
alert: 'Alert',
|
|
25
|
+
badge: 'Badge',
|
|
26
|
+
skeleton: 'Skeleton',
|
|
27
|
+
spinner: 'Spinner',
|
|
28
|
+
'empty-state': 'EmptyState',
|
|
29
|
+
'error-state': 'ErrorState',
|
|
30
|
+
dialog: 'Dialog',
|
|
31
|
+
drawer: 'Drawer',
|
|
32
|
+
menu: 'Menu',
|
|
33
|
+
tooltip: 'Tooltip',
|
|
34
|
+
tabs: 'Tabs',
|
|
35
|
+
'data-table': 'DataTable',
|
|
36
|
+
'metric-card': 'MetricCard',
|
|
37
|
+
'chart-frame': 'ChartFrame',
|
|
38
|
+
'agent-composer': 'AgentComposer',
|
|
39
|
+
'agent-message': 'AgentMessage',
|
|
40
|
+
'agent-plan': 'AgentPlan',
|
|
41
|
+
'run-inspector': 'RunInspector',
|
|
42
|
+
'tool-call': 'ToolCall',
|
|
43
|
+
'approval-request': 'ApprovalRequest',
|
|
44
|
+
'workflow-canvas': 'WorkflowCanvas',
|
|
45
|
+
'workflow-node': 'WorkflowNode',
|
|
46
|
+
'page-header': 'PageHeader',
|
|
47
|
+
'sidebar-navigation': 'SidebarNavigation',
|
|
48
|
+
'agent-workspace': 'AgentWorkspace',
|
|
49
|
+
'section-header': 'SectionHeader',
|
|
50
|
+
'filter-bar': 'FilterBar',
|
|
51
|
+
'featured-icon': 'FeaturedIcon',
|
|
52
|
+
'utility-button': 'UtilityButton',
|
|
53
|
+
'context-menu': 'ContextMenu',
|
|
54
|
+
dropdown: 'Dropdown',
|
|
55
|
+
'login-page': 'LoginPage',
|
|
56
|
+
'not-found': 'NotFound',
|
|
57
|
+
chart: 'Chart',
|
|
58
|
+
messaging: 'Messaging',
|
|
59
|
+
'progress-steps': 'ProgressSteps',
|
|
60
|
+
'dashboard-01': 'Dashboard01',
|
|
61
|
+
'dashboard-02': 'Dashboard02',
|
|
62
|
+
'settings-01': 'Settings01',
|
|
63
|
+
'settings-02': 'Settings02',
|
|
64
|
+
'hero-header': 'HeroHeader',
|
|
65
|
+
'marketing-header': 'MarketingHeader',
|
|
66
|
+
'landing-page': 'LandingPage',
|
|
67
|
+
'gradient-picker': 'GradientPicker',
|
|
68
|
+
'image-picker': 'ImagePicker',
|
|
69
|
+
'inline-cta': 'InlineCta',
|
|
70
|
+
pagination: 'Pagination',
|
|
71
|
+
'activity-feed': 'ActivityFeed',
|
|
72
|
+
'sign-in-form': 'SignInForm',
|
|
73
|
+
'header-navigation': 'HeaderNavigation',
|
|
74
|
+
'app-frame': 'AppFrame',
|
|
75
|
+
'bottom-navigation': 'BottomNavigation',
|
|
76
|
+
'dashboard-shell': 'DashboardShell',
|
|
77
|
+
'settings-page': 'SettingsPage',
|
|
78
|
+
'data-list': 'DataList',
|
|
79
|
+
fab: 'Fab',
|
|
80
|
+
'mobile-screen': 'MobileScreen',
|
|
81
|
+
};
|
|
82
|
+
return (
|
|
83
|
+
map[id] ??
|
|
84
|
+
id
|
|
85
|
+
.split('-')
|
|
86
|
+
.map((s) => s[0].toUpperCase() + s.slice(1))
|
|
87
|
+
.join('')
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function toTitle(id) {
|
|
92
|
+
return id
|
|
93
|
+
.split('-')
|
|
94
|
+
.map((w) => w[0].toUpperCase() + w.slice(1))
|
|
95
|
+
.join(' ');
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Enrichment database — semantic, agent-friendly metadata per spec
|
|
99
|
+
const enrichments = {
|
|
100
|
+
'bidi-text': {
|
|
101
|
+
description:
|
|
102
|
+
'Mixed-direction content primitives for user text, URLs, hashes, commands and technical identifiers with explicit LTR isolation.',
|
|
103
|
+
category: 'Foundations / Direction & Bidi',
|
|
104
|
+
capabilityAliases: [
|
|
105
|
+
'bidi text',
|
|
106
|
+
'mixed direction text',
|
|
107
|
+
'technical identifier',
|
|
108
|
+
'bdi auto direction',
|
|
109
|
+
],
|
|
110
|
+
searchTerms: ['bidi', 'rtl ltr isolation', 'technical value', 'url hash', 'command'],
|
|
111
|
+
useWhen: [
|
|
112
|
+
'displaying user-generated mixed Persian/English text',
|
|
113
|
+
'showing URLs, hashes or code inside RTL chrome',
|
|
114
|
+
],
|
|
115
|
+
doNotUseWhen: ['pure LTR marketing copy without bidi risk', 'replacing full i18n provider'],
|
|
116
|
+
alternatives: ['AutoDirectionText', 'TechnicalValue'],
|
|
117
|
+
variants: ['auto', 'bdi', 'technical'],
|
|
118
|
+
maturity: 'stable',
|
|
119
|
+
states: ['default'],
|
|
120
|
+
tokenContracts: ['color.foreground', 'color.border'],
|
|
121
|
+
accessibility: {
|
|
122
|
+
role: undefined,
|
|
123
|
+
keyboard: [],
|
|
124
|
+
announcements: ['no live announcements'],
|
|
125
|
+
focusBehavior: ['not focusable'],
|
|
126
|
+
},
|
|
127
|
+
internationalization: {
|
|
128
|
+
messageKeys: [],
|
|
129
|
+
rtl: 'required',
|
|
130
|
+
bidiNotes: ['Technical values remain dir=ltr', 'User text uses dir=auto and bdi'],
|
|
131
|
+
},
|
|
132
|
+
relatedPatterns: ['code-and-terminal', 'direction-provider'],
|
|
133
|
+
untitledMapping: null,
|
|
134
|
+
},
|
|
135
|
+
'direction-provider': {
|
|
136
|
+
description:
|
|
137
|
+
'Establishes a direction scope for nested content and portalled overlays, independent of page direction.',
|
|
138
|
+
capabilityAliases: ['direction scope', 'portal direction'],
|
|
139
|
+
searchTerms: ['direction provider', 'dir', 'portal', 'rtl scope'],
|
|
140
|
+
useWhen: ['nesting RTL inside LTR or vice versa', 'ensuring portals inherit correct dir'],
|
|
141
|
+
doNotUseWhen: ['page already has correct html dir', 'single-direction app'],
|
|
142
|
+
alternatives: ['html dir attribute'],
|
|
143
|
+
maturity: 'stable',
|
|
144
|
+
tokenContracts: [],
|
|
145
|
+
accessibility: { keyboard: [], announcements: [], focusBehavior: [] },
|
|
146
|
+
internationalization: { rtl: 'required', bidiNotes: ['Portals receive dir explicitly'] },
|
|
147
|
+
},
|
|
148
|
+
button: {
|
|
149
|
+
description:
|
|
150
|
+
'Primary action primitive with semantic variants, focus visibility, loading state and bidirectional layout. Use for all interactive actions.',
|
|
151
|
+
capabilityAliases: [
|
|
152
|
+
'confirmation dialog with destructive action',
|
|
153
|
+
'primary action',
|
|
154
|
+
'submit button',
|
|
155
|
+
'destructive button',
|
|
156
|
+
'loading button',
|
|
157
|
+
'cta',
|
|
158
|
+
],
|
|
159
|
+
searchTerms: ['button', 'cta', 'action', 'destructive', 'confirmation', 'submit'],
|
|
160
|
+
useWhen: [
|
|
161
|
+
'triggering an action',
|
|
162
|
+
'confirming a destructive operation in a dialog',
|
|
163
|
+
'form submission',
|
|
164
|
+
],
|
|
165
|
+
doNotUseWhen: ['navigating to a new page (use link)', 'displaying status (use Badge)'],
|
|
166
|
+
alternatives: ['Link', 'Badge', 'Fab'],
|
|
167
|
+
variants: ['primary', 'secondary', 'outline', 'ghost', 'quiet', 'destructive'],
|
|
168
|
+
sizes: ['sm', 'md', 'lg', 'icon'],
|
|
169
|
+
states: [
|
|
170
|
+
'default',
|
|
171
|
+
'hover',
|
|
172
|
+
'focus-visible',
|
|
173
|
+
'active/pressed',
|
|
174
|
+
'disabled',
|
|
175
|
+
'loading',
|
|
176
|
+
'selected',
|
|
177
|
+
],
|
|
178
|
+
slots: ['icon leading', 'icon trailing'],
|
|
179
|
+
tokenContracts: ['color.accent', 'color.accentHover', 'color.focusRing'],
|
|
180
|
+
accessibility: {
|
|
181
|
+
role: 'button',
|
|
182
|
+
keyboard: ['Space/Enter activates', 'Tab focusable'],
|
|
183
|
+
announcements: [],
|
|
184
|
+
focusBehavior: ['visible ring 2px', 'focus-visible only'],
|
|
185
|
+
},
|
|
186
|
+
internationalization: {
|
|
187
|
+
messageKeys: [],
|
|
188
|
+
rtl: 'required',
|
|
189
|
+
bidiNotes: ['icon gap uses logical gap'],
|
|
190
|
+
},
|
|
191
|
+
relatedPatterns: ['fab', 'approval-request'],
|
|
192
|
+
untitledMapping: {
|
|
193
|
+
category: 'Base',
|
|
194
|
+
family: 'Buttons',
|
|
195
|
+
parity: 'full',
|
|
196
|
+
notes: 'Variants parity full; loading and destructive covered',
|
|
197
|
+
},
|
|
198
|
+
},
|
|
199
|
+
dialog: {
|
|
200
|
+
description:
|
|
201
|
+
'Direction-preserving modal primitive with native focus semantics and portal propagation. Share foundation with Modal/Slideout.',
|
|
202
|
+
capabilityAliases: ['confirmation dialog with destructive action', 'modal', 'confirm dialog'],
|
|
203
|
+
searchTerms: ['dialog', 'modal', 'confirm', 'overlay'],
|
|
204
|
+
useWhen: ['confirming a destructive action', 'focused task requiring dismissal'],
|
|
205
|
+
doNotUseWhen: ['non-modal inline disclosure (use drawer)', 'persistent layout (use page)'],
|
|
206
|
+
alternatives: ['Drawer', 'Alert'],
|
|
207
|
+
variants: ['default'],
|
|
208
|
+
states: ['open/closed', 'focus trap', 'focus restoration'],
|
|
209
|
+
tokenContracts: ['color.overlay', 'shadow.overlay', 'radius.lg'],
|
|
210
|
+
accessibility: {
|
|
211
|
+
role: 'dialog',
|
|
212
|
+
keyboard: ['Esc closes', 'Tab traps', 'Focus restored on close'],
|
|
213
|
+
announcements: ['aria-modal'],
|
|
214
|
+
focusBehavior: ['focus trap', 'initial focus on title', 'restore on close'],
|
|
215
|
+
},
|
|
216
|
+
internationalization: { rtl: 'required', bidiNotes: ['Portal inherits dir'] },
|
|
217
|
+
relatedPatterns: ['drawer', 'approval-request'],
|
|
218
|
+
untitledMapping: {
|
|
219
|
+
category: 'Application UI',
|
|
220
|
+
family: 'Modals',
|
|
221
|
+
parity: 'full',
|
|
222
|
+
notes: 'Full',
|
|
223
|
+
},
|
|
224
|
+
},
|
|
225
|
+
pagination: {
|
|
226
|
+
description:
|
|
227
|
+
'Accessible pagination contract with localized previous/next labels, live status region and disabled boundary states for data tables.',
|
|
228
|
+
capabilityAliases: [
|
|
229
|
+
'responsive metric card pagination',
|
|
230
|
+
'empty data table with filters pagination',
|
|
231
|
+
'table pagination',
|
|
232
|
+
],
|
|
233
|
+
searchTerms: ['pagination', 'page navigation', 'data table paging'],
|
|
234
|
+
useWhen: ['paging through data table results', 'server-side pagination'],
|
|
235
|
+
doNotUseWhen: ['infinite scroll', 'tiny static lists'],
|
|
236
|
+
alternatives: ['FilterBar'],
|
|
237
|
+
variants: ['default'],
|
|
238
|
+
states: ['default', 'disabled', 'canPrevious/canNext'],
|
|
239
|
+
tokenContracts: ['color.border'],
|
|
240
|
+
accessibility: {
|
|
241
|
+
role: 'navigation',
|
|
242
|
+
keyboard: ['Tab to buttons', 'Enter activates'],
|
|
243
|
+
announcements: ['aria-live polite status'],
|
|
244
|
+
focusBehavior: ['visible ring'],
|
|
245
|
+
},
|
|
246
|
+
internationalization: {
|
|
247
|
+
messageKeys: ['pagination.previous', 'pagination.next'],
|
|
248
|
+
rtl: 'required',
|
|
249
|
+
bidiNotes: ['ChevronIcon mirrors via logical direction'],
|
|
250
|
+
},
|
|
251
|
+
relatedPatterns: ['data-table', 'filter-bar'],
|
|
252
|
+
untitledMapping: {
|
|
253
|
+
category: 'Application UI',
|
|
254
|
+
family: 'Paginations',
|
|
255
|
+
parity: 'full',
|
|
256
|
+
notes: 'Full - previous/next with ChevronIcon',
|
|
257
|
+
},
|
|
258
|
+
},
|
|
259
|
+
fab: {
|
|
260
|
+
description:
|
|
261
|
+
'Mobile-only floating action button anchored to logical end edge above bottom navigation with safe-area padding.',
|
|
262
|
+
capabilityAliases: ['floating action button', 'mobile fab', 'quick action'],
|
|
263
|
+
searchTerms: ['fab', 'floating action', 'mobile'],
|
|
264
|
+
useWhen: ['primary mobile action above bottom nav'],
|
|
265
|
+
doNotUseWhen: ['desktop primary action (use Button)', 'multiple FABs per screen'],
|
|
266
|
+
alternatives: ['Button'],
|
|
267
|
+
tokenContracts: ['color.accent'],
|
|
268
|
+
accessibility: {
|
|
269
|
+
role: 'button',
|
|
270
|
+
keyboard: ['Tab', 'Space/Enter'],
|
|
271
|
+
announcements: [],
|
|
272
|
+
focusBehavior: ['visible ring'],
|
|
273
|
+
},
|
|
274
|
+
internationalization: { rtl: 'required', bidiNotes: ['uses logical end'] },
|
|
275
|
+
relatedPatterns: ['bottom-navigation', 'mobile-screen'],
|
|
276
|
+
},
|
|
277
|
+
'featured-icon': {
|
|
278
|
+
description:
|
|
279
|
+
'Decorative icon container with tokenized border, background and size variants for feature highlights, empty states and marketing sections. Not a second icon family — uses @noe/icons.',
|
|
280
|
+
capabilityAliases: [
|
|
281
|
+
'featured icon',
|
|
282
|
+
'feature highlight icon',
|
|
283
|
+
'empty state icon',
|
|
284
|
+
'marketing icon badge',
|
|
285
|
+
],
|
|
286
|
+
searchTerms: ['featured icon', 'highlight', 'empty state', 'marketing'],
|
|
287
|
+
useWhen: ['highlighting a feature or empty state', 'marketing feature sections'],
|
|
288
|
+
doNotUseWhen: ['inline text icon (use ChevronIcon)', 'replacing Button icon slot'],
|
|
289
|
+
alternatives: ['Badge', 'Card'],
|
|
290
|
+
variants: ['brand', 'muted', 'success', 'warning', 'destructive', 'info'],
|
|
291
|
+
sizes: ['sm', 'md', 'lg', 'xl'],
|
|
292
|
+
states: ['default'],
|
|
293
|
+
tokenContracts: ['color.accent', 'color.muted', 'radius.md', 'border', 'icon.size'],
|
|
294
|
+
accessibility: {
|
|
295
|
+
role: undefined,
|
|
296
|
+
keyboard: [],
|
|
297
|
+
announcements: [],
|
|
298
|
+
focusBehavior: ['decorative, aria-hidden when no label'],
|
|
299
|
+
},
|
|
300
|
+
internationalization: {
|
|
301
|
+
rtl: 'not-applicable',
|
|
302
|
+
bidiNotes: ['no directional mirroring; brand icons never mirror'],
|
|
303
|
+
},
|
|
304
|
+
relatedPatterns: ['empty-state', 'card'],
|
|
305
|
+
untitledMapping: {
|
|
306
|
+
category: 'Base',
|
|
307
|
+
family: 'Featured icons',
|
|
308
|
+
parity: 'full',
|
|
309
|
+
notes: 'Size/variant parity full; tokenized',
|
|
310
|
+
},
|
|
311
|
+
},
|
|
312
|
+
'utility-button': {
|
|
313
|
+
description:
|
|
314
|
+
'Compact toolbar/icon button composing canonical Button. For row actions, toolbar utilities and dense controls; not a second Button primitive.',
|
|
315
|
+
capabilityAliases: ['utility button', 'icon button', 'toolbar button', 'row action'],
|
|
316
|
+
searchTerms: ['utility button', 'icon button', 'toolbar', 'ghost button'],
|
|
317
|
+
useWhen: ['toolbar or table row actions', 'dense icon-only controls with tooltip'],
|
|
318
|
+
doNotUseWhen: ['primary form submission', 'destructive confirmation without accessible name'],
|
|
319
|
+
alternatives: ['Button', 'Fab'],
|
|
320
|
+
variants: ['quiet', 'ghost', 'outline', 'secondary'],
|
|
321
|
+
sizes: ['sm', 'md', 'lg', 'icon'],
|
|
322
|
+
states: ['default', 'hover', 'focus-visible', 'disabled'],
|
|
323
|
+
tokenContracts: ['color.foreground', 'color.muted'],
|
|
324
|
+
accessibility: {
|
|
325
|
+
role: 'button',
|
|
326
|
+
keyboard: ['Tab', 'Space/Enter'],
|
|
327
|
+
announcements: [],
|
|
328
|
+
focusBehavior: ['visible ring 2px'],
|
|
329
|
+
},
|
|
330
|
+
internationalization: { rtl: 'required', bidiNotes: ['gap uses logical'] },
|
|
331
|
+
relatedPatterns: ['button', 'fab'],
|
|
332
|
+
untitledMapping: {
|
|
333
|
+
category: 'Base',
|
|
334
|
+
family: 'Utility buttons',
|
|
335
|
+
parity: 'full',
|
|
336
|
+
notes: 'Composes Button; variant parity full',
|
|
337
|
+
},
|
|
338
|
+
},
|
|
339
|
+
'context-menu': {
|
|
340
|
+
description:
|
|
341
|
+
'Right-click and keyboard (Shift+F10) menu using Base UI Menu with logical placement and portal dir propagation. Shares foundation with Dropdown/Menu.',
|
|
342
|
+
capabilityAliases: ['context menu', 'right click menu', 'contextual actions'],
|
|
343
|
+
searchTerms: ['context menu', 'right click', 'contextual'],
|
|
344
|
+
useWhen: [
|
|
345
|
+
'contextual actions on right-click or keyboard menu key',
|
|
346
|
+
'table row or canvas context actions',
|
|
347
|
+
],
|
|
348
|
+
doNotUseWhen: ['primary navigation (use Sidebar/Header)', 'form select (use Select)'],
|
|
349
|
+
alternatives: ['Dropdown', 'Menu'],
|
|
350
|
+
variants: ['default', 'destructive'],
|
|
351
|
+
states: ['open/closed', 'focus trap', 'disabled'],
|
|
352
|
+
tokenContracts: ['color.border', 'shadow.overlay', 'zIndex.overlay'],
|
|
353
|
+
accessibility: {
|
|
354
|
+
role: 'menu',
|
|
355
|
+
keyboard: ['Right-click opens', 'Shift+F10 opens', 'Arrow keys navigate', 'Esc closes'],
|
|
356
|
+
announcements: [],
|
|
357
|
+
focusBehavior: ['focus trap', 'portal dir'],
|
|
358
|
+
},
|
|
359
|
+
internationalization: { rtl: 'required', bidiNotes: ['Portal dir, inline-end placement'] },
|
|
360
|
+
relatedPatterns: ['menu', 'dropdown'],
|
|
361
|
+
untitledMapping: {
|
|
362
|
+
category: 'Base',
|
|
363
|
+
family: 'Context menus',
|
|
364
|
+
parity: 'full',
|
|
365
|
+
notes: 'Full - via Menu foundation',
|
|
366
|
+
},
|
|
367
|
+
},
|
|
368
|
+
dropdown: {
|
|
369
|
+
description:
|
|
370
|
+
'Disclosure menu triggered by button, sharing Menu/Select overlay foundation with logical start alignment. For action lists, not form value selection.',
|
|
371
|
+
capabilityAliases: ['dropdown menu', 'action dropdown', 'menu dropdown'],
|
|
372
|
+
searchTerms: ['dropdown', 'disclosure', 'action menu'],
|
|
373
|
+
useWhen: ['action list triggered by button', 'toolbar overflow menu'],
|
|
374
|
+
doNotUseWhen: ['form value selection (use Select)', 'contextual right-click (use ContextMenu)'],
|
|
375
|
+
alternatives: ['ContextMenu', 'Select', 'Menu'],
|
|
376
|
+
variants: ['default', 'destructive'],
|
|
377
|
+
states: ['open/closed', 'disabled', 'highlighted'],
|
|
378
|
+
tokenContracts: ['color.border', 'shadow.overlay'],
|
|
379
|
+
accessibility: {
|
|
380
|
+
role: 'menu',
|
|
381
|
+
keyboard: ['Enter/Space opens', 'Arrow keys navigate', 'Esc closes'],
|
|
382
|
+
announcements: [],
|
|
383
|
+
focusBehavior: ['portal dir'],
|
|
384
|
+
},
|
|
385
|
+
internationalization: { rtl: 'required', bidiNotes: ['align start logical'] },
|
|
386
|
+
relatedPatterns: ['menu', 'context-menu'],
|
|
387
|
+
untitledMapping: {
|
|
388
|
+
category: 'Base',
|
|
389
|
+
family: 'Dropdowns',
|
|
390
|
+
parity: 'full',
|
|
391
|
+
notes: 'Full - via Menu foundation',
|
|
392
|
+
},
|
|
393
|
+
},
|
|
394
|
+
'login-page': {
|
|
395
|
+
description:
|
|
396
|
+
'Shared authentication page composition with branding, title, form (SignInForm) and footer, responsive two-column layout.',
|
|
397
|
+
capabilityAliases: ['log in page', 'sign in page', 'authentication page', 'shared auth'],
|
|
398
|
+
searchTerms: ['login', 'sign in', 'authentication', 'auth page'],
|
|
399
|
+
useWhen: ['rendering a login page as composition of primitives'],
|
|
400
|
+
doNotUseWhen: ['inline form without page chrome (use SignInForm)'],
|
|
401
|
+
alternatives: ['SignInForm'],
|
|
402
|
+
variants: ['default', 'with aside'],
|
|
403
|
+
states: ['default'],
|
|
404
|
+
tokenContracts: ['color.background', 'color.border', 'shadow.raised'],
|
|
405
|
+
accessibility: {
|
|
406
|
+
role: 'region',
|
|
407
|
+
keyboard: ['Tab to form', 'Enter submits'],
|
|
408
|
+
announcements: [],
|
|
409
|
+
focusBehavior: ['no nested main'],
|
|
410
|
+
},
|
|
411
|
+
internationalization: { rtl: 'required', bidiNotes: ['logical flex', 'aside border-s'] },
|
|
412
|
+
relatedPatterns: ['sign-in-form', 'app-frame'],
|
|
413
|
+
untitledMapping: {
|
|
414
|
+
category: 'Shared pages',
|
|
415
|
+
family: 'Log in pages',
|
|
416
|
+
parity: 'full',
|
|
417
|
+
notes: 'Composes SignInForm',
|
|
418
|
+
},
|
|
419
|
+
},
|
|
420
|
+
'not-found': {
|
|
421
|
+
description:
|
|
422
|
+
'404 not-found section with code, title, description and action, tokenized and RTL-safe.',
|
|
423
|
+
capabilityAliases: ['404 page', 'not found', '404 section'],
|
|
424
|
+
searchTerms: ['404', 'not found', 'empty'],
|
|
425
|
+
useWhen: ['displaying a 404 or missing resource'],
|
|
426
|
+
doNotUseWhen: ['inline empty state (use EmptyState)'],
|
|
427
|
+
alternatives: ['EmptyState', 'ErrorState'],
|
|
428
|
+
variants: ['default'],
|
|
429
|
+
states: ['default'],
|
|
430
|
+
tokenContracts: ['color.foreground', 'color.mutedForeground'],
|
|
431
|
+
accessibility: { role: 'region', keyboard: [], announcements: [], focusBehavior: [] },
|
|
432
|
+
internationalization: { rtl: 'required', bidiNotes: ['code remains ltr'] },
|
|
433
|
+
relatedPatterns: ['empty-state'],
|
|
434
|
+
untitledMapping: {
|
|
435
|
+
category: 'Shared pages',
|
|
436
|
+
family: '404 sections',
|
|
437
|
+
parity: 'full',
|
|
438
|
+
notes: 'Full',
|
|
439
|
+
},
|
|
440
|
+
},
|
|
441
|
+
chart: {
|
|
442
|
+
description:
|
|
443
|
+
'Line and bar chart with tokenized colors, RTL-safe axes, legend and tabular screen-reader fallback.',
|
|
444
|
+
capabilityAliases: ['line and bar charts', 'line chart', 'bar chart', 'data visualization'],
|
|
445
|
+
searchTerms: ['chart', 'line', 'bar', 'visualization'],
|
|
446
|
+
useWhen: ['visualizing time series or categorical data'],
|
|
447
|
+
doNotUseWhen: ['single metric (use MetricCard)', 'complex financial chart (use custom)'],
|
|
448
|
+
alternatives: ['MetricCard', 'ChartFrame'],
|
|
449
|
+
variants: ['line', 'bar'],
|
|
450
|
+
states: ['default', 'empty', 'loading'],
|
|
451
|
+
tokenContracts: ['color.accent', 'color.border'],
|
|
452
|
+
accessibility: {
|
|
453
|
+
role: 'img',
|
|
454
|
+
keyboard: [],
|
|
455
|
+
announcements: ['tabular fallback'],
|
|
456
|
+
focusBehavior: [],
|
|
457
|
+
},
|
|
458
|
+
internationalization: { rtl: 'required', bidiNotes: ['legend uses bdi and logical flex'] },
|
|
459
|
+
relatedPatterns: ['metric-card', 'chart-frame'],
|
|
460
|
+
untitledMapping: {
|
|
461
|
+
category: 'Application components',
|
|
462
|
+
family: 'Line and bar charts',
|
|
463
|
+
parity: 'full',
|
|
464
|
+
notes: 'Full - line/bar with a11y fallback',
|
|
465
|
+
},
|
|
466
|
+
},
|
|
467
|
+
messaging: {
|
|
468
|
+
description:
|
|
469
|
+
'Conversation messaging list with user/assistant variants, timestamps and composer slot, auto-direction and logical layout.',
|
|
470
|
+
capabilityAliases: ['messaging', 'chat', 'conversation'],
|
|
471
|
+
searchTerms: ['messaging', 'chat', 'conversation', 'message list'],
|
|
472
|
+
useWhen: ['displaying a chat or messaging thread'],
|
|
473
|
+
doNotUseWhen: ['single agent message (use AgentMessage)', 'activity feed (use ActivityFeed)'],
|
|
474
|
+
alternatives: ['AgentMessage', 'ActivityFeed'],
|
|
475
|
+
variants: ['user', 'assistant', 'system'],
|
|
476
|
+
states: ['default', 'empty'],
|
|
477
|
+
tokenContracts: ['color.accent', 'color.border'],
|
|
478
|
+
accessibility: {
|
|
479
|
+
role: 'log',
|
|
480
|
+
keyboard: ['Tab to messages'],
|
|
481
|
+
announcements: ['aria-live polite'],
|
|
482
|
+
focusBehavior: [],
|
|
483
|
+
},
|
|
484
|
+
internationalization: {
|
|
485
|
+
rtl: 'required',
|
|
486
|
+
bidiNotes: ['dir=auto for content', 'bdi for author'],
|
|
487
|
+
},
|
|
488
|
+
relatedPatterns: ['agent-message'],
|
|
489
|
+
untitledMapping: {
|
|
490
|
+
category: 'Application components',
|
|
491
|
+
family: 'Messaging',
|
|
492
|
+
parity: 'full',
|
|
493
|
+
notes: 'Full',
|
|
494
|
+
},
|
|
495
|
+
},
|
|
496
|
+
'progress-steps': {
|
|
497
|
+
description:
|
|
498
|
+
'Step indicator with pending/current/completed states, horizontal/vertical orientation, logical layout and non-color encoding.',
|
|
499
|
+
capabilityAliases: ['progress steps', 'stepper', 'progress indicator'],
|
|
500
|
+
searchTerms: ['progress steps', 'stepper', 'steps'],
|
|
501
|
+
useWhen: ['showing multi-step progress'],
|
|
502
|
+
doNotUseWhen: ['single progress bar (use ProgressIndicator)', 'breadcrumb navigation'],
|
|
503
|
+
alternatives: ['Tabs'],
|
|
504
|
+
variants: ['horizontal', 'vertical'],
|
|
505
|
+
states: ['pending', 'current', 'completed'],
|
|
506
|
+
tokenContracts: ['color.accent', 'color.success', 'color.border'],
|
|
507
|
+
accessibility: {
|
|
508
|
+
role: 'list',
|
|
509
|
+
keyboard: ['Tab'],
|
|
510
|
+
announcements: ['aria-current step'],
|
|
511
|
+
focusBehavior: [],
|
|
512
|
+
},
|
|
513
|
+
internationalization: { rtl: 'required', bidiNotes: ['logical flex'] },
|
|
514
|
+
relatedPatterns: ['tabs'],
|
|
515
|
+
untitledMapping: {
|
|
516
|
+
category: 'Application components',
|
|
517
|
+
family: 'Progress steps',
|
|
518
|
+
parity: 'full',
|
|
519
|
+
notes: 'Full',
|
|
520
|
+
},
|
|
521
|
+
},
|
|
522
|
+
'dashboard-01': {
|
|
523
|
+
description:
|
|
524
|
+
'Dashboard example 01 — overview composition with metrics, line chart and table via DashboardShell.',
|
|
525
|
+
capabilityAliases: ['dashboard 01', 'overview dashboard'],
|
|
526
|
+
searchTerms: ['dashboard', 'overview'],
|
|
527
|
+
useWhen: ['example dashboard page'],
|
|
528
|
+
doNotUseWhen: ['custom dashboard needing different layout'],
|
|
529
|
+
alternatives: ['DashboardShell'],
|
|
530
|
+
variants: ['default'],
|
|
531
|
+
states: ['default'],
|
|
532
|
+
tokenContracts: ['color.background'],
|
|
533
|
+
accessibility: { role: 'region', keyboard: [], announcements: [], focusBehavior: [] },
|
|
534
|
+
internationalization: { rtl: 'required', bidiNotes: ['logical grid'] },
|
|
535
|
+
relatedPatterns: ['dashboard-shell', 'metric-card', 'chart'],
|
|
536
|
+
untitledMapping: {
|
|
537
|
+
category: 'Application examples',
|
|
538
|
+
family: 'Dashboard 01',
|
|
539
|
+
parity: 'full',
|
|
540
|
+
notes: 'Example composes primitives',
|
|
541
|
+
},
|
|
542
|
+
},
|
|
543
|
+
'dashboard-02': {
|
|
544
|
+
description:
|
|
545
|
+
'Dashboard example 02 — detailed composition with filters, multiple metrics and bar chart.',
|
|
546
|
+
capabilityAliases: ['dashboard 02', 'detailed dashboard'],
|
|
547
|
+
searchTerms: ['dashboard', 'detailed'],
|
|
548
|
+
useWhen: ['example detailed dashboard'],
|
|
549
|
+
doNotUseWhen: ['custom dashboard needing different layout'],
|
|
550
|
+
alternatives: ['DashboardShell'],
|
|
551
|
+
variants: ['default'],
|
|
552
|
+
states: ['default'],
|
|
553
|
+
tokenContracts: ['color.background'],
|
|
554
|
+
accessibility: { role: 'region', keyboard: [], announcements: [], focusBehavior: [] },
|
|
555
|
+
internationalization: { rtl: 'required', bidiNotes: [] },
|
|
556
|
+
relatedPatterns: ['dashboard-shell'],
|
|
557
|
+
untitledMapping: {
|
|
558
|
+
category: 'Application examples',
|
|
559
|
+
family: 'Dashboard 02',
|
|
560
|
+
parity: 'full',
|
|
561
|
+
notes: 'Example',
|
|
562
|
+
},
|
|
563
|
+
},
|
|
564
|
+
'settings-01': {
|
|
565
|
+
description: 'Settings example 01 — workspace profile with sidebar navigation and save bar.',
|
|
566
|
+
capabilityAliases: ['settings 01', 'workspace settings'],
|
|
567
|
+
searchTerms: ['settings', 'workspace'],
|
|
568
|
+
useWhen: ['example settings page'],
|
|
569
|
+
doNotUseWhen: ['custom settings needing different sections'],
|
|
570
|
+
alternatives: ['SettingsPage'],
|
|
571
|
+
variants: ['default'],
|
|
572
|
+
states: ['default'],
|
|
573
|
+
tokenContracts: [],
|
|
574
|
+
accessibility: { role: 'region', keyboard: [], announcements: [], focusBehavior: [] },
|
|
575
|
+
internationalization: { rtl: 'required', bidiNotes: [] },
|
|
576
|
+
relatedPatterns: ['settings-page', 'sidebar-navigation'],
|
|
577
|
+
untitledMapping: {
|
|
578
|
+
category: 'Application examples',
|
|
579
|
+
family: 'Settings 01',
|
|
580
|
+
parity: 'full',
|
|
581
|
+
notes: 'Example',
|
|
582
|
+
},
|
|
583
|
+
},
|
|
584
|
+
'settings-02': {
|
|
585
|
+
description: 'Settings example 02 — team and billing with multiple sections.',
|
|
586
|
+
capabilityAliases: ['settings 02', 'team settings'],
|
|
587
|
+
searchTerms: ['settings', 'team'],
|
|
588
|
+
useWhen: ['example team settings'],
|
|
589
|
+
doNotUseWhen: ['custom settings needing different sections'],
|
|
590
|
+
alternatives: ['SettingsPage'],
|
|
591
|
+
variants: ['default'],
|
|
592
|
+
states: ['default'],
|
|
593
|
+
tokenContracts: [],
|
|
594
|
+
accessibility: { role: 'region', keyboard: [], announcements: [], focusBehavior: [] },
|
|
595
|
+
internationalization: { rtl: 'required', bidiNotes: [] },
|
|
596
|
+
relatedPatterns: ['settings-page'],
|
|
597
|
+
untitledMapping: {
|
|
598
|
+
category: 'Application examples',
|
|
599
|
+
family: 'Settings 02',
|
|
600
|
+
parity: 'full',
|
|
601
|
+
notes: 'Example',
|
|
602
|
+
},
|
|
603
|
+
},
|
|
604
|
+
'hero-header': {
|
|
605
|
+
description:
|
|
606
|
+
'Marketing hero header section with eyebrow, title, description, actions and media slot, content-driven and RTL-safe.',
|
|
607
|
+
capabilityAliases: ['hero header section', 'marketing hero', 'hero'],
|
|
608
|
+
searchTerms: ['hero', 'header', 'marketing'],
|
|
609
|
+
useWhen: ['marketing hero section'],
|
|
610
|
+
doNotUseWhen: ['app page header (use PageHeader)'],
|
|
611
|
+
alternatives: ['PageHeader', 'SectionHeader'],
|
|
612
|
+
variants: ['default', 'with media'],
|
|
613
|
+
states: ['default'],
|
|
614
|
+
tokenContracts: ['color.foreground', 'color.mutedForeground'],
|
|
615
|
+
accessibility: { role: 'region', keyboard: [], announcements: [], focusBehavior: [] },
|
|
616
|
+
internationalization: { rtl: 'required', bidiNotes: ['logical flex'] },
|
|
617
|
+
relatedPatterns: ['landing-page'],
|
|
618
|
+
untitledMapping: {
|
|
619
|
+
category: 'Marketing components',
|
|
620
|
+
family: 'Hero header sections',
|
|
621
|
+
parity: 'full',
|
|
622
|
+
notes: 'Full',
|
|
623
|
+
},
|
|
624
|
+
},
|
|
625
|
+
'marketing-header': {
|
|
626
|
+
description:
|
|
627
|
+
'Marketing header navigation with brand, links and actions, distinct from application header.',
|
|
628
|
+
capabilityAliases: ['marketing header navigation', 'marketing header'],
|
|
629
|
+
searchTerms: ['marketing header', 'navigation'],
|
|
630
|
+
useWhen: ['top marketing header'],
|
|
631
|
+
doNotUseWhen: ['app header (use HeaderNavigation)'],
|
|
632
|
+
alternatives: ['HeaderNavigation'],
|
|
633
|
+
variants: ['default'],
|
|
634
|
+
states: ['default'],
|
|
635
|
+
tokenContracts: ['color.border'],
|
|
636
|
+
accessibility: { role: 'banner', keyboard: ['Tab'], announcements: [], focusBehavior: [] },
|
|
637
|
+
internationalization: { rtl: 'required', bidiNotes: ['logical gap'] },
|
|
638
|
+
relatedPatterns: ['header-navigation'],
|
|
639
|
+
untitledMapping: {
|
|
640
|
+
category: 'Marketing components',
|
|
641
|
+
family: 'Header navigation',
|
|
642
|
+
parity: 'full',
|
|
643
|
+
notes: 'Marketing variant full',
|
|
644
|
+
},
|
|
645
|
+
},
|
|
646
|
+
'landing-page': {
|
|
647
|
+
description:
|
|
648
|
+
'Marketing landing page composition from MarketingHeader, HeroHeader and sections; no hidden primitives.',
|
|
649
|
+
capabilityAliases: ['landing page', 'marketing landing', 'marketing 404'],
|
|
650
|
+
searchTerms: ['landing', 'marketing', 'page'],
|
|
651
|
+
useWhen: ['marketing landing page'],
|
|
652
|
+
doNotUseWhen: ['app dashboard (use DashboardShell)'],
|
|
653
|
+
alternatives: ['MarketingHeader', 'HeroHeader'],
|
|
654
|
+
variants: ['default'],
|
|
655
|
+
states: ['default'],
|
|
656
|
+
tokenContracts: ['color.background'],
|
|
657
|
+
accessibility: { role: 'main', keyboard: [], announcements: [], focusBehavior: [] },
|
|
658
|
+
internationalization: { rtl: 'required', bidiNotes: [] },
|
|
659
|
+
relatedPatterns: ['hero-header', 'marketing-header'],
|
|
660
|
+
untitledMapping: {
|
|
661
|
+
category: 'Marketing examples',
|
|
662
|
+
family: 'Landing pages',
|
|
663
|
+
parity: 'full',
|
|
664
|
+
notes: 'Example composes sections',
|
|
665
|
+
},
|
|
666
|
+
},
|
|
667
|
+
|
|
668
|
+
'gradient-picker': {
|
|
669
|
+
description:
|
|
670
|
+
'Gradient picker with two color stops and CSS output, tokenized and accessible, distinct from ColorPicker.',
|
|
671
|
+
capabilityAliases: ['gradient picker', 'gradient', 'linear gradient'],
|
|
672
|
+
searchTerms: ['gradient', 'picker', 'color'],
|
|
673
|
+
useWhen: ['selecting a linear gradient'],
|
|
674
|
+
doNotUseWhen: ['single color (use ColorPicker)'],
|
|
675
|
+
alternatives: ['ColorPicker'],
|
|
676
|
+
variants: ['default'],
|
|
677
|
+
states: ['default'],
|
|
678
|
+
tokenContracts: ['color.border'],
|
|
679
|
+
accessibility: {
|
|
680
|
+
role: 'group',
|
|
681
|
+
keyboard: ['Tab to inputs'],
|
|
682
|
+
announcements: [],
|
|
683
|
+
focusBehavior: [],
|
|
684
|
+
},
|
|
685
|
+
internationalization: { rtl: 'required', bidiNotes: [] },
|
|
686
|
+
relatedPatterns: ['color-picker'],
|
|
687
|
+
untitledMapping: {
|
|
688
|
+
category: 'Application components',
|
|
689
|
+
family: 'Gradient pickers',
|
|
690
|
+
parity: 'full',
|
|
691
|
+
notes: 'Full',
|
|
692
|
+
},
|
|
693
|
+
},
|
|
694
|
+
'image-picker': {
|
|
695
|
+
description:
|
|
696
|
+
'Image picker with preview, drag and file input, tokenized and RTL-safe, distinct from FileUploader.',
|
|
697
|
+
capabilityAliases: ['image picker', 'image select', 'image upload'],
|
|
698
|
+
searchTerms: ['image', 'picker', 'upload'],
|
|
699
|
+
useWhen: ['selecting an image with preview'],
|
|
700
|
+
doNotUseWhen: ['generic file (use FileUploader)'],
|
|
701
|
+
alternatives: ['FileUploader'],
|
|
702
|
+
variants: ['default'],
|
|
703
|
+
states: ['default', 'with preview'],
|
|
704
|
+
tokenContracts: ['color.border'],
|
|
705
|
+
accessibility: {
|
|
706
|
+
role: 'group',
|
|
707
|
+
keyboard: ['Tab to input'],
|
|
708
|
+
announcements: [],
|
|
709
|
+
focusBehavior: [],
|
|
710
|
+
},
|
|
711
|
+
internationalization: { rtl: 'required', bidiNotes: [] },
|
|
712
|
+
relatedPatterns: ['file-uploader'],
|
|
713
|
+
untitledMapping: {
|
|
714
|
+
category: 'Application components',
|
|
715
|
+
family: 'Image pickers',
|
|
716
|
+
parity: 'full',
|
|
717
|
+
notes: 'Full',
|
|
718
|
+
},
|
|
719
|
+
},
|
|
720
|
+
'inline-cta': {
|
|
721
|
+
description:
|
|
722
|
+
'Inline call to action link with trailing logical chevron, tokenized, for use within prose.',
|
|
723
|
+
capabilityAliases: ['inline cta', 'inline call to action', 'text link cta'],
|
|
724
|
+
searchTerms: ['inline cta', 'cta', 'link'],
|
|
725
|
+
useWhen: ['inline CTA within prose or card'],
|
|
726
|
+
doNotUseWhen: ['block CTA (use CTA Section)', 'primary button (use Button)'],
|
|
727
|
+
alternatives: ['Button', 'CtaSection'],
|
|
728
|
+
variants: ['primary', 'secondary'],
|
|
729
|
+
states: ['default', 'hover', 'focus-visible'],
|
|
730
|
+
tokenContracts: ['color.accent'],
|
|
731
|
+
accessibility: {
|
|
732
|
+
role: 'link',
|
|
733
|
+
keyboard: ['Tab', 'Enter'],
|
|
734
|
+
announcements: [],
|
|
735
|
+
focusBehavior: ['visible ring'],
|
|
736
|
+
},
|
|
737
|
+
internationalization: { rtl: 'required', bidiNotes: ['chevron mirrors'] },
|
|
738
|
+
relatedPatterns: ['cta-section'],
|
|
739
|
+
untitledMapping: {
|
|
740
|
+
category: 'Application components',
|
|
741
|
+
family: 'Inline CTAs',
|
|
742
|
+
parity: 'full',
|
|
743
|
+
notes: 'Full',
|
|
744
|
+
},
|
|
745
|
+
},
|
|
746
|
+
};
|
|
747
|
+
|
|
748
|
+
// Default generator for entries without explicit enrichment
|
|
749
|
+
function defaultEnrichment(auditItem) {
|
|
750
|
+
const base = enrichments[auditItem.id] || {};
|
|
751
|
+
const title = toTitle(auditItem.id);
|
|
752
|
+
const exportName = toExportName(auditItem.id);
|
|
753
|
+
const category = auditItem.category;
|
|
754
|
+
const pkg = auditItem.package;
|
|
755
|
+
|
|
756
|
+
// Derive dependencies
|
|
757
|
+
const deps = [];
|
|
758
|
+
const registryDeps = [];
|
|
759
|
+
const peerDeps = ['react'];
|
|
760
|
+
if (pkg === '@noe/data-ui') deps.push('@noe/ui');
|
|
761
|
+
if (pkg === '@noe/ai-ui') deps.push('@noe/ui');
|
|
762
|
+
if (pkg === '@noe/workflow-ui') deps.push('@noe/ui');
|
|
763
|
+
if (auditItem.id === 'pagination' || auditItem.id === 'fab' || auditItem.id === 'filter-bar')
|
|
764
|
+
deps.push('@noe/icons');
|
|
765
|
+
if (auditItem.id === 'filter-bar') registryDeps.push('input');
|
|
766
|
+
// Hard-coded icon consumers discovered via audit (calendar, inline-cta, date-picker)
|
|
767
|
+
if (auditItem.id === 'calendar' || auditItem.id === 'inline-cta' || auditItem.id === 'date-picker') {
|
|
768
|
+
if (!deps.includes('@noe/icons')) deps.push('@noe/icons');
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
// Variants/sizes/states defaults
|
|
772
|
+
const variants = base.variants ?? ['default'];
|
|
773
|
+
const sizes = base.sizes ?? [];
|
|
774
|
+
const slots = base.slots ?? [];
|
|
775
|
+
const states = base.states ?? ['default', 'hover', 'focus-visible', 'disabled'];
|
|
776
|
+
const tokenContracts = base.tokenContracts ?? ['color.foreground', 'color.border'];
|
|
777
|
+
|
|
778
|
+
const description =
|
|
779
|
+
base.description ??
|
|
780
|
+
`${title} — ${category} component. ${auditItem.id} provides ${category.toLowerCase()} behavior with RTL, i18n and accessibility built-in.`;
|
|
781
|
+
|
|
782
|
+
return {
|
|
783
|
+
id: auditItem.id,
|
|
784
|
+
package: pkg,
|
|
785
|
+
exportName,
|
|
786
|
+
title,
|
|
787
|
+
status: auditItem.status === 'in-progress' ? 'experimental' : auditItem.status, // map legacy
|
|
788
|
+
maturity: base.maturity ?? 'beta',
|
|
789
|
+
category,
|
|
790
|
+
description,
|
|
791
|
+
capabilityAliases: base.capabilityAliases ?? [title.toLowerCase(), auditItem.id],
|
|
792
|
+
searchTerms: base.searchTerms ?? [
|
|
793
|
+
auditItem.id,
|
|
794
|
+
title.toLowerCase(),
|
|
795
|
+
category.toLowerCase().split(' / ').pop(),
|
|
796
|
+
],
|
|
797
|
+
useWhen: base.useWhen ?? [`using ${title.toLowerCase()} in ${category}`],
|
|
798
|
+
doNotUseWhen: base.doNotUseWhen ?? [`when ${title.toLowerCase()} semantics do not match`],
|
|
799
|
+
alternatives: base.alternatives ?? [],
|
|
800
|
+
dependencies: deps,
|
|
801
|
+
registryDependencies: registryDeps,
|
|
802
|
+
peerDependencies: peerDeps,
|
|
803
|
+
propsSummary: { label: 'string | ReactNode', children: 'ReactNode' },
|
|
804
|
+
variants,
|
|
805
|
+
sizes,
|
|
806
|
+
slots,
|
|
807
|
+
states,
|
|
808
|
+
tokenContracts,
|
|
809
|
+
accessibility: {
|
|
810
|
+
role: base.accessibility?.role,
|
|
811
|
+
keyboard: base.accessibility?.keyboard ?? ['Tab to focus', 'Enter/Space activate'],
|
|
812
|
+
announcements: base.accessibility?.announcements ?? [],
|
|
813
|
+
focusBehavior: base.accessibility?.focusBehavior ?? ['visible ring 2px'],
|
|
814
|
+
},
|
|
815
|
+
internationalization: {
|
|
816
|
+
messageKeys: base.internationalization?.messageKeys ?? [],
|
|
817
|
+
rtl: base.internationalization?.rtl ?? 'required',
|
|
818
|
+
bidiNotes: base.internationalization?.bidiNotes ?? ['logical properties', 'no global mirror'],
|
|
819
|
+
},
|
|
820
|
+
examples: [
|
|
821
|
+
{
|
|
822
|
+
id: `${auditItem.id}--default`,
|
|
823
|
+
description: `Default ${title} usage`,
|
|
824
|
+
files: [`apps/storybook/stories/catalog/${auditItem.id}.stories.tsx`],
|
|
825
|
+
},
|
|
826
|
+
],
|
|
827
|
+
relatedPatterns: base.relatedPatterns ?? [],
|
|
828
|
+
untitledMapping: base.untitledMapping ?? null,
|
|
829
|
+
storyId: auditItem.storyId,
|
|
830
|
+
registryItem: auditItem.registryItem,
|
|
831
|
+
};
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
const manifest = {
|
|
835
|
+
manifestVersion: '1.0.0',
|
|
836
|
+
generatedAt: new Date().toISOString(),
|
|
837
|
+
generatedNote:
|
|
838
|
+
'Canonical NOE manifest — single source of truth for catalog, audit, registry, stories, docs and agent search. Generated by pnpm gen:manifest; do not edit by hand for automated fields.',
|
|
839
|
+
items: audit.items.map(defaultEnrichment),
|
|
840
|
+
};
|
|
841
|
+
|
|
842
|
+
// Also include cinematic items that are in catalogEntries but not yet in audit?
|
|
843
|
+
const cinematicEnrichments = [
|
|
844
|
+
{
|
|
845
|
+
id: 'ecosystem-sphere',
|
|
846
|
+
package: '@noe/ui',
|
|
847
|
+
exportName: 'EcosystemSphere',
|
|
848
|
+
title: 'Ecosystem Sphere',
|
|
849
|
+
status: 'experimental',
|
|
850
|
+
maturity: 'beta',
|
|
851
|
+
category: 'Cinematic / 3D System',
|
|
852
|
+
description:
|
|
853
|
+
'Interactive 3-D galaxy canvas with fixed core and orbiting capability nodes. Respects reduced-motion, pauses when hidden, keyboard accessible.',
|
|
854
|
+
capabilityAliases: ['3d sphere', 'ecosystem galaxy'],
|
|
855
|
+
searchTerms: ['ecosystem', 'sphere', 'canvas', '3d'],
|
|
856
|
+
useWhen: ['landing hero 3d visualization'],
|
|
857
|
+
doNotUseWhen: ['data tables', 'forms'],
|
|
858
|
+
alternatives: [],
|
|
859
|
+
dependencies: [],
|
|
860
|
+
registryDependencies: [],
|
|
861
|
+
peerDependencies: ['react'],
|
|
862
|
+
propsSummary: { nodes: 'PortfolioNode[]', ariaLabel: 'string' },
|
|
863
|
+
variants: ['default'],
|
|
864
|
+
sizes: [],
|
|
865
|
+
slots: [],
|
|
866
|
+
states: ['default', 'hover', 'focus-visible', 'reduced-motion'],
|
|
867
|
+
tokenContracts: ['color.background'],
|
|
868
|
+
accessibility: {
|
|
869
|
+
keyboard: ['Arrow keys navigate', 'Tab focusable canvas'],
|
|
870
|
+
announcements: [],
|
|
871
|
+
focusBehavior: ['focus ring on canvas'],
|
|
872
|
+
},
|
|
873
|
+
internationalization: { messageKeys: [], rtl: 'required', bidiNotes: ['canvas logical'] },
|
|
874
|
+
examples: [
|
|
875
|
+
{
|
|
876
|
+
id: 'ecosystem-sphere--default',
|
|
877
|
+
description: 'Default sphere',
|
|
878
|
+
files: ['packages/ui/src/cinematic/ecosystem-sphere.tsx'],
|
|
879
|
+
},
|
|
880
|
+
],
|
|
881
|
+
relatedPatterns: ['system-anatomy'],
|
|
882
|
+
untitledMapping: null,
|
|
883
|
+
storyId: null,
|
|
884
|
+
registryItem: 'ecosystem-sphere',
|
|
885
|
+
},
|
|
886
|
+
{
|
|
887
|
+
id: 'system-anatomy',
|
|
888
|
+
package: '@noe/ui',
|
|
889
|
+
exportName: 'SystemAnatomy',
|
|
890
|
+
title: 'System Anatomy',
|
|
891
|
+
status: 'experimental',
|
|
892
|
+
maturity: 'beta',
|
|
893
|
+
category: 'Cinematic / 3D System',
|
|
894
|
+
description:
|
|
895
|
+
'Scroll-scrubbed exploded view (Foundation/Orchestration/Experience) with sticky canvas.',
|
|
896
|
+
capabilityAliases: ['system anatomy', 'exploded view'],
|
|
897
|
+
searchTerms: ['anatomy', 'scroll'],
|
|
898
|
+
useWhen: ['landing storytelling'],
|
|
899
|
+
doNotUseWhen: ['forms'],
|
|
900
|
+
alternatives: [],
|
|
901
|
+
dependencies: [],
|
|
902
|
+
registryDependencies: [],
|
|
903
|
+
peerDependencies: ['react'],
|
|
904
|
+
propsSummary: {},
|
|
905
|
+
variants: ['default'],
|
|
906
|
+
sizes: [],
|
|
907
|
+
slots: [],
|
|
908
|
+
states: ['default', 'reduced-motion'],
|
|
909
|
+
tokenContracts: [],
|
|
910
|
+
accessibility: { keyboard: [], announcements: [], focusBehavior: [] },
|
|
911
|
+
internationalization: { messageKeys: [], rtl: 'required', bidiNotes: [] },
|
|
912
|
+
examples: [
|
|
913
|
+
{
|
|
914
|
+
id: 'system-anatomy--default',
|
|
915
|
+
description: 'Default',
|
|
916
|
+
files: ['packages/ui/src/cinematic/system-anatomy.tsx'],
|
|
917
|
+
},
|
|
918
|
+
],
|
|
919
|
+
relatedPatterns: ['ecosystem-motion-showcase'],
|
|
920
|
+
untitledMapping: null,
|
|
921
|
+
storyId: null,
|
|
922
|
+
registryItem: 'system-anatomy',
|
|
923
|
+
},
|
|
924
|
+
{
|
|
925
|
+
id: 'ecosystem-motion-showcase',
|
|
926
|
+
package: '@noe/ui',
|
|
927
|
+
exportName: 'EcosystemMotionShowcase',
|
|
928
|
+
title: 'Ecosystem Motion Showcase',
|
|
929
|
+
status: 'experimental',
|
|
930
|
+
maturity: 'beta',
|
|
931
|
+
category: 'Cinematic / 3D System',
|
|
932
|
+
description: 'Three-principle continuous scroll narrative with sticky stage.',
|
|
933
|
+
capabilityAliases: ['motion showcase'],
|
|
934
|
+
searchTerms: ['motion', 'showcase'],
|
|
935
|
+
useWhen: ['landing'],
|
|
936
|
+
doNotUseWhen: ['data tables or forms'],
|
|
937
|
+
alternatives: [],
|
|
938
|
+
dependencies: [],
|
|
939
|
+
registryDependencies: [],
|
|
940
|
+
peerDependencies: ['react'],
|
|
941
|
+
propsSummary: {},
|
|
942
|
+
variants: ['default'],
|
|
943
|
+
sizes: [],
|
|
944
|
+
slots: [],
|
|
945
|
+
states: ['default', 'reduced-motion'],
|
|
946
|
+
tokenContracts: [],
|
|
947
|
+
accessibility: { keyboard: [], announcements: [], focusBehavior: [] },
|
|
948
|
+
internationalization: { messageKeys: [], rtl: 'required', bidiNotes: [] },
|
|
949
|
+
examples: [
|
|
950
|
+
{
|
|
951
|
+
id: 'ecosystem-motion-showcase--default',
|
|
952
|
+
description: 'Default',
|
|
953
|
+
files: ['packages/ui/src/cinematic/ecosystem-motion-showcase.tsx'],
|
|
954
|
+
},
|
|
955
|
+
],
|
|
956
|
+
relatedPatterns: [],
|
|
957
|
+
untitledMapping: null,
|
|
958
|
+
storyId: null,
|
|
959
|
+
registryItem: 'ecosystem-motion-showcase',
|
|
960
|
+
},
|
|
961
|
+
{
|
|
962
|
+
id: 'kinetic-experience',
|
|
963
|
+
package: '@noe/ui',
|
|
964
|
+
exportName: 'KineticExperience',
|
|
965
|
+
title: 'Kinetic Experience',
|
|
966
|
+
status: 'experimental',
|
|
967
|
+
maturity: 'beta',
|
|
968
|
+
category: 'Cinematic / Motion',
|
|
969
|
+
description:
|
|
970
|
+
'Fixed horizontal chapter timeline + scroll progress. IntersectionObserver active chapter.',
|
|
971
|
+
capabilityAliases: ['kinetic timeline'],
|
|
972
|
+
searchTerms: ['kinetic', 'timeline'],
|
|
973
|
+
useWhen: ['landing timeline'],
|
|
974
|
+
doNotUseWhen: ['data tables or forms'],
|
|
975
|
+
alternatives: [],
|
|
976
|
+
dependencies: [],
|
|
977
|
+
registryDependencies: [],
|
|
978
|
+
peerDependencies: ['react'],
|
|
979
|
+
propsSummary: { sections: 'KineticSection[]' },
|
|
980
|
+
variants: ['default'],
|
|
981
|
+
sizes: [],
|
|
982
|
+
slots: [],
|
|
983
|
+
states: ['default', 'reduced-motion'],
|
|
984
|
+
tokenContracts: [],
|
|
985
|
+
accessibility: { keyboard: [], announcements: [], focusBehavior: [] },
|
|
986
|
+
internationalization: { messageKeys: [], rtl: 'required', bidiNotes: [] },
|
|
987
|
+
examples: [
|
|
988
|
+
{
|
|
989
|
+
id: 'kinetic-experience--default',
|
|
990
|
+
description: 'Default',
|
|
991
|
+
files: ['packages/ui/src/cinematic/kinetic-experience.tsx'],
|
|
992
|
+
},
|
|
993
|
+
],
|
|
994
|
+
relatedPatterns: [],
|
|
995
|
+
untitledMapping: null,
|
|
996
|
+
storyId: null,
|
|
997
|
+
registryItem: 'kinetic-experience',
|
|
998
|
+
},
|
|
999
|
+
{
|
|
1000
|
+
id: 'landing-cinematic',
|
|
1001
|
+
package: '@noe/ui',
|
|
1002
|
+
exportName: 'LandingCinematic',
|
|
1003
|
+
title: 'Landing — Cinematic System',
|
|
1004
|
+
status: 'experimental',
|
|
1005
|
+
maturity: 'beta',
|
|
1006
|
+
category: 'Cinematic / Pages',
|
|
1007
|
+
description:
|
|
1008
|
+
'Full landing composition combining hero reactor, SystemAnatomy, EcosystemMotionShowcase and KineticExperience.',
|
|
1009
|
+
capabilityAliases: ['landing'],
|
|
1010
|
+
searchTerms: ['landing', 'cinematic'],
|
|
1011
|
+
useWhen: ['marketing landing'],
|
|
1012
|
+
doNotUseWhen: ['data tables or forms'],
|
|
1013
|
+
alternatives: [],
|
|
1014
|
+
dependencies: [],
|
|
1015
|
+
registryDependencies: [],
|
|
1016
|
+
peerDependencies: ['react'],
|
|
1017
|
+
propsSummary: {},
|
|
1018
|
+
variants: ['default'],
|
|
1019
|
+
sizes: [],
|
|
1020
|
+
slots: [],
|
|
1021
|
+
states: ['default', 'reduced-motion'],
|
|
1022
|
+
tokenContracts: [],
|
|
1023
|
+
accessibility: { keyboard: [], announcements: [], focusBehavior: [] },
|
|
1024
|
+
internationalization: { messageKeys: [], rtl: 'required', bidiNotes: [] },
|
|
1025
|
+
examples: [
|
|
1026
|
+
{
|
|
1027
|
+
id: 'landing-cinematic--default',
|
|
1028
|
+
description: 'Default',
|
|
1029
|
+
files: ['apps/showcase/src/catalog/catalog-index.tsx'],
|
|
1030
|
+
},
|
|
1031
|
+
],
|
|
1032
|
+
relatedPatterns: [],
|
|
1033
|
+
untitledMapping: null,
|
|
1034
|
+
storyId: null,
|
|
1035
|
+
registryItem: 'landing-cinematic',
|
|
1036
|
+
},
|
|
1037
|
+
];
|
|
1038
|
+
|
|
1039
|
+
// Merge cinematic if not already in audit (they currently are not in component-audit)
|
|
1040
|
+
for (const item of cinematicEnrichments) {
|
|
1041
|
+
if (!manifest.items.find((i) => i.id === item.id)) manifest.items.push(item);
|
|
1042
|
+
}
|
|
1043
|
+
|
|
1044
|
+
await writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`);
|
|
1045
|
+
console.log(`manifest.json written: ${manifest.items.length} items`);
|
|
1046
|
+
|
|
1047
|
+
// Also generate derived files for backward compat
|
|
1048
|
+
// 1. Update component-audit.json to be derived (keep minimal fields but now from manifest)
|
|
1049
|
+
const auditDerived = {
|
|
1050
|
+
$schema: audit.$schema,
|
|
1051
|
+
generatedNote: `${audit.generatedNote} (derived from manifest.json)`,
|
|
1052
|
+
items: manifest.items
|
|
1053
|
+
.filter((i) => !i.category.startsWith('Cinematic'))
|
|
1054
|
+
.map((i) => ({
|
|
1055
|
+
id: i.id,
|
|
1056
|
+
package: i.package,
|
|
1057
|
+
category: i.category,
|
|
1058
|
+
status: i.status === 'experimental' ? 'in-progress' : i.status, // legacy map back
|
|
1059
|
+
storyId: i.storyId,
|
|
1060
|
+
registryItem: i.registryItem,
|
|
1061
|
+
})),
|
|
1062
|
+
};
|
|
1063
|
+
await writeFile(auditPath, `${JSON.stringify(auditDerived, null, 2)}\n`);
|
|
1064
|
+
console.log(`component-audit.json derived: ${auditDerived.items.length} items`);
|
|
1065
|
+
|
|
1066
|
+
// 2. Generate search index
|
|
1067
|
+
const searchIndex = manifest.items.map((i) => ({
|
|
1068
|
+
id: i.id,
|
|
1069
|
+
package: i.package,
|
|
1070
|
+
title: i.title,
|
|
1071
|
+
description: i.description,
|
|
1072
|
+
category: i.category,
|
|
1073
|
+
status: i.status,
|
|
1074
|
+
capabilityAliases: i.capabilityAliases,
|
|
1075
|
+
searchTerms: i.searchTerms,
|
|
1076
|
+
useWhen: i.useWhen,
|
|
1077
|
+
doNotUseWhen: i.doNotUseWhen,
|
|
1078
|
+
alternatives: i.alternatives,
|
|
1079
|
+
relatedPatterns: i.relatedPatterns,
|
|
1080
|
+
exportName: i.exportName,
|
|
1081
|
+
registryItem: i.registryItem,
|
|
1082
|
+
maturity: i.maturity,
|
|
1083
|
+
}));
|
|
1084
|
+
await writeFile(
|
|
1085
|
+
path.join(root, 'packages/registry/search-index.json'),
|
|
1086
|
+
`${JSON.stringify({ generatedAt: new Date().toISOString(), items: searchIndex }, null, 2)}\n`,
|
|
1087
|
+
);
|
|
1088
|
+
console.log(`search-index.json written`);
|
|
1089
|
+
|
|
1090
|
+
// 3. Generate registry index (enriched)
|
|
1091
|
+
const registryPath = path.join(root, 'packages/registry/registry.json');
|
|
1092
|
+
const registry = JSON.parse(await readFile(registryPath, 'utf8'));
|
|
1093
|
+
// Enrich registry items with dependencies from manifest
|
|
1094
|
+
for (const item of registry.items) {
|
|
1095
|
+
const m = manifest.items.find((x) => x.registryItem === item.name);
|
|
1096
|
+
if (m) {
|
|
1097
|
+
if (m.dependencies.length) item.dependencies = m.dependencies;
|
|
1098
|
+
if (m.registryDependencies.length) item.registryDependencies = m.registryDependencies;
|
|
1099
|
+
if (m.peerDependencies.length) item.peerDependencies = m.peerDependencies;
|
|
1100
|
+
// Add metadata for agent
|
|
1101
|
+
item.manifestId = m.id;
|
|
1102
|
+
item.capabilityAliases = m.capabilityAliases;
|
|
1103
|
+
item.searchTerms = m.searchTerms;
|
|
1104
|
+
}
|
|
1105
|
+
}
|
|
1106
|
+
await writeFile(registryPath, `${JSON.stringify(registry, null, 2)}\n`);
|
|
1107
|
+
console.log(`registry.json enriched`);
|
|
1108
|
+
|
|
1109
|
+
// 4. Generate catalog index (JSON for agents)
|
|
1110
|
+
await writeFile(
|
|
1111
|
+
path.join(root, 'packages/registry/catalog-index.json'),
|
|
1112
|
+
`${JSON.stringify(
|
|
1113
|
+
{
|
|
1114
|
+
generatedAt: new Date().toISOString(),
|
|
1115
|
+
items: manifest.items.map((i) => ({
|
|
1116
|
+
id: i.id,
|
|
1117
|
+
title: i.title,
|
|
1118
|
+
category: i.category,
|
|
1119
|
+
package: i.package,
|
|
1120
|
+
status: i.status,
|
|
1121
|
+
maturity: i.maturity,
|
|
1122
|
+
description: i.description,
|
|
1123
|
+
registryItem: i.registryItem,
|
|
1124
|
+
})),
|
|
1125
|
+
},
|
|
1126
|
+
null,
|
|
1127
|
+
2,
|
|
1128
|
+
)}\n`,
|
|
1129
|
+
);
|
|
1130
|
+
console.log(`catalog-index.json written`);
|
|
1131
|
+
|
|
1132
|
+
// 5. Generate docs index
|
|
1133
|
+
await writeFile(
|
|
1134
|
+
path.join(root, 'packages/registry/docs-index.json'),
|
|
1135
|
+
`${JSON.stringify(
|
|
1136
|
+
{
|
|
1137
|
+
generatedAt: new Date().toISOString(),
|
|
1138
|
+
items: manifest.items.map((i) => ({
|
|
1139
|
+
id: i.id,
|
|
1140
|
+
title: i.title,
|
|
1141
|
+
category: i.category,
|
|
1142
|
+
examples: i.examples,
|
|
1143
|
+
})),
|
|
1144
|
+
},
|
|
1145
|
+
null,
|
|
1146
|
+
2,
|
|
1147
|
+
)}\n`,
|
|
1148
|
+
);
|
|
1149
|
+
console.log(`docs-index.json written`);
|