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,187 @@
|
|
|
1
|
+
# Complete NOE Design Catalog and Coss/Base UI Adoption
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-08-26
|
|
4
|
+
**Status:** Draft for user review
|
|
5
|
+
**Scope root:** `/Users/ali/Documents/NoEcosystem/design-system`
|
|
6
|
+
|
|
7
|
+
## Objective
|
|
8
|
+
|
|
9
|
+
Make every public NOE design component inspectable in one running catalog. The
|
|
10
|
+
catalog is both the product team's visual audit surface and the source of
|
|
11
|
+
executable component documentation. It must be complete by contract: no public
|
|
12
|
+
component may be shipped without an entry, states to inspect, locale/direction
|
|
13
|
+
coverage, accessibility evidence, and registry metadata where it is
|
|
14
|
+
installable.
|
|
15
|
+
|
|
16
|
+
The user-supplied Coss, Base UI, dark component-grid, and responsive dashboard
|
|
17
|
+
examples are visual and architectural reference material. They do not grant a
|
|
18
|
+
license to copy their source or visual assets, and they do not override the NOE
|
|
19
|
+
token, accessibility, direction, or ownership contracts.
|
|
20
|
+
|
|
21
|
+
## Definition of Complete
|
|
22
|
+
|
|
23
|
+
"Complete" means the catalog reflects the complete public NOE component
|
|
24
|
+
surface, not that it silently presents planned external components as finished.
|
|
25
|
+
|
|
26
|
+
For every exported NOE component or documented composition, the catalog must
|
|
27
|
+
provide:
|
|
28
|
+
|
|
29
|
+
- a discoverable entry and category;
|
|
30
|
+
- a live preview using the public package export;
|
|
31
|
+
- a concise purpose and do/don't guidance;
|
|
32
|
+
- all supported variants and meaningful interaction states;
|
|
33
|
+
- keyboard, focus, disabled, loading, error, long-content, light, dark, LTR,
|
|
34
|
+
RTL, Persian, and English audit coverage as applicable;
|
|
35
|
+
- source and registry/install metadata where the component is distributable;
|
|
36
|
+
- an explicit maturity state: `available`, `in-progress`, or `planned`.
|
|
37
|
+
|
|
38
|
+
`available` requires executable evidence. The catalog must never visually
|
|
39
|
+
imply that a planned item has been implemented.
|
|
40
|
+
|
|
41
|
+
## Information Architecture
|
|
42
|
+
|
|
43
|
+
The canonical audit experience is a React Storybook application, supplemented
|
|
44
|
+
by a curated NOE Catalog landing page.
|
|
45
|
+
|
|
46
|
+
```text
|
|
47
|
+
Catalog landing
|
|
48
|
+
Foundations
|
|
49
|
+
Typography, colour roles, spacing, elevation, motion, icons, bidi
|
|
50
|
+
Primitives
|
|
51
|
+
Controls, inputs, feedback, overlays, navigation, layout
|
|
52
|
+
Patterns
|
|
53
|
+
Data, agent, approval, artifact, workflow compositions
|
|
54
|
+
Product surfaces
|
|
55
|
+
Consumer, dashboard, agent workspace, workflow builder
|
|
56
|
+
Audit
|
|
57
|
+
Component matrix, accessibility, direction, locale, responsive evidence
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
The landing page uses a dense, quiet component grid inspired by the supplied
|
|
61
|
+
references: clear labels, real previews, restrained borders, deliberate empty
|
|
62
|
+
space, and no decorative treatment outside existing NOE tokens. The dashboard
|
|
63
|
+
surface demonstrates the same components in responsive product context. It is
|
|
64
|
+
not a copy of any reference site.
|
|
65
|
+
|
|
66
|
+
Global controls switch theme, locale, direction, density, and viewport preview.
|
|
67
|
+
Controls apply before first paint where document `lang` and `dir` are involved.
|
|
68
|
+
Links permit a reviewer to enter any component or state directly.
|
|
69
|
+
|
|
70
|
+
## Typography Contract
|
|
71
|
+
|
|
72
|
+
Typography is a semantic token contract, not a per-story convention.
|
|
73
|
+
|
|
74
|
+
- English and other Latin UI copy use `SF Pro Text`; display headings use
|
|
75
|
+
`SF Pro Display`.
|
|
76
|
+
- Persian and Arabic UI copy use the locally supplied `IRANYekanXFaNum` for
|
|
77
|
+
regular, medium, semibold, and bold weights.
|
|
78
|
+
- `html[lang="fa"]`, `html[lang="ar"]`, and nested matching language scopes
|
|
79
|
+
override the semantic sans and heading variables rather than relying on a
|
|
80
|
+
glyph fallback.
|
|
81
|
+
- Technical values keep the semantic monospace family and explicit LTR
|
|
82
|
+
isolation even inside RTL layouts.
|
|
83
|
+
|
|
84
|
+
The self-hosted IRANYekan files remain subject to the existing licensing note;
|
|
85
|
+
no proprietary SF Pro files are added to the repository. SF Pro remains a
|
|
86
|
+
system-font reference with documented platform fallbacks.
|
|
87
|
+
|
|
88
|
+
## Coss and Base UI Strategy
|
|
89
|
+
|
|
90
|
+
Base UI supplies accessible behaviour and Coss supplies verified composition
|
|
91
|
+
patterns. Neither library's default visual language may escape as a NOE product
|
|
92
|
+
API.
|
|
93
|
+
|
|
94
|
+
```text
|
|
95
|
+
Base UI behaviour
|
|
96
|
+
-> selected, locally owned Coss-derived compositions
|
|
97
|
+
-> NOE semantic-token styling and bidi contracts
|
|
98
|
+
-> @noe public packages and registry
|
|
99
|
+
-> catalog and product consumers
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Each Coss primitive is tracked in a machine-readable adoption matrix with one
|
|
103
|
+
of these outcomes:
|
|
104
|
+
|
|
105
|
+
- `adopted`: implemented as a NOE-owned public component and fully auditable;
|
|
106
|
+
- `compose-only`: used internally by an NOE pattern, not exposed as a second
|
|
107
|
+
public primitive;
|
|
108
|
+
- `deferred`: intentionally not yet in the NOE public surface, with rationale;
|
|
109
|
+
- `blocked`: needs an explicit dependency, API, or design decision.
|
|
110
|
+
|
|
111
|
+
Coss particles inform NOE patterns such as authentication, command surfaces,
|
|
112
|
+
forms, tables, and settings. They are adapted only when they add a real product
|
|
113
|
+
contract; the catalog does not bulk-copy the external particle library.
|
|
114
|
+
|
|
115
|
+
No Coss or Base UI API is guessed. Version compatibility, installation source,
|
|
116
|
+
licenses, accessibility behaviour, portal direction, and controlled state are
|
|
117
|
+
verified before each adoption.
|
|
118
|
+
|
|
119
|
+
## Package and Catalog Boundaries
|
|
120
|
+
|
|
121
|
+
- `@noe/design-tokens` owns the semantic font, colour, spacing, motion, and
|
|
122
|
+
theme decisions.
|
|
123
|
+
- `@noe/i18n` owns locales, messages, direction, formatting, and pseudo-locales.
|
|
124
|
+
- `@noe/ui` owns direction-safe primitives and the Base UI/Coss adapters.
|
|
125
|
+
- `@noe/data-ui`, `@noe/ai-ui`, and `@noe/workflow-ui` own NOE pattern-level
|
|
126
|
+
compositions.
|
|
127
|
+
- `@noe/registry` owns installable component metadata and adoption/maturity
|
|
128
|
+
information.
|
|
129
|
+
- `apps/storybook` owns the executable documentation and audit controls.
|
|
130
|
+
- `apps/showcase` owns curated product and catalog entry surfaces; it does not
|
|
131
|
+
duplicate Storybook's component implementation.
|
|
132
|
+
|
|
133
|
+
The registry becomes the inventory source. Automated checks compare public
|
|
134
|
+
exports, registry entries, story coverage, and the audit matrix, failing if an
|
|
135
|
+
available component is absent from any required surface.
|
|
136
|
+
|
|
137
|
+
## Interaction, Accessibility, and Direction
|
|
138
|
+
|
|
139
|
+
Interactive primitives use verified Base UI/Coss hierarchy and composition
|
|
140
|
+
rules, especially for dialogs, menus, selects, popovers, drawers, forms, and
|
|
141
|
+
toasts. Every portalled UI receives explicit direction. Components retain
|
|
142
|
+
logical CSS and do not solve RTL with global reversal or global icon mirroring.
|
|
143
|
+
|
|
144
|
+
The catalog exposes keyboard instructions and accessibility state rather than
|
|
145
|
+
requiring a reviewer to infer them from source. Overlay, focus, label,
|
|
146
|
+
description, error, disabled, and destructive-action behaviour are interaction
|
|
147
|
+
tests, not visual claims.
|
|
148
|
+
|
|
149
|
+
## Verification and Evidence
|
|
150
|
+
|
|
151
|
+
The implementation adds a coverage contract that reports all public components
|
|
152
|
+
and their documentation/audit status. Completion evidence includes:
|
|
153
|
+
|
|
154
|
+
- token tests proving the explicit English and Persian font contracts;
|
|
155
|
+
- component tests for relevant Base UI/Coss interaction semantics;
|
|
156
|
+
- Storybook interaction and accessibility tests for every available story;
|
|
157
|
+
- Playwright audit flows for theme, locale, direction, responsive widths, search,
|
|
158
|
+
filters, and component deep-links;
|
|
159
|
+
- deterministic visual review for selected foundations, primitives, patterns,
|
|
160
|
+
and product surfaces;
|
|
161
|
+
- registry and public-export parity checks;
|
|
162
|
+
- `pnpm check`, `pnpm test:storybook`, `pnpm test:e2e`, and repository-level
|
|
163
|
+
`make check` results.
|
|
164
|
+
|
|
165
|
+
## Non-goals
|
|
166
|
+
|
|
167
|
+
- Copying Coss, Base UI, or the supplied reference websites pixel-for-pixel.
|
|
168
|
+
- Shipping all externally available Coss particles merely because they exist.
|
|
169
|
+
- Replacing NOE tokens, i18n, or public package boundaries with external APIs.
|
|
170
|
+
- Claiming a component is implemented before its story and executable audit
|
|
171
|
+
coverage exist.
|
|
172
|
+
- Publishing, deploying, or changing production infrastructure.
|
|
173
|
+
|
|
174
|
+
## Delivery Sequence
|
|
175
|
+
|
|
176
|
+
1. Establish catalog inventory, maturity metadata, and coverage checks.
|
|
177
|
+
2. Correct the explicit language-aware typography contract with tests.
|
|
178
|
+
3. Install or normalize only the verified Base UI/Coss foundations required by
|
|
179
|
+
the adoption matrix.
|
|
180
|
+
4. Build the catalog shell, global audit controls, navigation, search, and
|
|
181
|
+
preview grid.
|
|
182
|
+
5. Add and group complete stories for every existing public NOE component.
|
|
183
|
+
6. Adopt missing primitives and patterns in dependency order, each with public
|
|
184
|
+
API, registry data, story, interaction test, and RTL coverage.
|
|
185
|
+
7. Build curated product surfaces from the same public components.
|
|
186
|
+
8. Run the full automated and visual verification matrix, report gaps honestly,
|
|
187
|
+
and retain a visible `planned` state for anything not yet available.
|
package/llms.txt
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# NOE Design System retrieval map
|
|
2
|
+
|
|
3
|
+
- Repository overview: README.md
|
|
4
|
+
- Agent rules: AGENTS.md
|
|
5
|
+
- Architecture: docs/design-system/architecture.md
|
|
6
|
+
- Brand audit: docs/design-system/noe-brand-audit.md
|
|
7
|
+
- Foundations and tokens: docs/design-system/foundations.md, docs/design-system/tokens.md
|
|
8
|
+
- Components: docs/design-system/components.md
|
|
9
|
+
- Internationalization: docs/design-system/i18n.md
|
|
10
|
+
- RTL and bidi: docs/design-system/rtl.md
|
|
11
|
+
- Motion: docs/design-system/motion.md
|
|
12
|
+
- Accessibility: docs/design-system/accessibility.md
|
|
13
|
+
- Agentic UI: docs/design-system/agentic-ui.md
|
|
14
|
+
- Testing and visual QA: docs/design-system/testing.md, docs/design-system/visual-qa.md
|
|
15
|
+
- CI/CD and security: docs/design-system/ci-cd.md, docs/design-system/security.md
|
|
16
|
+
- Registry and MCP: docs/design-system/registry.md, docs/design-system/mcp.md
|
|
17
|
+
- Contribution workflow: docs/design-system/contributing.md
|
|
18
|
+
- Decisions: docs/adr/
|
|
19
|
+
- Static reference app: apps/web/
|
|
20
|
+
- Storybook source: apps/storybook/
|
package/package.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "noecosystem-design",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": false,
|
|
5
|
+
"publishConfig": {
|
|
6
|
+
"access": "public"
|
|
7
|
+
},
|
|
8
|
+
"type": "module",
|
|
9
|
+
"packageManager": "pnpm@11.23.0",
|
|
10
|
+
"engines": {
|
|
11
|
+
"node": ">=24.19.0"
|
|
12
|
+
},
|
|
13
|
+
"scripts": {
|
|
14
|
+
"dev": "pnpm --filter @noe/showcase dev",
|
|
15
|
+
"storybook": "pnpm --filter @noe/storybook storybook",
|
|
16
|
+
"format": "biome format --write .",
|
|
17
|
+
"format:check": "biome format .",
|
|
18
|
+
"gen:inventory": "node scripts/generate-inventory.mjs",
|
|
19
|
+
"gen:manifest": "node scripts/generate-manifest.mjs",
|
|
20
|
+
"validate:manifest": "node scripts/validate-manifest.mjs",
|
|
21
|
+
"lint": "biome lint .",
|
|
22
|
+
"typecheck": "tsc -p tsconfig.json --pretty false",
|
|
23
|
+
"test": "node --test tests/*.test.mjs && vitest run --project unit",
|
|
24
|
+
"test:components": "vitest run --project browser",
|
|
25
|
+
"test:storybook": "vitest run --project storybook --config apps/storybook/vitest.config.ts",
|
|
26
|
+
"test:e2e": "playwright test",
|
|
27
|
+
"test:registry:consumer": "node scripts/verify-registry-consumer.mjs",
|
|
28
|
+
"test:registry": "node scripts/validate-manifest.mjs",
|
|
29
|
+
"test:manifest": "node scripts/validate-manifest.mjs",
|
|
30
|
+
"test:exports": "node scripts/validate-manifest.mjs",
|
|
31
|
+
"test:coverage": "node scripts/validate-manifest.mjs",
|
|
32
|
+
"test:tokens": "node scripts/verify.mjs",
|
|
33
|
+
"build": "pnpm -r --if-present build",
|
|
34
|
+
"build:storybook": "pnpm --filter @noe/storybook build-storybook",
|
|
35
|
+
"verify": "node scripts/verify.mjs && node scripts/validate-manifest.mjs",
|
|
36
|
+
"check": "pnpm format:check && pnpm lint && pnpm typecheck && pnpm test && pnpm test:components && pnpm gen:manifest && pnpm validate:manifest && pnpm build && pnpm build:storybook && pnpm verify",
|
|
37
|
+
"test:offline": "node --test tests/*.test.mjs",
|
|
38
|
+
"typecheck:offline": "tsc -p tsconfig.verify.json --pretty false",
|
|
39
|
+
"build:static": "node scripts/build-static.mjs",
|
|
40
|
+
"visual:legacy": "bash scripts/capture-visuals.sh"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@biomejs/biome": "2.5.10",
|
|
44
|
+
"@playwright/test": "1.62.1",
|
|
45
|
+
"@storybook/addon-a11y": "10.5.10",
|
|
46
|
+
"@storybook/addon-docs": "10.5.10",
|
|
47
|
+
"@storybook/addon-vitest": "10.5.10",
|
|
48
|
+
"@storybook/react-vite": "10.5.10",
|
|
49
|
+
"@tailwindcss/vite": "4.3.3",
|
|
50
|
+
"@testing-library/react": "16.3.2",
|
|
51
|
+
"@testing-library/user-event": "14.6.6",
|
|
52
|
+
"@types/node": "26.2.0",
|
|
53
|
+
"@types/react": "19.2.18",
|
|
54
|
+
"@types/react-dom": "19.2.5",
|
|
55
|
+
"@vitejs/plugin-react": "6.1.0",
|
|
56
|
+
"@vitest/browser-playwright": "4.1.11",
|
|
57
|
+
"jsdom": "30.0.1",
|
|
58
|
+
"react": "19.2.8",
|
|
59
|
+
"react-dom": "19.2.8",
|
|
60
|
+
"storybook": "10.5.10",
|
|
61
|
+
"tailwindcss": "4.3.3",
|
|
62
|
+
"typescript": "7.0.2",
|
|
63
|
+
"vite": "8.2.2",
|
|
64
|
+
"vite-tsconfig-paths": "^6.1.1",
|
|
65
|
+
"vitest": "4.1.11",
|
|
66
|
+
"vitest-browser-react": "2.2.0"
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
|
|
2
|
+
import type * as React from 'react';
|
|
3
|
+
import { cn } from '@noe/ui/lib/cn';
|
|
4
|
+
|
|
5
|
+
export interface ActivityFeedItem {
|
|
6
|
+
id: string;
|
|
7
|
+
label: React.ReactNode;
|
|
8
|
+
meta?: React.ReactNode;
|
|
9
|
+
timestamp?: React.ReactNode;
|
|
10
|
+
status?: 'neutral' | 'positive' | 'warning' | 'error';
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface ActivityFeedProps extends React.ComponentProps<'ol'> {
|
|
14
|
+
label: string;
|
|
15
|
+
items: readonly ActivityFeedItem[];
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const statusClassName = {
|
|
19
|
+
neutral: 'bg-muted-foreground',
|
|
20
|
+
positive: 'bg-success',
|
|
21
|
+
warning: 'bg-warning',
|
|
22
|
+
error: 'bg-destructive',
|
|
23
|
+
} as const;
|
|
24
|
+
|
|
25
|
+
export function ActivityFeed({ label, items, className, ...props }: ActivityFeedProps) {
|
|
26
|
+
return (
|
|
27
|
+
<ol
|
|
28
|
+
aria-label={label}
|
|
29
|
+
className={cn('m-0 flex list-none flex-col p-0', className)}
|
|
30
|
+
data-slot="activity-feed"
|
|
31
|
+
{...props}
|
|
32
|
+
>
|
|
33
|
+
{items.map((item) => (
|
|
34
|
+
<li
|
|
35
|
+
className="relative flex gap-3 pb-4 ps-1 last:pb-0"
|
|
36
|
+
data-slot="activity-feed-item"
|
|
37
|
+
data-status={item.status ?? 'neutral'}
|
|
38
|
+
key={item.id}
|
|
39
|
+
>
|
|
40
|
+
<span
|
|
41
|
+
aria-hidden="true"
|
|
42
|
+
className={cn(
|
|
43
|
+
'mt-2 size-2 shrink-0 rounded-full',
|
|
44
|
+
statusClassName[item.status ?? 'neutral'],
|
|
45
|
+
)}
|
|
46
|
+
/>
|
|
47
|
+
<div className="flex min-w-0 flex-1 flex-col gap-0.5 text-start">
|
|
48
|
+
<span className="text-sm leading-normal text-foreground">{item.label}</span>
|
|
49
|
+
{item.meta || item.timestamp ? (
|
|
50
|
+
<span className="flex flex-wrap items-center gap-x-2 text-xs leading-normal text-muted-foreground">
|
|
51
|
+
{item.meta ? <span>{item.meta}</span> : null}
|
|
52
|
+
{item.timestamp ? <span className="tabular-nums">{item.timestamp}</span> : null}
|
|
53
|
+
</span>
|
|
54
|
+
) : null}
|
|
55
|
+
</div>
|
|
56
|
+
</li>
|
|
57
|
+
))}
|
|
58
|
+
</ol>
|
|
59
|
+
);
|
|
60
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type * as React from 'react';
|
|
2
|
+
import { Button } from '@noe/ui/button';
|
|
3
|
+
import { cn } from '@noe/ui/lib/cn';
|
|
4
|
+
|
|
5
|
+
export function AgentComposer({
|
|
6
|
+
value,
|
|
7
|
+
onChange,
|
|
8
|
+
onSubmit,
|
|
9
|
+
placeholder,
|
|
10
|
+
submitLabel,
|
|
11
|
+
disabled,
|
|
12
|
+
className,
|
|
13
|
+
}: {
|
|
14
|
+
value: string;
|
|
15
|
+
onChange(value: string): void;
|
|
16
|
+
onSubmit(): void;
|
|
17
|
+
placeholder: string;
|
|
18
|
+
submitLabel: string;
|
|
19
|
+
disabled?: boolean;
|
|
20
|
+
className?: string;
|
|
21
|
+
}) {
|
|
22
|
+
return (
|
|
23
|
+
<form
|
|
24
|
+
className={cn(
|
|
25
|
+
'flex flex-col gap-3 rounded-lg border border-border bg-surface-raised p-3 transition-[border-color,box-shadow] duration-(--noe-motion-duration-fast) focus-within:border-accent focus-within:ring-2 focus-within:ring-focus-ring',
|
|
26
|
+
className,
|
|
27
|
+
)}
|
|
28
|
+
data-slot="agent-composer"
|
|
29
|
+
onSubmit={(event: React.FormEvent<HTMLFormElement>) => {
|
|
30
|
+
event.preventDefault();
|
|
31
|
+
onSubmit();
|
|
32
|
+
}}
|
|
33
|
+
>
|
|
34
|
+
<textarea
|
|
35
|
+
className="field-sizing-content max-h-48 min-h-16 w-full resize-none rounded-md border-0 bg-transparent px-1 text-sm text-foreground outline-none placeholder:text-muted-foreground"
|
|
36
|
+
data-slot="agent-composer-input"
|
|
37
|
+
dir="auto"
|
|
38
|
+
disabled={disabled}
|
|
39
|
+
onChange={(event: React.ChangeEvent<HTMLTextAreaElement>) => onChange(event.target.value)}
|
|
40
|
+
placeholder={placeholder}
|
|
41
|
+
rows={3}
|
|
42
|
+
value={value}
|
|
43
|
+
/>
|
|
44
|
+
<div className="flex items-center justify-between gap-2">
|
|
45
|
+
<span aria-live="polite" className="font-mono text-xs text-muted-foreground" dir="ltr">
|
|
46
|
+
{value.length}
|
|
47
|
+
</span>
|
|
48
|
+
<Button disabled={disabled || !value.trim()} size="sm" type="submit" variant="primary">
|
|
49
|
+
{submitLabel}
|
|
50
|
+
</Button>
|
|
51
|
+
</div>
|
|
52
|
+
</form>
|
|
53
|
+
);
|
|
54
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type * as React from 'react';
|
|
2
|
+
import { AutoDirectionText, TechnicalValue } from '@noe/ui/bidi';
|
|
3
|
+
import { cn } from '@noe/ui/lib/cn';
|
|
4
|
+
|
|
5
|
+
const roleClassName = {
|
|
6
|
+
user: 'items-end',
|
|
7
|
+
assistant: 'items-start',
|
|
8
|
+
system: 'items-start',
|
|
9
|
+
} as const;
|
|
10
|
+
|
|
11
|
+
const bubbleClassName = {
|
|
12
|
+
user: 'bg-accent text-accent-foreground',
|
|
13
|
+
assistant: 'border border-border bg-surface-raised text-foreground',
|
|
14
|
+
system: 'border border-dashed border-border bg-surface-sunken/50 text-muted-foreground',
|
|
15
|
+
} as const;
|
|
16
|
+
|
|
17
|
+
export function AgentMessage({
|
|
18
|
+
role,
|
|
19
|
+
name,
|
|
20
|
+
content,
|
|
21
|
+
model,
|
|
22
|
+
className,
|
|
23
|
+
}: {
|
|
24
|
+
role: 'user' | 'assistant' | 'system';
|
|
25
|
+
name: React.ReactNode;
|
|
26
|
+
content: React.ReactNode;
|
|
27
|
+
model?: string;
|
|
28
|
+
className?: string;
|
|
29
|
+
}) {
|
|
30
|
+
return (
|
|
31
|
+
<article
|
|
32
|
+
className={cn('flex w-full flex-col gap-1.5', roleClassName[role], className)}
|
|
33
|
+
data-role={role}
|
|
34
|
+
data-slot="agent-message"
|
|
35
|
+
>
|
|
36
|
+
<header className="flex items-center gap-2 px-1 text-xs text-muted-foreground">
|
|
37
|
+
<strong className="font-medium text-foreground">{name}</strong>
|
|
38
|
+
{model ? <TechnicalValue>{model}</TechnicalValue> : null}
|
|
39
|
+
</header>
|
|
40
|
+
<AutoDirectionText
|
|
41
|
+
className={cn(
|
|
42
|
+
'max-w-prose rounded-lg px-4 py-3 text-sm leading-normal',
|
|
43
|
+
bubbleClassName[role],
|
|
44
|
+
)}
|
|
45
|
+
>
|
|
46
|
+
{content}
|
|
47
|
+
</AutoDirectionText>
|
|
48
|
+
</article>
|
|
49
|
+
);
|
|
50
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { useId } from 'react';
|
|
2
|
+
import type * as React from 'react';
|
|
3
|
+
import { cn } from '@noe/ui/lib/cn';
|
|
4
|
+
|
|
5
|
+
export type PlanState = 'queued' | 'running' | 'completed' | 'failed';
|
|
6
|
+
export type PlanStep = { id: string; label: React.ReactNode; state: PlanState };
|
|
7
|
+
|
|
8
|
+
const dotClassName = {
|
|
9
|
+
queued: 'bg-muted-foreground/40',
|
|
10
|
+
running: 'animate-pulse bg-accent',
|
|
11
|
+
completed: 'bg-success',
|
|
12
|
+
failed: 'bg-destructive',
|
|
13
|
+
} as const;
|
|
14
|
+
|
|
15
|
+
const stepLabelClassName = {
|
|
16
|
+
queued: 'text-muted-foreground',
|
|
17
|
+
running: 'text-foreground',
|
|
18
|
+
completed: 'text-foreground',
|
|
19
|
+
failed: 'text-destructive',
|
|
20
|
+
} as const;
|
|
21
|
+
|
|
22
|
+
export function AgentPlan({
|
|
23
|
+
title,
|
|
24
|
+
steps,
|
|
25
|
+
stateLabels,
|
|
26
|
+
className,
|
|
27
|
+
}: {
|
|
28
|
+
title: React.ReactNode;
|
|
29
|
+
steps: PlanStep[];
|
|
30
|
+
stateLabels: Record<PlanState, React.ReactNode>;
|
|
31
|
+
className?: string;
|
|
32
|
+
}) {
|
|
33
|
+
const titleId = useId();
|
|
34
|
+
return (
|
|
35
|
+
<section
|
|
36
|
+
aria-labelledby={titleId}
|
|
37
|
+
className={cn('rounded-lg border border-border bg-surface-raised p-4', className)}
|
|
38
|
+
data-slot="agent-plan"
|
|
39
|
+
>
|
|
40
|
+
<h3
|
|
41
|
+
className="m-0 mb-3 font-heading text-sm font-semibold leading-snug text-foreground"
|
|
42
|
+
id={titleId}
|
|
43
|
+
>
|
|
44
|
+
{title}
|
|
45
|
+
</h3>
|
|
46
|
+
<ol className="m-0 flex list-none flex-col gap-3 p-0">
|
|
47
|
+
{steps.map((step) => (
|
|
48
|
+
<li
|
|
49
|
+
className="flex items-start gap-3"
|
|
50
|
+
data-slot="agent-plan-step"
|
|
51
|
+
data-state={step.state}
|
|
52
|
+
key={step.id}
|
|
53
|
+
>
|
|
54
|
+
<span
|
|
55
|
+
aria-hidden="true"
|
|
56
|
+
className={cn('mt-1.5 size-2 shrink-0 rounded-pill', dotClassName[step.state])}
|
|
57
|
+
/>
|
|
58
|
+
<div className="flex min-w-0 flex-1 flex-col gap-0.5">
|
|
59
|
+
<span className={cn('text-sm leading-normal', stepLabelClassName[step.state])}>
|
|
60
|
+
{step.label}
|
|
61
|
+
</span>
|
|
62
|
+
<small className="text-xs text-muted-foreground">{stateLabels[step.state]}</small>
|
|
63
|
+
</div>
|
|
64
|
+
</li>
|
|
65
|
+
))}
|
|
66
|
+
</ol>
|
|
67
|
+
</section>
|
|
68
|
+
);
|
|
69
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
|
|
2
|
+
import type * as React from 'react';
|
|
3
|
+
import { cn } from '@noe/ui/lib/cn';
|
|
4
|
+
|
|
5
|
+
export interface AgentWorkspaceProps extends React.ComponentProps<'div'> {
|
|
6
|
+
label: string;
|
|
7
|
+
navigation: React.ReactNode;
|
|
8
|
+
inspector?: React.ReactNode;
|
|
9
|
+
children: React.ReactNode;
|
|
10
|
+
/**
|
|
11
|
+
* Landmark ownership: application shell (AppFrame) owns the primary <main>.
|
|
12
|
+
* AgentWorkspace defaults to a non-main region for the conversation area to avoid nested <main> when placed inside AppFrame.
|
|
13
|
+
* Use `as="main"` when rendering as a standalone top-level page.
|
|
14
|
+
*/
|
|
15
|
+
as?: 'div' | 'main';
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function AgentWorkspace({
|
|
19
|
+
label,
|
|
20
|
+
navigation,
|
|
21
|
+
inspector,
|
|
22
|
+
children,
|
|
23
|
+
className,
|
|
24
|
+
as: Tag = 'div',
|
|
25
|
+
...props
|
|
26
|
+
}: AgentWorkspaceProps) {
|
|
27
|
+
const ContentTag = Tag === 'main' ? 'main' : 'div';
|
|
28
|
+
return (
|
|
29
|
+
<section
|
|
30
|
+
aria-label={label}
|
|
31
|
+
className={cn(
|
|
32
|
+
'grid w-full grid-cols-[15rem_minmax(0,1fr)] overflow-hidden rounded-lg border border-border bg-surface lg:grid-cols-[15rem_minmax(0,1fr)_18rem]',
|
|
33
|
+
className,
|
|
34
|
+
)}
|
|
35
|
+
data-slot="agent-workspace"
|
|
36
|
+
{...props}
|
|
37
|
+
>
|
|
38
|
+
<aside
|
|
39
|
+
aria-label="Workspace navigation"
|
|
40
|
+
className="border-e border-border bg-surface-raised p-4"
|
|
41
|
+
data-slot="agent-workspace-navigation"
|
|
42
|
+
>
|
|
43
|
+
{navigation}
|
|
44
|
+
</aside>
|
|
45
|
+
<ContentTag
|
|
46
|
+
aria-label="Conversation and artifacts"
|
|
47
|
+
className="flex min-w-0 flex-col gap-4 p-5"
|
|
48
|
+
data-slot="agent-workspace-conversation"
|
|
49
|
+
>
|
|
50
|
+
{children}
|
|
51
|
+
</ContentTag>
|
|
52
|
+
{inspector ? (
|
|
53
|
+
<aside
|
|
54
|
+
aria-label="Run inspector"
|
|
55
|
+
className="hidden flex-col gap-4 border-s border-border bg-surface-raised p-5 lg:flex"
|
|
56
|
+
data-slot="agent-workspace-inspector"
|
|
57
|
+
>
|
|
58
|
+
{inspector}
|
|
59
|
+
</aside>
|
|
60
|
+
) : null}
|
|
61
|
+
</section>
|
|
62
|
+
);
|
|
63
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { useId } from 'react';
|
|
2
|
+
import type * as React from 'react';
|
|
3
|
+
import { TechnicalValue } from '@noe/ui/bidi';
|
|
4
|
+
import { Button } from '@noe/ui/button';
|
|
5
|
+
import { cn } from '@noe/ui/lib/cn';
|
|
6
|
+
|
|
7
|
+
export type ApprovalParameter = {
|
|
8
|
+
/** Stable identity for rendering; must be unique within one request. */
|
|
9
|
+
id: string;
|
|
10
|
+
label: React.ReactNode;
|
|
11
|
+
value: string;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export function ApprovalRequest({
|
|
15
|
+
title,
|
|
16
|
+
consequence,
|
|
17
|
+
target,
|
|
18
|
+
targetLabel,
|
|
19
|
+
parameters,
|
|
20
|
+
labels,
|
|
21
|
+
onDecision,
|
|
22
|
+
className,
|
|
23
|
+
}: {
|
|
24
|
+
title: React.ReactNode;
|
|
25
|
+
consequence: React.ReactNode;
|
|
26
|
+
target: string;
|
|
27
|
+
targetLabel: React.ReactNode;
|
|
28
|
+
parameters: ApprovalParameter[];
|
|
29
|
+
labels: { once: React.ReactNode; session: React.ReactNode; deny: React.ReactNode };
|
|
30
|
+
onDecision(decision: 'once' | 'session' | 'deny'): void;
|
|
31
|
+
className?: string;
|
|
32
|
+
}) {
|
|
33
|
+
const titleId = useId();
|
|
34
|
+
const decideOnce = () => onDecision('once');
|
|
35
|
+
const decideSession = () => onDecision('session');
|
|
36
|
+
const decideDeny = () => onDecision('deny');
|
|
37
|
+
|
|
38
|
+
return (
|
|
39
|
+
<section
|
|
40
|
+
aria-labelledby={titleId}
|
|
41
|
+
className={cn(
|
|
42
|
+
'flex flex-col gap-4 rounded-lg border border-warning/40 bg-warning/10 p-4',
|
|
43
|
+
className,
|
|
44
|
+
)}
|
|
45
|
+
data-slot="approval-request"
|
|
46
|
+
>
|
|
47
|
+
<header className="flex items-start gap-3">
|
|
48
|
+
<span
|
|
49
|
+
aria-hidden="true"
|
|
50
|
+
className="mt-0.5 flex size-6 shrink-0 items-center justify-center rounded-pill border border-warning/50 bg-surface-raised text-sm font-semibold text-warning-foreground"
|
|
51
|
+
>
|
|
52
|
+
!
|
|
53
|
+
</span>
|
|
54
|
+
<div className="flex min-w-0 flex-col gap-1">
|
|
55
|
+
<h3
|
|
56
|
+
className="m-0 font-heading text-sm font-semibold leading-snug text-foreground"
|
|
57
|
+
id={titleId}
|
|
58
|
+
>
|
|
59
|
+
{title}
|
|
60
|
+
</h3>
|
|
61
|
+
<p className="m-0 text-sm leading-normal text-muted-foreground">{consequence}</p>
|
|
62
|
+
</div>
|
|
63
|
+
</header>
|
|
64
|
+
<dl className="m-0 grid grid-cols-1 gap-x-4 gap-y-2 rounded-md border border-border bg-surface-raised p-3 sm:grid-cols-2">
|
|
65
|
+
<div className="flex flex-col gap-0.5">
|
|
66
|
+
<dt className="text-xs text-muted-foreground">{targetLabel}</dt>
|
|
67
|
+
<dd className="m-0">
|
|
68
|
+
<TechnicalValue>{target}</TechnicalValue>
|
|
69
|
+
</dd>
|
|
70
|
+
</div>
|
|
71
|
+
{parameters.map((parameter) => (
|
|
72
|
+
<div className="flex flex-col gap-0.5" key={parameter.id}>
|
|
73
|
+
<dt className="text-xs text-muted-foreground">{parameter.label}</dt>
|
|
74
|
+
<dd className="m-0">
|
|
75
|
+
<TechnicalValue>{parameter.value}</TechnicalValue>
|
|
76
|
+
</dd>
|
|
77
|
+
</div>
|
|
78
|
+
))}
|
|
79
|
+
</dl>
|
|
80
|
+
<footer className="flex flex-col-reverse gap-2 sm:flex-row sm:justify-end">
|
|
81
|
+
<Button onClick={decideDeny} variant="quiet">
|
|
82
|
+
{labels.deny}
|
|
83
|
+
</Button>
|
|
84
|
+
<Button onClick={decideSession} variant="outline">
|
|
85
|
+
{labels.session}
|
|
86
|
+
</Button>
|
|
87
|
+
<Button onClick={decideOnce} variant="primary">
|
|
88
|
+
{labels.once}
|
|
89
|
+
</Button>
|
|
90
|
+
</footer>
|
|
91
|
+
</section>
|
|
92
|
+
);
|
|
93
|
+
}
|