@nadicodeai/ui 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/AGENTS.md +114 -0
- package/README.md +211 -0
- package/dist/ai-elements.d.ts +49 -0
- package/dist/ai-elements.d.ts.map +1 -0
- package/dist/ai-elements.js +48 -0
- package/dist/components/accordion.d.ts +8 -0
- package/dist/components/accordion.d.ts.map +1 -0
- package/dist/components/accordion.js +18 -0
- package/dist/components/action-band.d.ts +10 -0
- package/dist/components/action-band.d.ts.map +1 -0
- package/dist/components/action-band.js +33 -0
- package/dist/components/agent-chat.d.ts +20 -0
- package/dist/components/agent-chat.d.ts.map +1 -0
- package/dist/components/agent-chat.js +10 -0
- package/dist/components/agent-composer.d.ts +56 -0
- package/dist/components/agent-composer.d.ts.map +1 -0
- package/dist/components/agent-composer.js +60 -0
- package/dist/components/agent-message.d.ts +116 -0
- package/dist/components/agent-message.d.ts.map +1 -0
- package/dist/components/agent-message.js +110 -0
- package/dist/components/agent-thread.d.ts +26 -0
- package/dist/components/agent-thread.d.ts.map +1 -0
- package/dist/components/agent-thread.js +72 -0
- package/dist/components/agent-tool-approval.d.ts +32 -0
- package/dist/components/agent-tool-approval.d.ts.map +1 -0
- package/dist/components/agent-tool-approval.js +61 -0
- package/dist/components/ai-elements/agent.d.ts +27 -0
- package/dist/components/ai-elements/agent.d.ts.map +1 -0
- package/dist/components/ai-elements/agent.js +27 -0
- package/dist/components/ai-elements/artifact.d.ts +24 -0
- package/dist/components/ai-elements/artifact.d.ts.map +1 -0
- package/dist/components/ai-elements/artifact.js +20 -0
- package/dist/components/ai-elements/attachments.d.ts +55 -0
- package/dist/components/ai-elements/attachments.d.ts.map +1 -0
- package/dist/components/ai-elements/attachments.js +125 -0
- package/dist/components/ai-elements/audio-player.d.ts +30 -0
- package/dist/components/ai-elements/audio-player.d.ts.map +1 -0
- package/dist/components/ai-elements/audio-player.js +43 -0
- package/dist/components/ai-elements/canvas.d.ts +8 -0
- package/dist/components/ai-elements/canvas.d.ts.map +1 -0
- package/dist/components/ai-elements/canvas.js +5 -0
- package/dist/components/ai-elements/chain-of-thought.d.ts +30 -0
- package/dist/components/ai-elements/chain-of-thought.d.ts.map +1 -0
- package/dist/components/ai-elements/chain-of-thought.js +49 -0
- package/dist/components/ai-elements/checkpoint.d.ts +12 -0
- package/dist/components/ai-elements/checkpoint.d.ts.map +1 -0
- package/dist/components/ai-elements/checkpoint.js +10 -0
- package/dist/components/ai-elements/code-block.d.ts +46 -0
- package/dist/components/ai-elements/code-block.d.ts.map +1 -0
- package/dist/components/ai-elements/code-block.js +207 -0
- package/dist/components/ai-elements/commit.d.ts +65 -0
- package/dist/components/ai-elements/commit.d.ts.map +1 -0
- package/dist/components/ai-elements/commit.js +95 -0
- package/dist/components/ai-elements/confirmation.d.ts +50 -0
- package/dist/components/ai-elements/confirmation.d.ts.map +1 -0
- package/dist/components/ai-elements/confirmation.js +61 -0
- package/dist/components/ai-elements/connection.d.ts +6 -0
- package/dist/components/ai-elements/connection.d.ts.map +1 -0
- package/dist/components/ai-elements/connection.js +10 -0
- package/dist/components/ai-elements/context.d.ts +33 -0
- package/dist/components/ai-elements/context.d.ts.map +1 -0
- package/dist/components/ai-elements/context.js +164 -0
- package/dist/components/ai-elements/controls.d.ts +5 -0
- package/dist/components/ai-elements/controls.d.ts.map +1 -0
- package/dist/components/ai-elements/controls.js +5 -0
- package/dist/components/ai-elements/conversation.d.ts +24 -0
- package/dist/components/ai-elements/conversation.d.ts.map +1 -0
- package/dist/components/ai-elements/conversation.js +41 -0
- package/dist/components/ai-elements/edge.d.ts +6 -0
- package/dist/components/ai-elements/edge.d.ts.map +1 -0
- package/dist/components/ai-elements/edge.js +88 -0
- package/dist/components/ai-elements/environment-variables.d.ts +39 -0
- package/dist/components/ai-elements/environment-variables.d.ts.map +1 -0
- package/dist/components/ai-elements/environment-variables.js +87 -0
- package/dist/components/ai-elements/file-tree.d.ts +27 -0
- package/dist/components/ai-elements/file-tree.d.ts.map +1 -0
- package/dist/components/ai-elements/file-tree.js +71 -0
- package/dist/components/ai-elements/image.d.ts +7 -0
- package/dist/components/ai-elements/image.d.ts.map +1 -0
- package/dist/components/ai-elements/image.js +3 -0
- package/dist/components/ai-elements/inline-citation.d.ts +39 -0
- package/dist/components/ai-elements/inline-citation.d.ts.map +1 -0
- package/dist/components/ai-elements/inline-citation.js +86 -0
- package/dist/components/ai-elements/jsx-preview.d.ts +30 -0
- package/dist/components/ai-elements/jsx-preview.d.ts.map +1 -0
- package/dist/components/ai-elements/jsx-preview.js +168 -0
- package/dist/components/ai-elements/message.d.ts +38 -0
- package/dist/components/ai-elements/message.d.ts.map +1 -0
- package/dist/components/ai-elements/message.js +92 -0
- package/dist/components/ai-elements/mic-selector.d.ts +46 -0
- package/dist/components/ai-elements/mic-selector.d.ts.map +1 -0
- package/dist/components/ai-elements/mic-selector.js +184 -0
- package/dist/components/ai-elements/model-selector.d.ts +36 -0
- package/dist/components/ai-elements/model-selector.d.ts.map +1 -0
- package/dist/components/ai-elements/model-selector.js +18 -0
- package/dist/components/ai-elements/node.d.ts +22 -0
- package/dist/components/ai-elements/node.d.ts.map +1 -0
- package/dist/components/ai-elements/node.js +12 -0
- package/dist/components/ai-elements/open-in-chat.d.ts +29 -0
- package/dist/components/ai-elements/open-in-chat.d.ts.map +1 -0
- package/dist/components/ai-elements/open-in-chat.js +100 -0
- package/dist/components/ai-elements/package-info.d.ts +30 -0
- package/dist/components/ai-elements/package-info.d.ts.map +1 -0
- package/dist/components/ai-elements/package-info.js +50 -0
- package/dist/components/ai-elements/panel.d.ts +6 -0
- package/dist/components/ai-elements/panel.d.ts.map +1 -0
- package/dist/components/ai-elements/panel.js +5 -0
- package/dist/components/ai-elements/persona.d.ts +49 -0
- package/dist/components/ai-elements/persona.d.ts.map +1 -0
- package/dist/components/ai-elements/persona.js +176 -0
- package/dist/components/ai-elements/plan.d.ts +26 -0
- package/dist/components/ai-elements/plan.d.ts.map +1 -0
- package/dist/components/ai-elements/plan.js +34 -0
- package/dist/components/ai-elements/prompt-input.d.ts +149 -0
- package/dist/components/ai-elements/prompt-input.d.ts.map +1 -0
- package/dist/components/ai-elements/prompt-input.js +715 -0
- package/dist/components/ai-elements/queue.d.ts +62 -0
- package/dist/components/ai-elements/queue.d.ts.map +1 -0
- package/dist/components/ai-elements/queue.js +28 -0
- package/dist/components/ai-elements/reasoning.d.ts +27 -0
- package/dist/components/ai-elements/reasoning.d.ts.map +1 -0
- package/dist/components/ai-elements/reasoning.js +95 -0
- package/dist/components/ai-elements/sandbox.d.ts +25 -0
- package/dist/components/ai-elements/sandbox.d.ts.map +1 -0
- package/dist/components/ai-elements/sandbox.js +15 -0
- package/dist/components/ai-elements/schema-display.d.ts +56 -0
- package/dist/components/ai-elements/schema-display.d.ts.map +1 -0
- package/dist/components/ai-elements/schema-display.js +90 -0
- package/dist/components/ai-elements/shimmer.d.ts +10 -0
- package/dist/components/ai-elements/shimmer.d.ts.map +1 -0
- package/dist/components/ai-elements/shimmer.js +28 -0
- package/dist/components/ai-elements/snippet.d.ts +19 -0
- package/dist/components/ai-elements/snippet.d.ts.map +1 -0
- package/dist/components/ai-elements/snippet.js +46 -0
- package/dist/components/ai-elements/sources.d.ts +13 -0
- package/dist/components/ai-elements/sources.d.ts.map +1 -0
- package/dist/components/ai-elements/sources.js +9 -0
- package/dist/components/ai-elements/speech-input.d.ts +55 -0
- package/dist/components/ai-elements/speech-input.d.ts.map +1 -0
- package/dist/components/ai-elements/speech-input.js +187 -0
- package/dist/components/ai-elements/stack-trace.d.ts +38 -0
- package/dist/components/ai-elements/stack-trace.d.ts.map +1 -0
- package/dist/components/ai-elements/stack-trace.js +194 -0
- package/dist/components/ai-elements/suggestion.d.ts +11 -0
- package/dist/components/ai-elements/suggestion.d.ts.map +1 -0
- package/dist/components/ai-elements/suggestion.js +13 -0
- package/dist/components/ai-elements/task.d.ts +15 -0
- package/dist/components/ai-elements/task.d.ts.map +1 -0
- package/dist/components/ai-elements/task.js +10 -0
- package/dist/components/ai-elements/terminal.d.ts +28 -0
- package/dist/components/ai-elements/terminal.d.ts.map +1 -0
- package/dist/components/ai-elements/terminal.js +68 -0
- package/dist/components/ai-elements/test-results.d.ts +59 -0
- package/dist/components/ai-elements/test-results.d.ts.map +1 -0
- package/dist/components/ai-elements/test-results.js +98 -0
- package/dist/components/ai-elements/tool.d.ts +32 -0
- package/dist/components/ai-elements/tool.d.ts.map +1 -0
- package/dist/components/ai-elements/tool.js +49 -0
- package/dist/components/ai-elements/toolbar.d.ts +6 -0
- package/dist/components/ai-elements/toolbar.d.ts.map +1 -0
- package/dist/components/ai-elements/toolbar.js +5 -0
- package/dist/components/ai-elements/transcription.d.ts +17 -0
- package/dist/components/ai-elements/transcription.d.ts.map +1 -0
- package/dist/components/ai-elements/transcription.js +36 -0
- package/dist/components/ai-elements/voice-selector.d.ts +64 -0
- package/dist/components/ai-elements/voice-selector.d.ts.map +1 -0
- package/dist/components/ai-elements/voice-selector.js +224 -0
- package/dist/components/ai-elements/web-preview.d.ts +35 -0
- package/dist/components/ai-elements/web-preview.d.ts.map +1 -0
- package/dist/components/ai-elements/web-preview.js +66 -0
- package/dist/components/alert-dialog.d.ts +19 -0
- package/dist/components/alert-dialog.d.ts.map +1 -0
- package/dist/components/alert-dialog.js +42 -0
- package/dist/components/alert.d.ts +10 -0
- package/dist/components/alert.d.ts.map +1 -0
- package/dist/components/alert.js +24 -0
- package/dist/components/artifact-panel.d.ts +131 -0
- package/dist/components/artifact-panel.d.ts.map +1 -0
- package/dist/components/artifact-panel.js +189 -0
- package/dist/components/aspect-ratio.d.ts +4 -0
- package/dist/components/aspect-ratio.d.ts.map +1 -0
- package/dist/components/aspect-ratio.js +7 -0
- package/dist/components/automation-section.d.ts +76 -0
- package/dist/components/automation-section.d.ts.map +1 -0
- package/dist/components/automation-section.js +80 -0
- package/dist/components/avatar.d.ts +12 -0
- package/dist/components/avatar.d.ts.map +1 -0
- package/dist/components/avatar.js +23 -0
- package/dist/components/badge.d.ts +10 -0
- package/dist/components/badge.d.ts.map +1 -0
- package/dist/components/badge.js +25 -0
- package/dist/components/benefits-bento.d.ts +15 -0
- package/dist/components/benefits-bento.d.ts.map +1 -0
- package/dist/components/benefits-bento.js +6 -0
- package/dist/components/bento.d.ts +28 -0
- package/dist/components/bento.d.ts.map +1 -0
- package/dist/components/bento.js +48 -0
- package/dist/components/brand.d.ts +9 -0
- package/dist/components/brand.d.ts.map +1 -0
- package/dist/components/brand.js +16 -0
- package/dist/components/breadcrumb.d.ts +12 -0
- package/dist/components/breadcrumb.d.ts.map +1 -0
- package/dist/components/breadcrumb.js +28 -0
- package/dist/components/button-group.d.ts +12 -0
- package/dist/components/button-group.d.ts.map +1 -0
- package/dist/components/button-group.js +28 -0
- package/dist/components/button.d.ts +11 -0
- package/dist/components/button.d.ts.map +1 -0
- package/dist/components/button.js +36 -0
- package/dist/components/calendar.d.ts +9 -0
- package/dist/components/calendar.d.ts.map +1 -0
- package/dist/components/calendar.js +76 -0
- package/dist/components/card-marketing.d.ts +30 -0
- package/dist/components/card-marketing.d.ts.map +1 -0
- package/dist/components/card-marketing.js +48 -0
- package/dist/components/card.d.ts +10 -0
- package/dist/components/card.d.ts.map +1 -0
- package/dist/components/card.js +24 -0
- package/dist/components/carousel.d.ts +20 -0
- package/dist/components/carousel.d.ts.map +1 -0
- package/dist/components/carousel.js +91 -0
- package/dist/components/chart.d.ts +44 -0
- package/dist/components/chart.d.ts.map +1 -0
- package/dist/components/chart.js +132 -0
- package/dist/components/checkbox.d.ts +5 -0
- package/dist/components/checkbox.d.ts.map +1 -0
- package/dist/components/checkbox.js +9 -0
- package/dist/components/code-editor-mockup.d.ts +25 -0
- package/dist/components/code-editor-mockup.d.ts.map +1 -0
- package/dist/components/code-editor-mockup.js +47 -0
- package/dist/components/collapsible.d.ts +6 -0
- package/dist/components/collapsible.d.ts.map +1 -0
- package/dist/components/collapsible.js +13 -0
- package/dist/components/combobox.d.ts +25 -0
- package/dist/components/combobox.d.ts.map +1 -0
- package/dist/components/combobox.js +58 -0
- package/dist/components/command.d.ts +19 -0
- package/dist/components/command.d.ts.map +1 -0
- package/dist/components/command.js +34 -0
- package/dist/components/contact.d.ts +20 -0
- package/dist/components/contact.d.ts.map +1 -0
- package/dist/components/contact.js +24 -0
- package/dist/components/context-menu.d.ts +26 -0
- package/dist/components/context-menu.d.ts.map +1 -0
- package/dist/components/context-menu.js +51 -0
- package/dist/components/dashboard-shell.d.ts +24 -0
- package/dist/components/dashboard-shell.d.ts.map +1 -0
- package/dist/components/dashboard-shell.js +8 -0
- package/dist/components/demo-surface.d.ts +26 -0
- package/dist/components/demo-surface.d.ts.map +1 -0
- package/dist/components/demo-surface.js +14 -0
- package/dist/components/desktop-shell.d.ts +28 -0
- package/dist/components/desktop-shell.d.ts.map +1 -0
- package/dist/components/desktop-shell.js +8 -0
- package/dist/components/dialog.d.ts +18 -0
- package/dist/components/dialog.d.ts.map +1 -0
- package/dist/components/dialog.js +37 -0
- package/dist/components/direction.d.ts +8 -0
- package/dist/components/direction.d.ts.map +1 -0
- package/dist/components/direction.js +8 -0
- package/dist/components/drawer.d.ts +14 -0
- package/dist/components/drawer.d.ts.map +1 -0
- package/dist/components/drawer.js +34 -0
- package/dist/components/dropdown-menu.d.ts +26 -0
- package/dist/components/dropdown-menu.d.ts.map +1 -0
- package/dist/components/dropdown-menu.js +51 -0
- package/dist/components/empty.d.ts +12 -0
- package/dist/components/empty.d.ts.map +1 -0
- package/dist/components/empty.js +33 -0
- package/dist/components/fact-cell.d.ts +21 -0
- package/dist/components/fact-cell.d.ts.map +1 -0
- package/dist/components/fact-cell.js +29 -0
- package/dist/components/faq-item.d.ts +25 -0
- package/dist/components/faq-item.d.ts.map +1 -0
- package/dist/components/faq-item.js +25 -0
- package/dist/components/faq.d.ts +16 -0
- package/dist/components/faq.d.ts.map +1 -0
- package/dist/components/faq.js +18 -0
- package/dist/components/feedback-state.d.ts +14 -0
- package/dist/components/feedback-state.d.ts.map +1 -0
- package/dist/components/feedback-state.js +70 -0
- package/dist/components/field.d.ts +25 -0
- package/dist/components/field.d.ts.map +1 -0
- package/dist/components/field.js +76 -0
- package/dist/components/files-preview.d.ts +36 -0
- package/dist/components/files-preview.d.ts.map +1 -0
- package/dist/components/files-preview.js +96 -0
- package/dist/components/footer.d.ts +32 -0
- package/dist/components/footer.d.ts.map +1 -0
- package/dist/components/footer.js +53 -0
- package/dist/components/form.d.ts +25 -0
- package/dist/components/form.d.ts.map +1 -0
- package/dist/components/form.js +59 -0
- package/dist/components/hero-split.d.ts +23 -0
- package/dist/components/hero-split.d.ts.map +1 -0
- package/dist/components/hero-split.js +34 -0
- package/dist/components/hover-card.d.ts +7 -0
- package/dist/components/hover-card.d.ts.map +1 -0
- package/dist/components/hover-card.js +14 -0
- package/dist/components/input-group.d.ts +17 -0
- package/dist/components/input-group.d.ts.map +1 -0
- package/dist/components/input-group.js +63 -0
- package/dist/components/input-otp.d.ts +12 -0
- package/dist/components/input-otp.d.ts.map +1 -0
- package/dist/components/input-otp.js +21 -0
- package/dist/components/input.d.ts +4 -0
- package/dist/components/input.d.ts.map +1 -0
- package/dist/components/input.js +6 -0
- package/dist/components/installer-shell.d.ts +25 -0
- package/dist/components/installer-shell.d.ts.map +1 -0
- package/dist/components/installer-shell.js +36 -0
- package/dist/components/item.d.ts +24 -0
- package/dist/components/item.d.ts.map +1 -0
- package/dist/components/item.js +67 -0
- package/dist/components/kbd.d.ts +4 -0
- package/dist/components/kbd.d.ts.map +1 -0
- package/dist/components/kbd.js +9 -0
- package/dist/components/label.d.ts +5 -0
- package/dist/components/label.d.ts.map +1 -0
- package/dist/components/label.js +8 -0
- package/dist/components/logo-band.d.ts +23 -0
- package/dist/components/logo-band.d.ts.map +1 -0
- package/dist/components/logo-band.js +35 -0
- package/dist/components/logo-tile.d.ts +21 -0
- package/dist/components/logo-tile.d.ts.map +1 -0
- package/dist/components/logo-tile.js +27 -0
- package/dist/components/media-mount.d.ts +13 -0
- package/dist/components/media-mount.d.ts.map +1 -0
- package/dist/components/media-mount.js +17 -0
- package/dist/components/menubar.d.ts +27 -0
- package/dist/components/menubar.d.ts.map +1 -0
- package/dist/components/menubar.js +54 -0
- package/dist/components/native-select.d.ts +8 -0
- package/dist/components/native-select.d.ts.map +1 -0
- package/dist/components/native-select.js +13 -0
- package/dist/components/nav-bar.d.ts +20 -0
- package/dist/components/nav-bar.d.ts.map +1 -0
- package/dist/components/nav-bar.js +30 -0
- package/dist/components/navigation-menu.d.ts +15 -0
- package/dist/components/navigation-menu.d.ts.map +1 -0
- package/dist/components/navigation-menu.js +32 -0
- package/dist/components/newsletter.d.ts +24 -0
- package/dist/components/newsletter.d.ts.map +1 -0
- package/dist/components/newsletter.js +31 -0
- package/dist/components/page-frame.d.ts +30 -0
- package/dist/components/page-frame.d.ts.map +1 -0
- package/dist/components/page-frame.js +30 -0
- package/dist/components/pagination.d.ts +14 -0
- package/dist/components/pagination.d.ts.map +1 -0
- package/dist/components/pagination.js +29 -0
- package/dist/components/plugin-slot-boundary.d.ts +27 -0
- package/dist/components/plugin-slot-boundary.d.ts.map +1 -0
- package/dist/components/plugin-slot-boundary.js +24 -0
- package/dist/components/popover.d.ts +11 -0
- package/dist/components/popover.d.ts.map +1 -0
- package/dist/components/popover.js +26 -0
- package/dist/components/pricing-card.d.ts +35 -0
- package/dist/components/pricing-card.d.ts.map +1 -0
- package/dist/components/pricing-card.js +55 -0
- package/dist/components/pricing.d.ts +28 -0
- package/dist/components/pricing.d.ts.map +1 -0
- package/dist/components/pricing.js +22 -0
- package/dist/components/progress.d.ts +5 -0
- package/dist/components/progress.d.ts.map +1 -0
- package/dist/components/progress.js +8 -0
- package/dist/components/proof-slot.d.ts +8 -0
- package/dist/components/proof-slot.d.ts.map +1 -0
- package/dist/components/proof-slot.js +8 -0
- package/dist/components/quote-card.d.ts +23 -0
- package/dist/components/quote-card.d.ts.map +1 -0
- package/dist/components/quote-card.js +36 -0
- package/dist/components/radio-group.d.ts +6 -0
- package/dist/components/radio-group.d.ts.map +1 -0
- package/dist/components/radio-group.js +12 -0
- package/dist/components/resizable.d.ts +8 -0
- package/dist/components/resizable.d.ts.map +1 -0
- package/dist/components/resizable.js +14 -0
- package/dist/components/scroll-area.d.ts +6 -0
- package/dist/components/scroll-area.d.ts.map +1 -0
- package/dist/components/scroll-area.js +13 -0
- package/dist/components/section-intro.d.ts +18 -0
- package/dist/components/section-intro.d.ts.map +1 -0
- package/dist/components/section-intro.js +22 -0
- package/dist/components/select.d.ts +16 -0
- package/dist/components/select.d.ts.map +1 -0
- package/dist/components/select.js +38 -0
- package/dist/components/separator.d.ts +5 -0
- package/dist/components/separator.d.ts.map +1 -0
- package/dist/components/separator.js +8 -0
- package/dist/components/settings-section.d.ts +31 -0
- package/dist/components/settings-section.d.ts.map +1 -0
- package/dist/components/settings-section.js +37 -0
- package/dist/components/sheet.d.ts +15 -0
- package/dist/components/sheet.d.ts.map +1 -0
- package/dist/components/sheet.js +40 -0
- package/dist/components/shift-band.d.ts +14 -0
- package/dist/components/shift-band.d.ts.map +1 -0
- package/dist/components/shift-band.js +10 -0
- package/dist/components/sidebar.d.ts +70 -0
- package/dist/components/sidebar.d.ts.map +1 -0
- package/dist/components/sidebar.js +212 -0
- package/dist/components/skeleton.d.ts +3 -0
- package/dist/components/skeleton.d.ts.map +1 -0
- package/dist/components/skeleton.js +6 -0
- package/dist/components/slider.d.ts +5 -0
- package/dist/components/slider.d.ts.map +1 -0
- package/dist/components/slider.js +14 -0
- package/dist/components/sonner.d.ts +4 -0
- package/dist/components/sonner.d.ts.map +1 -0
- package/dist/components/sonner.js +19 -0
- package/dist/components/spinner.d.ts +3 -0
- package/dist/components/spinner.d.ts.map +1 -0
- package/dist/components/spinner.js +7 -0
- package/dist/components/stat-block.d.ts +20 -0
- package/dist/components/stat-block.d.ts.map +1 -0
- package/dist/components/stat-block.js +20 -0
- package/dist/components/stats-band.d.ts +18 -0
- package/dist/components/stats-band.d.ts.map +1 -0
- package/dist/components/stats-band.js +28 -0
- package/dist/components/switch.d.ts +7 -0
- package/dist/components/switch.d.ts.map +1 -0
- package/dist/components/switch.js +8 -0
- package/dist/components/table.d.ts +11 -0
- package/dist/components/table.d.ts.map +1 -0
- package/dist/components/table.js +28 -0
- package/dist/components/tabs.d.ts +12 -0
- package/dist/components/tabs.d.ts.map +1 -0
- package/dist/components/tabs.js +29 -0
- package/dist/components/testimonials.d.ts +21 -0
- package/dist/components/testimonials.d.ts.map +1 -0
- package/dist/components/testimonials.js +28 -0
- package/dist/components/textarea.d.ts +4 -0
- package/dist/components/textarea.d.ts.map +1 -0
- package/dist/components/textarea.js +6 -0
- package/dist/components/toggle-group.d.ts +10 -0
- package/dist/components/toggle-group.d.ts.map +1 -0
- package/dist/components/toggle-group.js +22 -0
- package/dist/components/toggle.d.ts +10 -0
- package/dist/components/toggle.d.ts.map +1 -0
- package/dist/components/toggle.js +26 -0
- package/dist/components/tooltip.d.ts +8 -0
- package/dist/components/tooltip.d.ts.map +1 -0
- package/dist/components/tooltip.js +17 -0
- package/dist/components/use-case-bento.d.ts +13 -0
- package/dist/components/use-case-bento.d.ts.map +1 -0
- package/dist/components/use-case-bento.js +9 -0
- package/dist/components/watch-it-work-band.d.ts +11 -0
- package/dist/components/watch-it-work-band.d.ts.map +1 -0
- package/dist/components/watch-it-work-band.js +8 -0
- package/dist/hooks/use-mobile.d.ts +2 -0
- package/dist/hooks/use-mobile.d.ts.map +1 -0
- package/dist/hooks/use-mobile.js +16 -0
- package/dist/index.d.ts +101 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +100 -0
- package/dist/lib/agent-attachment.d.ts +11 -0
- package/dist/lib/agent-attachment.d.ts.map +1 -0
- package/dist/lib/agent-attachment.js +19 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +5 -0
- package/dist/styles/globals.css +362 -0
- package/docs/agent-work-surfaces.md +98 -0
- package/docs/agents/nadicodeai-ui.md +229 -0
- package/docs/component-classification.md +44 -0
- package/docs/migration/nadia-consumer-readiness.md +85 -0
- package/docs/product-compositions.md +77 -0
- package/docs/product-sections.md +200 -0
- package/docs/terminal-tui-semantics.md +211 -0
- package/llms.txt +75 -0
- package/package.json +95 -0
- package/skills/nadicodeai-ui/SKILL.md +80 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { AlertTriangleIcon, BanIcon, CloudOffIcon, InboxIcon, LoaderCircleIcon, LockKeyholeIcon, SearchXIcon, } from "lucide-react";
|
|
4
|
+
import { cn } from "../lib/utils.js";
|
|
5
|
+
import { Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle, } from "./empty.js";
|
|
6
|
+
const feedbackStateDefaults = {
|
|
7
|
+
empty: {
|
|
8
|
+
title: "Nothing here yet",
|
|
9
|
+
description: "Add data or adjust the current view to continue.",
|
|
10
|
+
icon: InboxIcon,
|
|
11
|
+
},
|
|
12
|
+
loading: {
|
|
13
|
+
title: "Loading",
|
|
14
|
+
description: "Content is being prepared.",
|
|
15
|
+
icon: LoaderCircleIcon,
|
|
16
|
+
},
|
|
17
|
+
saving: {
|
|
18
|
+
title: "Saving",
|
|
19
|
+
description: "Changes are being applied.",
|
|
20
|
+
icon: LoaderCircleIcon,
|
|
21
|
+
},
|
|
22
|
+
error: {
|
|
23
|
+
title: "Something went wrong",
|
|
24
|
+
description: "Try again or use the recovery action for this surface.",
|
|
25
|
+
icon: AlertTriangleIcon,
|
|
26
|
+
},
|
|
27
|
+
permission: {
|
|
28
|
+
title: "Permission required",
|
|
29
|
+
description: "The current user cannot view or change this content.",
|
|
30
|
+
icon: LockKeyholeIcon,
|
|
31
|
+
},
|
|
32
|
+
offline: {
|
|
33
|
+
title: "Offline",
|
|
34
|
+
description: "Reconnect before continuing.",
|
|
35
|
+
icon: CloudOffIcon,
|
|
36
|
+
},
|
|
37
|
+
"no-results": {
|
|
38
|
+
title: "No results",
|
|
39
|
+
description: "Change the filters or search terms and try again.",
|
|
40
|
+
icon: SearchXIcon,
|
|
41
|
+
},
|
|
42
|
+
fatal: {
|
|
43
|
+
title: "Unable to render",
|
|
44
|
+
description: "This surface needs a recovery path from the consuming app.",
|
|
45
|
+
icon: BanIcon,
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
function getFeedbackRole(status) {
|
|
49
|
+
if (status === "error" ||
|
|
50
|
+
status === "fatal" ||
|
|
51
|
+
status === "permission" ||
|
|
52
|
+
status === "offline") {
|
|
53
|
+
return "alert";
|
|
54
|
+
}
|
|
55
|
+
if (status === "loading" || status === "saving") {
|
|
56
|
+
return "status";
|
|
57
|
+
}
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
function FeedbackState({ status, title, description, icon, actions, children, compact = false, className, ...props }) {
|
|
61
|
+
const fallback = feedbackStateDefaults[status];
|
|
62
|
+
const Icon = fallback.icon;
|
|
63
|
+
const stateRole = getFeedbackRole(status);
|
|
64
|
+
const stateIcon = icon ??
|
|
65
|
+
React.createElement(Icon, {
|
|
66
|
+
className: cn("size-5", (status === "loading" || status === "saving") && "animate-spin"),
|
|
67
|
+
});
|
|
68
|
+
return (_jsxs(Empty, { "data-slot": "feedback-state", "data-status": status, role: stateRole, "aria-live": stateRole === "alert" ? "assertive" : "polite", className: cn("border border-dashed bg-muted/30", compact && "gap-4 p-4 md:p-6", className), ...props, children: [_jsxs(EmptyHeader, { children: [_jsx(EmptyMedia, { variant: "icon", children: stateIcon }), _jsx(EmptyTitle, { children: title ?? fallback.title }), (description ?? fallback.description) && (_jsx(EmptyDescription, { children: description ?? fallback.description }))] }), (actions || children) && (_jsxs(EmptyContent, { "data-slot": "feedback-state-content", children: [children, actions && (_jsx("div", { "data-slot": "feedback-state-actions", className: "flex flex-wrap items-center justify-center gap-2", children: actions }))] }))] }));
|
|
69
|
+
}
|
|
70
|
+
export { FeedbackState };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type VariantProps } from "class-variance-authority";
|
|
2
|
+
import { Label } from "./label";
|
|
3
|
+
declare function FieldSet({ className, ...props }: React.ComponentProps<"fieldset">): import("react").JSX.Element;
|
|
4
|
+
declare function FieldLegend({ className, variant, ...props }: React.ComponentProps<"legend"> & {
|
|
5
|
+
variant?: "legend" | "label";
|
|
6
|
+
}): import("react").JSX.Element;
|
|
7
|
+
declare function FieldGroup({ className, ...props }: React.ComponentProps<"div">): import("react").JSX.Element;
|
|
8
|
+
declare const fieldVariants: (props?: ({
|
|
9
|
+
orientation?: "horizontal" | "vertical" | "responsive" | null | undefined;
|
|
10
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
11
|
+
declare function Field({ className, orientation, ...props }: React.ComponentProps<"div"> & VariantProps<typeof fieldVariants>): import("react").JSX.Element;
|
|
12
|
+
declare function FieldContent({ className, ...props }: React.ComponentProps<"div">): import("react").JSX.Element;
|
|
13
|
+
declare function FieldLabel({ className, ...props }: React.ComponentProps<typeof Label>): import("react").JSX.Element;
|
|
14
|
+
declare function FieldTitle({ className, ...props }: React.ComponentProps<"div">): import("react").JSX.Element;
|
|
15
|
+
declare function FieldDescription({ className, ...props }: React.ComponentProps<"p">): import("react").JSX.Element;
|
|
16
|
+
declare function FieldSeparator({ children, className, ...props }: React.ComponentProps<"div"> & {
|
|
17
|
+
children?: React.ReactNode;
|
|
18
|
+
}): import("react").JSX.Element;
|
|
19
|
+
declare function FieldError({ className, children, errors, ...props }: React.ComponentProps<"div"> & {
|
|
20
|
+
errors?: Array<{
|
|
21
|
+
message?: string;
|
|
22
|
+
} | undefined>;
|
|
23
|
+
}): import("react").JSX.Element | null;
|
|
24
|
+
export { Field, FieldLabel, FieldDescription, FieldError, FieldGroup, FieldLegend, FieldSeparator, FieldSet, FieldContent, FieldTitle, };
|
|
25
|
+
//# sourceMappingURL=field.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../../src/components/field.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAGjE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAG1C,iBAAS,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,+BAY1E;AAED,iBAAS,WAAW,CAAC,EACnB,SAAS,EACT,OAAkB,EAClB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAA;CAAE,+BAcnE;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,+BAWvE;AAED,QAAA,MAAM,aAAa;;8EAsBlB,CAAA;AAED,iBAAS,KAAK,CAAC,EACb,SAAS,EACT,WAAwB,EACxB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,OAAO,aAAa,CAAC,+BAUlE;AAED,iBAAS,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,+BAWzE;AAED,iBAAS,UAAU,CAAC,EAClB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,KAAK,CAAC,+BAapC;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,+BAWvE;AAED,iBAAS,gBAAgB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,+BAa3E;AAED,iBAAS,cAAc,CAAC,EACtB,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC3B,+BAsBA;AAED,iBAAS,UAAU,CAAC,EAClB,SAAS,EACT,QAAQ,EACR,MAAM,EACN,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC,CAAA;CACjD,sCA0CA;AAED,OAAO,EACL,KAAK,EACL,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,WAAW,EACX,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,UAAU,GACX,CAAA"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useMemo } from "react";
|
|
4
|
+
import { cva } from "class-variance-authority";
|
|
5
|
+
import { cn } from "../lib/utils.js";
|
|
6
|
+
import { Label } from "./label.js";
|
|
7
|
+
import { Separator } from "./separator.js";
|
|
8
|
+
function FieldSet({ className, ...props }) {
|
|
9
|
+
return (_jsx("fieldset", { "data-slot": "field-set", className: cn("flex flex-col gap-6", "has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3", className), ...props }));
|
|
10
|
+
}
|
|
11
|
+
function FieldLegend({ className, variant = "legend", ...props }) {
|
|
12
|
+
return (_jsx("legend", { "data-slot": "field-legend", "data-variant": variant, className: cn("mb-3 font-medium", "data-[variant=legend]:text-base", "data-[variant=label]:text-sm", className), ...props }));
|
|
13
|
+
}
|
|
14
|
+
function FieldGroup({ className, ...props }) {
|
|
15
|
+
return (_jsx("div", { "data-slot": "field-group", className: cn("group/field-group @container/field-group flex w-full flex-col gap-7 data-[slot=checkbox-group]:gap-3 [&>[data-slot=field-group]]:gap-4", className), ...props }));
|
|
16
|
+
}
|
|
17
|
+
const fieldVariants = cva("group/field flex w-full gap-3 data-[invalid=true]:text-destructive", {
|
|
18
|
+
variants: {
|
|
19
|
+
orientation: {
|
|
20
|
+
vertical: ["flex-col [&>*]:w-full [&>.sr-only]:w-auto"],
|
|
21
|
+
horizontal: [
|
|
22
|
+
"flex-row items-center",
|
|
23
|
+
"[&>[data-slot=field-label]]:flex-auto",
|
|
24
|
+
"has-[>[data-slot=field-content]]:items-start has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px",
|
|
25
|
+
],
|
|
26
|
+
responsive: [
|
|
27
|
+
"flex-col @md/field-group:flex-row @md/field-group:items-center [&>*]:w-full @md/field-group:[&>*]:w-auto [&>.sr-only]:w-auto",
|
|
28
|
+
"@md/field-group:[&>[data-slot=field-label]]:flex-auto",
|
|
29
|
+
"@md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px",
|
|
30
|
+
],
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
defaultVariants: {
|
|
34
|
+
orientation: "vertical",
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
function Field({ className, orientation = "vertical", ...props }) {
|
|
38
|
+
return (_jsx("div", { role: "group", "data-slot": "field", "data-orientation": orientation, className: cn(fieldVariants({ orientation }), className), ...props }));
|
|
39
|
+
}
|
|
40
|
+
function FieldContent({ className, ...props }) {
|
|
41
|
+
return (_jsx("div", { "data-slot": "field-content", className: cn("group/field-content flex flex-1 flex-col gap-1.5 leading-snug", className), ...props }));
|
|
42
|
+
}
|
|
43
|
+
function FieldLabel({ className, ...props }) {
|
|
44
|
+
return (_jsx(Label, { "data-slot": "field-label", className: cn("group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50", "has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col has-[>[data-slot=field]]:rounded-md has-[>[data-slot=field]]:border [&>*]:data-[slot=field]:p-4", "has-data-[state=checked]:border-primary has-data-[state=checked]:bg-primary/5", className), ...props }));
|
|
45
|
+
}
|
|
46
|
+
function FieldTitle({ className, ...props }) {
|
|
47
|
+
return (_jsx("div", { "data-slot": "field-label", className: cn("flex w-fit items-center gap-2 text-sm leading-snug font-medium group-data-[disabled=true]/field:opacity-50", className), ...props }));
|
|
48
|
+
}
|
|
49
|
+
function FieldDescription({ className, ...props }) {
|
|
50
|
+
return (_jsx("p", { "data-slot": "field-description", className: cn("text-sm leading-normal font-normal text-muted-foreground group-has-[[data-orientation=horizontal]]/field:text-balance", "last:mt-0 nth-last-2:-mt-1 [[data-variant=legend]+&]:-mt-1.5", "[&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary", className), ...props }));
|
|
51
|
+
}
|
|
52
|
+
function FieldSeparator({ children, className, ...props }) {
|
|
53
|
+
return (_jsxs("div", { "data-slot": "field-separator", "data-content": !!children, className: cn("relative -my-2 h-5 text-sm group-data-[variant=outline]/field-group:-mb-2", className), ...props, children: [_jsx(Separator, { className: "absolute inset-0 top-1/2" }), children && (_jsx("span", { className: "relative mx-auto block w-fit bg-background px-2 text-muted-foreground", "data-slot": "field-separator-content", children: children }))] }));
|
|
54
|
+
}
|
|
55
|
+
function FieldError({ className, children, errors, ...props }) {
|
|
56
|
+
const content = useMemo(() => {
|
|
57
|
+
if (children) {
|
|
58
|
+
return children;
|
|
59
|
+
}
|
|
60
|
+
if (!errors?.length) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
const uniqueErrors = [
|
|
64
|
+
...new Map(errors.map((error) => [error?.message, error])).values(),
|
|
65
|
+
];
|
|
66
|
+
if (uniqueErrors?.length == 1) {
|
|
67
|
+
return uniqueErrors[0]?.message;
|
|
68
|
+
}
|
|
69
|
+
return (_jsx("ul", { className: "ml-4 flex list-disc flex-col gap-1", children: uniqueErrors.map((error, index) => error?.message && _jsx("li", { children: error.message }, index)) }));
|
|
70
|
+
}, [children, errors]);
|
|
71
|
+
if (!content) {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
return (_jsx("div", { role: "alert", "data-slot": "field-error", className: cn("text-sm font-normal text-destructive", className), ...props, children: content }));
|
|
75
|
+
}
|
|
76
|
+
export { Field, FieldLabel, FieldDescription, FieldError, FieldGroup, FieldLegend, FieldSeparator, FieldSet, FieldContent, FieldTitle, };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import type { BundledLanguage } from "shiki";
|
|
3
|
+
import { FileTree } from "./ai-elements/file-tree";
|
|
4
|
+
import { type AgentRedactionRule } from "./artifact-panel";
|
|
5
|
+
export type AgentFileStatus = "unchanged" | "added" | "modified" | "deleted" | "blocked" | "running";
|
|
6
|
+
export type AgentFileNode = {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
path: string;
|
|
10
|
+
type: "file" | "directory";
|
|
11
|
+
status?: AgentFileStatus;
|
|
12
|
+
description?: string;
|
|
13
|
+
language?: BundledLanguage;
|
|
14
|
+
content?: string;
|
|
15
|
+
redaction?: AgentRedactionRule;
|
|
16
|
+
children?: AgentFileNode[];
|
|
17
|
+
};
|
|
18
|
+
declare function ProjectFileTree({ files, selectedPath, defaultExpandedPaths, expandedPaths, onExpandedPathsChange, onSelectFile, className, ...props }: Omit<React.ComponentProps<typeof FileTree>, "defaultExpanded" | "expanded" | "onExpandedChange" | "onSelect"> & {
|
|
19
|
+
files: AgentFileNode[];
|
|
20
|
+
selectedPath?: string;
|
|
21
|
+
defaultExpandedPaths?: string[];
|
|
22
|
+
expandedPaths?: string[];
|
|
23
|
+
onExpandedPathsChange?: (paths: string[]) => void;
|
|
24
|
+
onSelectFile?: (node: AgentFileNode) => void;
|
|
25
|
+
}): React.JSX.Element;
|
|
26
|
+
declare function FilesPreview({ files, selectedPath, defaultExpandedPaths, onSelectFile, previewActions, className, treeClassName, previewClassName, ...props }: React.ComponentProps<"div"> & {
|
|
27
|
+
files: AgentFileNode[];
|
|
28
|
+
selectedPath?: string;
|
|
29
|
+
defaultExpandedPaths?: string[];
|
|
30
|
+
onSelectFile?: (node: AgentFileNode) => void;
|
|
31
|
+
previewActions?: React.ReactNode;
|
|
32
|
+
treeClassName?: string;
|
|
33
|
+
previewClassName?: string;
|
|
34
|
+
}): React.JSX.Element;
|
|
35
|
+
export { FilesPreview, ProjectFileTree };
|
|
36
|
+
//# sourceMappingURL=files-preview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files-preview.d.ts","sourceRoot":"","sources":["../../src/components/files-preview.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAS9B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,OAAO,CAAA;AAE5C,OAAO,EACL,QAAQ,EAGT,MAAM,oCAAoC,CAAA;AAE3C,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,6BAA6B,CAAA;AAKpC,MAAM,MAAM,eAAe,GACvB,WAAW,GACX,OAAO,GACP,UAAU,GACV,SAAS,GACT,SAAS,GACT,SAAS,CAAA;AAEb,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,GAAG,WAAW,CAAA;IAC1B,MAAM,CAAC,EAAE,eAAe,CAAA;IACxB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,eAAe,CAAA;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,kBAAkB,CAAA;IAC9B,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAA;CAC3B,CAAA;AAqFD,iBAAS,eAAe,CAAC,EACvB,KAAK,EACL,YAAY,EACZ,oBAAyB,EACzB,aAAa,EACb,qBAAqB,EACrB,YAAY,EACZ,SAAS,EACT,GAAG,KAAK,EACT,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,QAAQ,CAAC,EAAE,iBAAiB,GAAG,UAAU,GAAG,kBAAkB,GAAG,UAAU,CAAC,GAAG;IACjH,KAAK,EAAE,aAAa,EAAE,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC/B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,qBAAqB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;IACjD,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAA;CAC7C,qBAuCA;AA8CD,iBAAS,YAAY,CAAC,EACpB,KAAK,EACL,YAAY,EACZ,oBAAoB,EACpB,YAAY,EACZ,cAAc,EACd,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,KAAK,EAAE,aAAa,EAAE,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC/B,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAA;IAC5C,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAChC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B,qBAgDA;AAED,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,CAAA"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { CircleAlertIcon, CircleCheckIcon, CircleDashedIcon, CircleDotIcon, FileIcon, FolderIcon, } from "lucide-react";
|
|
5
|
+
import { FileTree, FileTreeFile, FileTreeFolder, } from "./ai-elements/file-tree.js";
|
|
6
|
+
import { CodeBlock } from "./ai-elements/code-block.js";
|
|
7
|
+
import { RedactedNotice, getAgentRedactionText, } from "./artifact-panel.js";
|
|
8
|
+
import { Badge } from "./badge.js";
|
|
9
|
+
import { FeedbackState } from "./feedback-state.js";
|
|
10
|
+
import { cn } from "../lib/utils.js";
|
|
11
|
+
const defaultCodeLanguage = "plaintext";
|
|
12
|
+
const fileStatusLabels = {
|
|
13
|
+
added: "Added",
|
|
14
|
+
blocked: "Blocked",
|
|
15
|
+
deleted: "Deleted",
|
|
16
|
+
modified: "Modified",
|
|
17
|
+
running: "Running",
|
|
18
|
+
unchanged: "Unchanged",
|
|
19
|
+
};
|
|
20
|
+
const fileStatusIcons = {
|
|
21
|
+
added: CircleCheckIcon,
|
|
22
|
+
blocked: CircleAlertIcon,
|
|
23
|
+
deleted: CircleDashedIcon,
|
|
24
|
+
modified: CircleDotIcon,
|
|
25
|
+
running: CircleDotIcon,
|
|
26
|
+
unchanged: CircleDashedIcon,
|
|
27
|
+
};
|
|
28
|
+
function collectNodes(nodes, map = new Map()) {
|
|
29
|
+
for (const node of nodes) {
|
|
30
|
+
map.set(node.path, node);
|
|
31
|
+
if (node.children) {
|
|
32
|
+
collectNodes(node.children, map);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return map;
|
|
36
|
+
}
|
|
37
|
+
function findFirstFile(nodes) {
|
|
38
|
+
for (const node of nodes) {
|
|
39
|
+
if (node.type === "file") {
|
|
40
|
+
return node;
|
|
41
|
+
}
|
|
42
|
+
const child = findFirstFile(node.children ?? []);
|
|
43
|
+
if (child) {
|
|
44
|
+
return child;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
function FileStatusBadge({ status }) {
|
|
50
|
+
if (!status || status === "unchanged") {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
const Icon = fileStatusIcons[status];
|
|
54
|
+
return (_jsxs(Badge, { "data-slot": "file-status-badge", variant: "outline", className: "gap-1", children: [_jsx(Icon, { className: "size-3" }), fileStatusLabels[status]] }));
|
|
55
|
+
}
|
|
56
|
+
function renderFileNode(node) {
|
|
57
|
+
if (node.type === "directory") {
|
|
58
|
+
return (_jsx(FileTreeFolder, { path: node.path, name: node.name, children: (node.children ?? []).map(renderFileNode) }, node.id));
|
|
59
|
+
}
|
|
60
|
+
return (_jsxs(FileTreeFile, { path: node.path, name: node.name, children: [_jsx("span", { className: "size-4 shrink-0" }), _jsx(FileIcon, { className: "size-4 shrink-0 text-muted-foreground" }), _jsx("span", { className: "min-w-0 flex-1 truncate", children: node.name }), _jsx(FileStatusBadge, { status: node.status })] }, node.id));
|
|
61
|
+
}
|
|
62
|
+
function ProjectFileTree({ files, selectedPath, defaultExpandedPaths = [], expandedPaths, onExpandedPathsChange, onSelectFile, className, ...props }) {
|
|
63
|
+
const nodeByPath = React.useMemo(() => collectNodes(files), [files]);
|
|
64
|
+
const defaultExpanded = React.useMemo(() => new Set(defaultExpandedPaths), [defaultExpandedPaths]);
|
|
65
|
+
const controlledExpanded = React.useMemo(() => (expandedPaths ? new Set(expandedPaths) : undefined), [expandedPaths]);
|
|
66
|
+
return (_jsx("div", { "data-slot": "project-file-tree", className: className, children: _jsx(FileTree, { selectedPath: selectedPath, defaultExpanded: defaultExpanded, expanded: controlledExpanded, onExpandedChange: (paths) => onExpandedPathsChange?.([...paths]), onSelect: (path) => {
|
|
67
|
+
const node = nodeByPath.get(path);
|
|
68
|
+
if (node) {
|
|
69
|
+
onSelectFile?.(node);
|
|
70
|
+
}
|
|
71
|
+
}, ...props, children: files.length > 0 ? (files.map(renderFileNode)) : (_jsx(FeedbackState, { status: "empty", title: "No files", compact: true, className: "rounded-md border-0 bg-transparent" })) }) }));
|
|
72
|
+
}
|
|
73
|
+
function FilePreviewBody({ file }) {
|
|
74
|
+
if (!file) {
|
|
75
|
+
return (_jsx(FeedbackState, { status: "empty", title: "No file selected", compact: true, className: "rounded-md border-0 bg-transparent" }));
|
|
76
|
+
}
|
|
77
|
+
if (file.redaction) {
|
|
78
|
+
return _jsx(RedactedNotice, { redaction: file.redaction });
|
|
79
|
+
}
|
|
80
|
+
if (file.type === "directory") {
|
|
81
|
+
return (_jsxs("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [_jsx(FolderIcon, { className: "size-4" }), file.description ?? "Directory selected."] }));
|
|
82
|
+
}
|
|
83
|
+
if (file.content) {
|
|
84
|
+
return (_jsx(CodeBlock, { code: file.content, language: file.language ?? defaultCodeLanguage, showLineNumbers: true }));
|
|
85
|
+
}
|
|
86
|
+
return (_jsx("div", { className: "text-sm text-muted-foreground", children: getAgentRedactionText(file.redaction) ??
|
|
87
|
+
file.description ??
|
|
88
|
+
"File content is not loaded." }));
|
|
89
|
+
}
|
|
90
|
+
function FilesPreview({ files, selectedPath, defaultExpandedPaths, onSelectFile, previewActions, className, treeClassName, previewClassName, ...props }) {
|
|
91
|
+
const nodeByPath = React.useMemo(() => collectNodes(files), [files]);
|
|
92
|
+
const selectedFile = (selectedPath ? nodeByPath.get(selectedPath) : undefined) ??
|
|
93
|
+
findFirstFile(files);
|
|
94
|
+
return (_jsxs("div", { "data-slot": "files-preview", className: cn("grid gap-4 rounded-lg border bg-background p-3 md:grid-cols-[minmax(14rem,18rem)_1fr]", className), ...props, children: [_jsx(ProjectFileTree, { files: files, selectedPath: selectedFile?.path, defaultExpandedPaths: defaultExpandedPaths, onSelectFile: onSelectFile, className: treeClassName }), _jsxs("section", { "data-slot": "files-preview-panel", className: cn("min-w-0 rounded-md border bg-card", previewClassName), children: [_jsxs("header", { className: "flex items-center justify-between gap-3 border-b px-3 py-2", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "truncate text-sm font-medium", children: selectedFile?.name ?? "Preview" }), selectedFile?.path && (_jsx("div", { className: "truncate text-xs text-muted-foreground", children: selectedFile.path }))] }), _jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [_jsx(FileStatusBadge, { status: selectedFile?.status }), previewActions] })] }), _jsx("div", { className: "p-3", children: _jsx(FilePreviewBody, { file: selectedFile }) })] })] }));
|
|
95
|
+
}
|
|
96
|
+
export { FilesPreview, ProjectFileTree };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
/**
|
|
3
|
+
* footer — bottom footer/navigation row chrome (replaces the retired `.nc-footer`
|
|
4
|
+
* + its `data-variant="mega"`).
|
|
5
|
+
*
|
|
6
|
+
* SINGLE-OWNER SEAM: the only edge the footer owns is its top border
|
|
7
|
+
* (`border-t border-border`) on a canvas surface — it draws no other line. The flat
|
|
8
|
+
* inner row is a wrapping flex line capped to the frame measure with
|
|
9
|
+
* `justify-between`: brand leading, meta trailing, nav between. The `variant="mega"`
|
|
10
|
+
* adds exactly ONE extra inner seam — a hairline above the meta strip
|
|
11
|
+
* (`FooterMegaMeta`'s top border) — owned once there; the link columns separate by
|
|
12
|
+
* whitespace gaps, never rails, so no coordinate carries two borders.
|
|
13
|
+
*
|
|
14
|
+
* A11y: nav links expose a `--ring` (link-green) focus outline; the consumer wraps
|
|
15
|
+
* link groups in `<nav aria-label>`. Token-only; no `dark:` styling.
|
|
16
|
+
*/
|
|
17
|
+
declare function Footer({ className, variant, ...props }: React.ComponentProps<"footer"> & {
|
|
18
|
+
variant?: "flat" | "mega";
|
|
19
|
+
}): React.JSX.Element;
|
|
20
|
+
declare function FooterInner({ className, variant, ...props }: React.ComponentProps<"div"> & {
|
|
21
|
+
variant?: "flat" | "mega";
|
|
22
|
+
}): React.JSX.Element;
|
|
23
|
+
declare function FooterBrand({ className, ...props }: React.ComponentProps<"a">): React.JSX.Element;
|
|
24
|
+
declare function FooterNav({ className, ...props }: React.ComponentProps<"nav">): React.JSX.Element;
|
|
25
|
+
declare function FooterMeta({ className, ...props }: React.ComponentProps<"p">): React.JSX.Element;
|
|
26
|
+
declare function FooterMegaTop({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
27
|
+
declare function FooterMegaCols({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
28
|
+
declare function FooterMegaCol({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
29
|
+
declare function FooterMegaColTitle({ className, ...props }: React.ComponentProps<"p">): React.JSX.Element;
|
|
30
|
+
declare function FooterMegaMeta({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
31
|
+
export { Footer, FooterInner, FooterBrand, FooterNav, FooterMeta, FooterMegaTop, FooterMegaCols, FooterMegaCol, FooterMegaColTitle, FooterMegaMeta, };
|
|
32
|
+
//# sourceMappingURL=footer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"footer.d.ts","sourceRoot":"","sources":["../../src/components/footer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B;;;;;;;;;;;;;;GAcG;AAEH,iBAAS,MAAM,CAAC,EACd,SAAS,EACT,OAAgB,EAChB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,qBAahE;AAED,iBAAS,WAAW,CAAC,EACnB,SAAS,EACT,OAAgB,EAChB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,qBAc7D;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAWtE;AAED,iBAAS,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAWtE;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAQrE;AAID,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAW1E;AAED,iBAAS,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAW3E;AAED,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAW1E;AAED,iBAAS,kBAAkB,CAAC,EAC1B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAW3B;AAED,iBAAS,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAY3E;AAED,OAAO,EACL,MAAM,EACN,WAAW,EACX,WAAW,EACX,SAAS,EACT,UAAU,EACV,aAAa,EACb,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,cAAc,GACf,CAAA"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../lib/utils.js";
|
|
3
|
+
/**
|
|
4
|
+
* footer — bottom footer/navigation row chrome (replaces the retired `.nc-footer`
|
|
5
|
+
* + its `data-variant="mega"`).
|
|
6
|
+
*
|
|
7
|
+
* SINGLE-OWNER SEAM: the only edge the footer owns is its top border
|
|
8
|
+
* (`border-t border-border`) on a canvas surface — it draws no other line. The flat
|
|
9
|
+
* inner row is a wrapping flex line capped to the frame measure with
|
|
10
|
+
* `justify-between`: brand leading, meta trailing, nav between. The `variant="mega"`
|
|
11
|
+
* adds exactly ONE extra inner seam — a hairline above the meta strip
|
|
12
|
+
* (`FooterMegaMeta`'s top border) — owned once there; the link columns separate by
|
|
13
|
+
* whitespace gaps, never rails, so no coordinate carries two borders.
|
|
14
|
+
*
|
|
15
|
+
* A11y: nav links expose a `--ring` (link-green) focus outline; the consumer wraps
|
|
16
|
+
* link groups in `<nav aria-label>`. Token-only; no `dark:` styling.
|
|
17
|
+
*/
|
|
18
|
+
function Footer({ className, variant = "flat", ...props }) {
|
|
19
|
+
return (_jsx("footer", { "data-slot": "footer", "data-variant": variant, className: cn("border-t border-border bg-card px-6 py-8 [&_a]:no-underline", "[&_a:focus-visible]:outline [&_a:focus-visible]:outline-1 [&_a:focus-visible]:[outline-color:var(--ring)] [&_a:focus-visible]:outline-offset-2", className), ...props }));
|
|
20
|
+
}
|
|
21
|
+
function FooterInner({ className, variant = "flat", ...props }) {
|
|
22
|
+
return (_jsx("div", { "data-slot": "footer-inner", className: cn("mx-auto w-full max-w-[1200px]", variant === "mega"
|
|
23
|
+
? "grid gap-8"
|
|
24
|
+
: "flex flex-wrap items-center justify-between gap-4", className), ...props }));
|
|
25
|
+
}
|
|
26
|
+
function FooterBrand({ className, ...props }) {
|
|
27
|
+
return (_jsx("a", { "data-slot": "footer-brand", className: cn("inline-flex items-center gap-2.5 text-sm font-semibold text-foreground [&_img]:block [&_img]:h-6 [&_img]:w-auto [&_svg]:block [&_svg]:h-6 [&_svg]:w-auto", className), ...props }));
|
|
28
|
+
}
|
|
29
|
+
function FooterNav({ className, ...props }) {
|
|
30
|
+
return (_jsx("nav", { "data-slot": "footer-nav", className: cn("flex flex-wrap gap-3 text-sm text-[var(--nc-body)] [&_a]:text-inherit [&_a:hover]:text-foreground", className), ...props }));
|
|
31
|
+
}
|
|
32
|
+
function FooterMeta({ className, ...props }) {
|
|
33
|
+
return (_jsx("p", { "data-slot": "footer-meta", className: cn("m-0 text-sm text-muted-foreground", className), ...props }));
|
|
34
|
+
}
|
|
35
|
+
/* ── mega variant slots ────────────────────────────────────────────────── */
|
|
36
|
+
function FooterMegaTop({ className, ...props }) {
|
|
37
|
+
return (_jsx("div", { "data-slot": "footer-mega-top", className: cn("grid grid-cols-1 items-start gap-8 sm:grid-cols-[minmax(0,220px)_minmax(0,1fr)] sm:gap-x-12", className), ...props }));
|
|
38
|
+
}
|
|
39
|
+
function FooterMegaCols({ className, ...props }) {
|
|
40
|
+
return (_jsx("div", { "data-slot": "footer-mega-cols", className: cn("grid grid-cols-1 gap-6 sm:grid-cols-[repeat(auto-fit,minmax(140px,1fr))] sm:gap-x-8", className), ...props }));
|
|
41
|
+
}
|
|
42
|
+
function FooterMegaCol({ className, ...props }) {
|
|
43
|
+
return (_jsx("div", { "data-slot": "footer-mega-col", className: cn("grid content-start gap-2 [&_a]:text-sm [&_a]:text-[var(--nc-body)] [&_a:hover]:text-foreground", className), ...props }));
|
|
44
|
+
}
|
|
45
|
+
function FooterMegaColTitle({ className, ...props }) {
|
|
46
|
+
return (_jsx("p", { "data-slot": "footer-mega-col-title", className: cn("m-0 font-mono text-xs uppercase text-muted-foreground", className), ...props }));
|
|
47
|
+
}
|
|
48
|
+
function FooterMegaMeta({ className, ...props }) {
|
|
49
|
+
return (_jsx("div", { "data-slot": "footer-mega-meta", className: cn(
|
|
50
|
+
// the single inner seam the mega variant adds: a top hairline, owned once.
|
|
51
|
+
"flex flex-wrap items-center justify-between gap-x-6 gap-y-3 border-t border-border pt-6", className), ...props }));
|
|
52
|
+
}
|
|
53
|
+
export { Footer, FooterInner, FooterBrand, FooterNav, FooterMeta, FooterMegaTop, FooterMegaCols, FooterMegaCol, FooterMegaColTitle, FooterMegaMeta, };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import type { Label as LabelPrimitive } from "radix-ui";
|
|
3
|
+
import { Slot } from "radix-ui";
|
|
4
|
+
import { type ControllerProps, type FieldPath, type FieldValues } from "react-hook-form";
|
|
5
|
+
declare const Form: <TFieldValues extends FieldValues, TContext = any, TTransformedValues = TFieldValues>({ children, watch, getValues, getFieldState, setError, clearErrors, setValue, setValues, trigger, formState, resetField, reset, handleSubmit, unregister, control, register, setFocus, subscribe, }: import("react-hook-form").FormProviderProps<TFieldValues, TContext, TTransformedValues>) => React.JSX.Element;
|
|
6
|
+
declare const FormField: <TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>>({ ...props }: ControllerProps<TFieldValues, TName>) => React.JSX.Element;
|
|
7
|
+
declare const useFormField: () => {
|
|
8
|
+
invalid: boolean;
|
|
9
|
+
isDirty: boolean;
|
|
10
|
+
isTouched: boolean;
|
|
11
|
+
isValidating: boolean;
|
|
12
|
+
error?: import("react-hook-form").FieldError;
|
|
13
|
+
id: string;
|
|
14
|
+
name: string;
|
|
15
|
+
formItemId: string;
|
|
16
|
+
formDescriptionId: string;
|
|
17
|
+
formMessageId: string;
|
|
18
|
+
};
|
|
19
|
+
declare function FormItem({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
20
|
+
declare function FormLabel({ className, ...props }: React.ComponentProps<typeof LabelPrimitive.Root>): React.JSX.Element;
|
|
21
|
+
declare function FormControl({ ...props }: React.ComponentProps<typeof Slot.Root>): React.JSX.Element;
|
|
22
|
+
declare function FormDescription({ className, ...props }: React.ComponentProps<"p">): React.JSX.Element;
|
|
23
|
+
declare function FormMessage({ className, ...props }: React.ComponentProps<"p">): React.JSX.Element | null;
|
|
24
|
+
export { useFormField, Form, FormItem, FormLabel, FormControl, FormDescription, FormMessage, FormField, };
|
|
25
|
+
//# sourceMappingURL=form.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../../src/components/form.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,EAAE,KAAK,IAAI,cAAc,EAAE,MAAM,UAAU,CAAA;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAC/B,OAAO,EAKL,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAA;AAKxB,QAAA,MAAM,IAAI,0YAAe,CAAA;AAazB,QAAA,MAAM,SAAS,GACb,YAAY,SAAS,WAAW,GAAG,WAAW,EAC9C,KAAK,SAAS,SAAS,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC,YAAY,CAAC,EAC/D,cAEC,eAAe,CAAC,YAAY,EAAE,KAAK,CAAC,sBAMtC,CAAA;AAED,QAAA,MAAM,YAAY;;;;;;;;;;;CAqBjB,CAAA;AAUD,iBAAS,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAYrE;AAED,iBAAS,SAAS,CAAC,EACjB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,cAAc,CAAC,IAAI,CAAC,qBAYlD;AAED,iBAAS,WAAW,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,qBAgBxE;AAED,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAW1E;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,4BAkBtE;AAED,OAAO,EACL,YAAY,EACZ,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,WAAW,EACX,eAAe,EACf,WAAW,EACX,SAAS,GACV,CAAA"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { Slot } from "radix-ui";
|
|
5
|
+
import { Controller, FormProvider, useFormContext, useFormState, } from "react-hook-form";
|
|
6
|
+
import { cn } from "../lib/utils.js";
|
|
7
|
+
import { Label } from "./label.js";
|
|
8
|
+
const Form = FormProvider;
|
|
9
|
+
const FormFieldContext = React.createContext({});
|
|
10
|
+
const FormField = ({ ...props }) => {
|
|
11
|
+
return (_jsx(FormFieldContext.Provider, { value: { name: props.name }, children: _jsx(Controller, { ...props }) }));
|
|
12
|
+
};
|
|
13
|
+
const useFormField = () => {
|
|
14
|
+
const fieldContext = React.useContext(FormFieldContext);
|
|
15
|
+
const itemContext = React.useContext(FormItemContext);
|
|
16
|
+
const { getFieldState } = useFormContext();
|
|
17
|
+
const formState = useFormState({ name: fieldContext.name });
|
|
18
|
+
const fieldState = getFieldState(fieldContext.name, formState);
|
|
19
|
+
if (!fieldContext) {
|
|
20
|
+
throw new Error("useFormField should be used within <FormField>");
|
|
21
|
+
}
|
|
22
|
+
const { id } = itemContext;
|
|
23
|
+
return {
|
|
24
|
+
id,
|
|
25
|
+
name: fieldContext.name,
|
|
26
|
+
formItemId: `${id}-form-item`,
|
|
27
|
+
formDescriptionId: `${id}-form-item-description`,
|
|
28
|
+
formMessageId: `${id}-form-item-message`,
|
|
29
|
+
...fieldState,
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
const FormItemContext = React.createContext({});
|
|
33
|
+
function FormItem({ className, ...props }) {
|
|
34
|
+
const id = React.useId();
|
|
35
|
+
return (_jsx(FormItemContext.Provider, { value: { id }, children: _jsx("div", { "data-slot": "form-item", className: cn("grid gap-2", className), ...props }) }));
|
|
36
|
+
}
|
|
37
|
+
function FormLabel({ className, ...props }) {
|
|
38
|
+
const { error, formItemId } = useFormField();
|
|
39
|
+
return (_jsx(Label, { "data-slot": "form-label", "data-error": !!error, className: cn("data-[error=true]:text-destructive", className), htmlFor: formItemId, ...props }));
|
|
40
|
+
}
|
|
41
|
+
function FormControl({ ...props }) {
|
|
42
|
+
const { error, formItemId, formDescriptionId, formMessageId } = useFormField();
|
|
43
|
+
return (_jsx(Slot.Root, { "data-slot": "form-control", id: formItemId, "aria-describedby": !error
|
|
44
|
+
? `${formDescriptionId}`
|
|
45
|
+
: `${formDescriptionId} ${formMessageId}`, "aria-invalid": !!error, ...props }));
|
|
46
|
+
}
|
|
47
|
+
function FormDescription({ className, ...props }) {
|
|
48
|
+
const { formDescriptionId } = useFormField();
|
|
49
|
+
return (_jsx("p", { "data-slot": "form-description", id: formDescriptionId, className: cn("text-sm text-muted-foreground", className), ...props }));
|
|
50
|
+
}
|
|
51
|
+
function FormMessage({ className, ...props }) {
|
|
52
|
+
const { error, formMessageId } = useFormField();
|
|
53
|
+
const body = error ? String(error?.message ?? "") : props.children;
|
|
54
|
+
if (!body) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
return (_jsx("p", { "data-slot": "form-message", id: formMessageId, className: cn("text-sm text-destructive", className), ...props, children: body }));
|
|
58
|
+
}
|
|
59
|
+
export { useFormField, Form, FormItem, FormLabel, FormControl, FormDescription, FormMessage, FormField, };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
/**
|
|
3
|
+
* hero-split — the page-opening hero (replaces the retired `sections/hero-split.css`).
|
|
4
|
+
*
|
|
5
|
+
* A two-cell split: a copy cell (kicker, headline, lead, CTA row) beside an
|
|
6
|
+
* image-dominant visual cell. SINGLE-OWNER SEAM: the single divider between the two
|
|
7
|
+
* cells is the cell-grid gap-as-seam — the panel paints the brand `line` behind the
|
|
8
|
+
* cells (`bg-border`) and leaves a 1px guide gap (`gap-px`), so the only visible
|
|
9
|
+
* line at that coordinate is the one the grid draws.
|
|
10
|
+
* The frame/lane/row perimeter is owned by the kept geometry layer; the hero adds no
|
|
11
|
+
* competing border.
|
|
12
|
+
*
|
|
13
|
+
* Image-dominant by intent: on desktop the copy cell takes the narrower track and
|
|
14
|
+
* the visual cell the wider one (`1fr / 1.5fr`). The visual cell is a FLUSH mount —
|
|
15
|
+
* no padding, no inset — so the image (the kept design-system `image`/`.nc-image`
|
|
16
|
+
* CSS atom the caller drops into `HeroSplitVisual`) fills the cell edge to edge and
|
|
17
|
+
* is the hero's surface, not a padded stamp. Token-only; no `dark:` styling.
|
|
18
|
+
*/
|
|
19
|
+
declare function HeroSplit({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
20
|
+
declare function HeroSplitCopy({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
21
|
+
declare function HeroSplitVisual({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
22
|
+
export { HeroSplit, HeroSplitCopy, HeroSplitVisual };
|
|
23
|
+
//# sourceMappingURL=hero-split.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hero-split.d.ts","sourceRoot":"","sources":["../../src/components/hero-split.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B;;;;;;;;;;;;;;;;GAgBG;AAEH,iBAAS,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAYtE;AAED,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAW1E;AAED,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAa5E;AAED,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,EAAE,CAAA"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../lib/utils.js";
|
|
3
|
+
/**
|
|
4
|
+
* hero-split — the page-opening hero (replaces the retired `sections/hero-split.css`).
|
|
5
|
+
*
|
|
6
|
+
* A two-cell split: a copy cell (kicker, headline, lead, CTA row) beside an
|
|
7
|
+
* image-dominant visual cell. SINGLE-OWNER SEAM: the single divider between the two
|
|
8
|
+
* cells is the cell-grid gap-as-seam — the panel paints the brand `line` behind the
|
|
9
|
+
* cells (`bg-border`) and leaves a 1px guide gap (`gap-px`), so the only visible
|
|
10
|
+
* line at that coordinate is the one the grid draws.
|
|
11
|
+
* The frame/lane/row perimeter is owned by the kept geometry layer; the hero adds no
|
|
12
|
+
* competing border.
|
|
13
|
+
*
|
|
14
|
+
* Image-dominant by intent: on desktop the copy cell takes the narrower track and
|
|
15
|
+
* the visual cell the wider one (`1fr / 1.5fr`). The visual cell is a FLUSH mount —
|
|
16
|
+
* no padding, no inset — so the image (the kept design-system `image`/`.nc-image`
|
|
17
|
+
* CSS atom the caller drops into `HeroSplitVisual`) fills the cell edge to edge and
|
|
18
|
+
* is the hero's surface, not a padded stamp. Token-only; no `dark:` styling.
|
|
19
|
+
*/
|
|
20
|
+
function HeroSplit({ className, ...props }) {
|
|
21
|
+
return (_jsx("div", { "data-slot": "hero-split", className: cn(
|
|
22
|
+
// The panel owns internal seams only; the page/frame/hatch rail owns the perimeter.
|
|
23
|
+
"grid min-h-[inherit] min-w-0 grid-cols-1 gap-px bg-border sm:grid-cols-[minmax(0,1fr)_minmax(0,1.5fr)]", className), ...props }));
|
|
24
|
+
}
|
|
25
|
+
function HeroSplitCopy({ className, ...props }) {
|
|
26
|
+
return (_jsx("div", { "data-slot": "hero-split-copy", className: cn("grid min-w-0 content-center gap-4 overflow-hidden bg-card p-[clamp(24px,4vw,56px)]", className), ...props }));
|
|
27
|
+
}
|
|
28
|
+
function HeroSplitVisual({ className, ...props }) {
|
|
29
|
+
return (_jsx("div", { "data-slot": "hero-split-visual", className: cn(
|
|
30
|
+
// flush mount: no padding/inset; the image fills the cell. canvas shows only
|
|
31
|
+
// until the image covers it. the kept `.nc-image` atom self-sizes here.
|
|
32
|
+
"grid min-w-0 overflow-hidden bg-card [&_.nc-image]:h-full", className), ...props }));
|
|
33
|
+
}
|
|
34
|
+
export { HeroSplit, HeroSplitCopy, HeroSplitVisual };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { HoverCard as HoverCardPrimitive } from "radix-ui";
|
|
3
|
+
declare function HoverCard({ ...props }: React.ComponentProps<typeof HoverCardPrimitive.Root>): React.JSX.Element;
|
|
4
|
+
declare function HoverCardTrigger({ ...props }: React.ComponentProps<typeof HoverCardPrimitive.Trigger>): React.JSX.Element;
|
|
5
|
+
declare function HoverCardContent({ className, align, sideOffset, ...props }: React.ComponentProps<typeof HoverCardPrimitive.Content>): React.JSX.Element;
|
|
6
|
+
export { HoverCard, HoverCardTrigger, HoverCardContent };
|
|
7
|
+
//# sourceMappingURL=hover-card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hover-card.d.ts","sourceRoot":"","sources":["../../src/components/hover-card.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,SAAS,IAAI,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAI1D,iBAAS,SAAS,CAAC,EACjB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,kBAAkB,CAAC,IAAI,CAAC,qBAEtD;AAED,iBAAS,gBAAgB,CAAC,EACxB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,kBAAkB,CAAC,OAAO,CAAC,qBAIzD;AAED,iBAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,KAAgB,EAChB,UAAc,EACd,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,kBAAkB,CAAC,OAAO,CAAC,qBAezD;AAED,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { HoverCard as HoverCardPrimitive } from "radix-ui";
|
|
4
|
+
import { cn } from "../lib/utils.js";
|
|
5
|
+
function HoverCard({ ...props }) {
|
|
6
|
+
return _jsx(HoverCardPrimitive.Root, { "data-slot": "hover-card", ...props });
|
|
7
|
+
}
|
|
8
|
+
function HoverCardTrigger({ ...props }) {
|
|
9
|
+
return (_jsx(HoverCardPrimitive.Trigger, { "data-slot": "hover-card-trigger", ...props }));
|
|
10
|
+
}
|
|
11
|
+
function HoverCardContent({ className, align = "center", sideOffset = 4, ...props }) {
|
|
12
|
+
return (_jsx(HoverCardPrimitive.Portal, { "data-slot": "hover-card-portal", children: _jsx(HoverCardPrimitive.Content, { "data-slot": "hover-card-content", align: align, sideOffset: sideOffset, className: cn("z-50 w-64 origin-(--radix-hover-card-content-transform-origin) rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-hidden data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95", className), ...props }) }));
|
|
13
|
+
}
|
|
14
|
+
export { HoverCard, HoverCardTrigger, HoverCardContent };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { type VariantProps } from "class-variance-authority";
|
|
3
|
+
import { Button } from "./button";
|
|
4
|
+
declare function InputGroup({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
5
|
+
declare const inputGroupAddonVariants: (props?: ({
|
|
6
|
+
align?: "inline-end" | "inline-start" | "block-end" | "block-start" | null | undefined;
|
|
7
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
8
|
+
declare function InputGroupAddon({ className, align, ...props }: React.ComponentProps<"div"> & VariantProps<typeof inputGroupAddonVariants>): React.JSX.Element;
|
|
9
|
+
declare const inputGroupButtonVariants: (props?: ({
|
|
10
|
+
size?: "xs" | "sm" | "icon-xs" | "icon-sm" | null | undefined;
|
|
11
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
12
|
+
declare function InputGroupButton({ className, type, variant, size, ...props }: Omit<React.ComponentProps<typeof Button>, "size"> & VariantProps<typeof inputGroupButtonVariants>): React.JSX.Element;
|
|
13
|
+
declare function InputGroupText({ className, ...props }: React.ComponentProps<"span">): React.JSX.Element;
|
|
14
|
+
declare function InputGroupInput({ className, ...props }: React.ComponentProps<"input">): React.JSX.Element;
|
|
15
|
+
declare function InputGroupTextarea({ className, ...props }: React.ComponentProps<"textarea">): React.JSX.Element;
|
|
16
|
+
export { InputGroup, InputGroupAddon, InputGroupButton, InputGroupText, InputGroupInput, InputGroupTextarea, };
|
|
17
|
+
//# sourceMappingURL=input-group.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-group.d.ts","sourceRoot":"","sources":["../../src/components/input-group.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAGjE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAI5C,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBA0BvE;AAED,QAAA,MAAM,uBAAuB;;8EAmB5B,CAAA;AAED,iBAAS,eAAe,CAAC,EACvB,SAAS,EACT,KAAsB,EACtB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,OAAO,uBAAuB,CAAC,qBAgB5E;AAED,QAAA,MAAM,wBAAwB;;8EAgB7B,CAAA;AAED,iBAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,IAAe,EACf,OAAiB,EACjB,IAAW,EACX,GAAG,KAAK,EACT,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,MAAM,CAAC,EAAE,MAAM,CAAC,GAClD,YAAY,CAAC,OAAO,wBAAwB,CAAC,qBAU9C;AAED,iBAAS,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,qBAU5E;AAED,iBAAS,eAAe,CAAC,EACvB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,qBAW/B;AAED,iBAAS,kBAAkB,CAAC,EAC1B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,qBAWlC;AAED,OAAO,EACL,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,kBAAkB,GACnB,CAAA"}
|