@heyramzi/ui 0.0.0-stage → 1.53.1
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/COMPONENTS.md +133 -0
- package/README.md +136 -2
- package/package.json +217 -3
- package/scripts/lib/sync-core.mjs +113 -0
- package/scripts/relative-imports.mjs +39 -0
- package/scripts/sf-symbol.mjs +93 -0
- package/scripts/sync-shadcn.mjs +354 -0
- package/scripts/sync-transitions.mjs +146 -0
- package/scripts/validate-apple-symbol-exports.mjs +45 -0
- package/src/agents/agent-avatar.svelte +590 -0
- package/src/agents/agent-cast.svelte +197 -0
- package/src/agents/demo.svelte +125 -0
- package/src/agents/helpers.ts +58 -0
- package/src/agents/index.ts +11 -0
- package/src/agents/page-state.ts +70 -0
- package/src/agents/types.ts +74 -0
- package/src/agents/vendor/LICENSE +21 -0
- package/src/agents/vendor/color.ts +155 -0
- package/src/agents/vendor/draw.ts +840 -0
- package/src/agents/vendor/engine.ts +845 -0
- package/src/agents/vendor/mesh.ts +838 -0
- package/src/agents/vendor/plastic.ts +4958 -0
- package/src/agents/vendor/presets.ts +103 -0
- package/src/agents/vendor/shapes.ts +41 -0
- package/src/agents/vendor/ticker.ts +67 -0
- package/src/agents/vendor/types.ts +261 -0
- package/src/agents/vendor/wear.ts +1699 -0
- package/src/ai/ai-button/AiButton.svelte +86 -0
- package/src/ai/ai-button/index.ts +4 -0
- package/src/ai/confirmation/Confirmation.svelte +54 -0
- package/src/ai/confirmation/ConfirmationAccepted.svelte +23 -0
- package/src/ai/confirmation/ConfirmationAction.svelte +53 -0
- package/src/ai/confirmation/ConfirmationActions.svelte +24 -0
- package/src/ai/confirmation/ConfirmationFailed.svelte +23 -0
- package/src/ai/confirmation/ConfirmationRejected.svelte +23 -0
- package/src/ai/confirmation/ConfirmationRequest.svelte +25 -0
- package/src/ai/confirmation/ConfirmationTitle.svelte +25 -0
- package/src/ai/confirmation/confirmation-context.svelte.ts +22 -0
- package/src/ai/confirmation/index.ts +50 -0
- package/src/ai/generation-progress/GenerationProgress.svelte +354 -0
- package/src/ai/generation-progress/index.ts +7 -0
- package/src/ai/index.ts +111 -0
- package/src/ai/loading-state/PixelLoader.svelte +138 -0
- package/src/ai/loading-state/index.ts +5 -0
- package/src/ai/prompt-input/PromptInput.svelte +56 -0
- package/src/ai/prompt-input/PromptInputBody.svelte +19 -0
- package/src/ai/prompt-input/PromptInputSubmit.svelte +79 -0
- package/src/ai/prompt-input/PromptInputTextarea.svelte +74 -0
- package/src/ai/prompt-input/PromptInputToolbar.svelte +19 -0
- package/src/ai/prompt-input/index.ts +34 -0
- package/src/ai/reasoning/Reasoning.svelte +50 -0
- package/src/ai/reasoning/ReasoningContent.svelte +27 -0
- package/src/ai/reasoning/ReasoningTrigger.svelte +48 -0
- package/src/ai/reasoning/index.ts +22 -0
- package/src/ai/reasoning/reasoning-context.svelte.ts +20 -0
- package/src/ai/response/Response.css +32 -0
- package/src/ai/response/Response.svelte +130 -0
- package/src/ai/response/index.ts +5 -0
- package/src/ai/suggestion/Suggestion.svelte +43 -0
- package/src/ai/suggestion/Suggestions.svelte +25 -0
- package/src/ai/suggestion/index.ts +14 -0
- package/src/ai/thinking-dots/ThinkingDots.svelte +42 -0
- package/src/ai/thinking-dots/index.ts +5 -0
- package/src/ai/typing-dots/TypingDots.css +39 -0
- package/src/ai/typing-dots/TypingDots.svelte +27 -0
- package/src/ai/typing-dots/index.ts +10 -0
- package/src/ai/voice-waveform/VoiceWaveform.css +40 -0
- package/src/ai/voice-waveform/VoiceWaveform.svelte +46 -0
- package/src/ai/voice-waveform/index.ts +5 -0
- package/src/ambient.d.ts +4 -0
- package/src/animations/README.md +84 -0
- package/src/animations/avatar-group-hover.css +47 -0
- package/src/animations/card-tilt.css +74 -0
- package/src/animations/digit-pop-in.css +78 -0
- package/src/animations/dropdown.css +121 -0
- package/src/animations/index.css +23 -0
- package/src/animations/input-clear-dissolve.css +86 -0
- package/src/animations/input-shake.css +114 -0
- package/src/animations/learn-more-hover.css +48 -0
- package/src/animations/like-button.css +93 -0
- package/src/animations/modal.css +75 -0
- package/src/animations/page-side-by-side.css +63 -0
- package/src/animations/plus-menu-morph.css +97 -0
- package/src/animations/resize.css +20 -0
- package/src/animations/shimmer-text.css +72 -0
- package/src/animations/spinning-counter.css +52 -0
- package/src/animations/success-check.css +120 -0
- package/src/animations/text-swap.css +40 -0
- package/src/animations/text-swap.ts +40 -0
- package/src/animations/thinking-states.css +65 -0
- package/src/animations/upstream-coverage.test.ts +65 -0
- package/src/components/copy/clipboard.test.ts +206 -0
- package/src/components/copy/clipboard.ts +49 -0
- package/src/components/copy/copied.svelte.ts +39 -0
- package/src/components/copy/copy-button.svelte +175 -0
- package/src/components/copy/copy-button.test.ts +112 -0
- package/src/components/copy/index.ts +3 -0
- package/src/components/data-table/data-table.test.ts +134 -0
- package/src/components/data-table/data-table.ts +77 -0
- package/src/components/data-table/index.ts +20 -0
- package/src/components/data-table/infinite-scroll.svelte +69 -0
- package/src/components/data-table/pagination.svelte +62 -0
- package/src/components/data-table/row-arrow.svelte +28 -0
- package/src/components/data-table/row-context-menu.svelte +106 -0
- package/src/components/data-table/row-context-menu.test.ts +18 -0
- package/src/components/data-table/sortable-head.svelte +56 -0
- package/src/components/data-table/table-skeleton.svelte +83 -0
- package/src/components/hold-to-confirm/hold-to-confirm.svelte +232 -0
- package/src/components/hold-to-confirm/index.ts +1 -0
- package/src/components/icon/icon.svelte +23 -0
- package/src/components/icon/index.ts +1 -0
- package/src/components/language-flag/index.ts +1 -0
- package/src/components/language-flag/language-flag.svelte +60 -0
- package/src/components/list-page/detail-empty.svelte +50 -0
- package/src/components/list-page/detail-header.svelte +107 -0
- package/src/components/list-page/detail-panel.svelte +90 -0
- package/src/components/list-page/detail-row.svelte +36 -0
- package/src/components/list-page/detail-stack.svelte +33 -0
- package/src/components/list-page/empty-state.svelte +91 -0
- package/src/components/list-page/filter-item.svelte +49 -0
- package/src/components/list-page/filter-popover.svelte +88 -0
- package/src/components/list-page/filter-section.ts +12 -0
- package/src/components/list-page/grouped-list.svelte +116 -0
- package/src/components/list-page/index.ts +28 -0
- package/src/components/list-page/list-page-shell.svelte +195 -0
- package/src/components/list-page/list-table.ts +19 -0
- package/src/components/list-page/master-detail.svelte +206 -0
- package/src/components/list-page/master-detail.test.ts +37 -0
- package/src/components/list-page/notice-bar.svelte +68 -0
- package/src/components/list-page/prev-next.svelte +104 -0
- package/src/components/list-page/queue-rail.ts +25 -0
- package/src/components/list-page/rail-body.svelte +29 -0
- package/src/components/list-page/rail-empty.svelte +51 -0
- package/src/components/list-page/rail-head.svelte +49 -0
- package/src/components/list-page/rail-row.svelte +163 -0
- package/src/components/list-page/section-host.ts +24 -0
- package/src/components/list-page/section-label.svelte +39 -0
- package/src/components/list-page/step.test.ts +21 -0
- package/src/components/list-page/step.ts +10 -0
- package/src/components/list-page/toolbar-search.svelte +63 -0
- package/src/components/list-page/toolbar-trigger.ts +23 -0
- package/src/components/list-page/types.ts +1 -0
- package/src/components/locale-switch/index.ts +1 -0
- package/src/components/locale-switch/locale-switch.svelte +59 -0
- package/src/components/mark/index.ts +1 -0
- package/src/components/mark/mark.svelte +70 -0
- package/src/components/open-in/index.ts +6 -0
- package/src/components/open-in/open-in.svelte +106 -0
- package/src/components/picker/index.ts +4 -0
- package/src/components/picker/mark-picker.svelte +84 -0
- package/src/components/picker/picker.svelte +143 -0
- package/src/components/picker/trigger.ts +42 -0
- package/src/components/picker/types.ts +26 -0
- package/src/components/segmented/animated-tabs.svelte +175 -0
- package/src/components/segmented/collapse.test.ts +49 -0
- package/src/components/segmented/collapse.ts +39 -0
- package/src/components/segmented/index.ts +41 -0
- package/src/components/segmented/section-runs.svelte +79 -0
- package/src/components/segmented/segment.svelte +106 -0
- package/src/components/segmented/segmented-filter.svelte +125 -0
- package/src/components/segmented/segmented-nav.svelte +82 -0
- package/src/components/segmented/segmented-overflow.svelte +85 -0
- package/src/components/segmented/segmented-track.svelte +186 -0
- package/src/components/segmented/segmented.test.ts +20 -0
- package/src/components/segmented/segmented.ts +80 -0
- package/src/components/star-rating-input/index.ts +9 -0
- package/src/components/star-rating-input/star-rating-input.svelte +263 -0
- package/src/components/svg/index.ts +1 -0
- package/src/components/svg/svg.svelte +9 -0
- package/src/design/index.css +270 -0
- package/src/design/polish.css +159 -0
- package/src/effects/animated-beam/AnimatedBeam.svelte +132 -0
- package/src/effects/animated-beam/diagrams/BeamSvg.svelte +91 -0
- package/src/effects/animated-beam/index.ts +2 -0
- package/src/effects/animated-beam/path-calculator.svelte.ts +70 -0
- package/src/effects/animated-beam/types.ts +23 -0
- package/src/effects/border-beam/BorderBeam.svelte +223 -0
- package/src/effects/border-beam/css.test.ts +46 -0
- package/src/effects/border-beam/css.ts +574 -0
- package/src/effects/border-beam/presets.ts +699 -0
- package/src/effects/border-beam/register-properties.test.ts +74 -0
- package/src/effects/border-beam/register-properties.ts +73 -0
- package/src/effects/border-beam/types.ts +38 -0
- package/src/effects/image-comparison/ImageComparison.css +100 -0
- package/src/effects/image-comparison/ImageComparison.svelte +209 -0
- package/src/effects/image-comparison/compare.test.ts +17 -0
- package/src/effects/image-comparison/compare.ts +5 -0
- package/src/effects/image-reveal/ImageReveal.css +10 -0
- package/src/effects/image-reveal/ImageReveal.svelte +357 -0
- package/src/effects/image-reveal/index.ts +2 -0
- package/src/effects/image-reveal/types.ts +35 -0
- package/src/effects/interactive-hover-button/InteractiveHoverButton.svelte +338 -0
- package/src/effects/magic-card/MagicCard.css +47 -0
- package/src/effects/magic-card/MagicCard.svelte +57 -0
- package/src/effects/magnetic/magnetic.ts +81 -0
- package/src/effects/marquee/Marquee.css +78 -0
- package/src/effects/marquee/Marquee.svelte +160 -0
- package/src/effects/progressive-blur/ProgressiveBlur.css +9 -0
- package/src/effects/progressive-blur/ProgressiveBlur.svelte +63 -0
- package/src/effects/reveal/AnimatedGroup.svelte +101 -0
- package/src/effects/reveal/InView.svelte +77 -0
- package/src/effects/reveal/TextEffect.svelte +142 -0
- package/src/effects/reveal/index.ts +11 -0
- package/src/effects/reveal/observe.test.ts +60 -0
- package/src/effects/reveal/observe.ts +65 -0
- package/src/effects/reveal/reveal.css +141 -0
- package/src/effects/reveal/types.ts +32 -0
- package/src/effects/shader-gradient/ShaderGradient.svelte +227 -0
- package/src/effects/shader-gradient/color.ts +44 -0
- package/src/effects/shader-gradient/index.ts +5 -0
- package/src/effects/shader-gradient/renderer.ts +456 -0
- package/src/effects/shader-gradient/shaders.ts +324 -0
- package/src/effects/shader-gradient/types.ts +68 -0
- package/src/effects/spotlight/Spotlight.css +14 -0
- package/src/effects/spotlight/Spotlight.svelte +61 -0
- package/src/effects/theme-toggle/ThemeToggle.css +214 -0
- package/src/effects/theme-toggle/ThemeToggle.svelte +126 -0
- package/src/gallery.test.ts +52 -0
- package/src/icons/TradeIcon.svelte +16 -0
- package/src/icons/apple-symbol-exports.ts +135 -0
- package/src/icons/sf-symbols.ts +527 -0
- package/src/icons/trades.ts +89 -0
- package/src/index.ts +53 -0
- package/src/lib/arrive.ts +26 -0
- package/src/lib/icon-types.ts +17 -0
- package/src/lib/layout.ts +8 -0
- package/src/lib/panel.ts +21 -0
- package/src/lib/sliding-pill.ts +68 -0
- package/src/lib/theme-transition.ts +79 -0
- package/src/lib/tone.ts +48 -0
- package/src/shadcn/accordion/accordion-content.svelte +22 -0
- package/src/shadcn/accordion/accordion-item.svelte +17 -0
- package/src/shadcn/accordion/accordion-trigger.svelte +44 -0
- package/src/shadcn/accordion/accordion.svelte +19 -0
- package/src/shadcn/accordion/index.ts +16 -0
- package/src/shadcn/alert/alert-description.svelte +23 -0
- package/src/shadcn/alert/alert-title.svelte +20 -0
- package/src/shadcn/alert/alert.svelte +46 -0
- package/src/shadcn/alert/index.ts +14 -0
- package/src/shadcn/alert-dialog/alert-dialog-action.svelte +18 -0
- package/src/shadcn/alert-dialog/alert-dialog-cancel.svelte +18 -0
- package/src/shadcn/alert-dialog/alert-dialog-content.svelte +29 -0
- package/src/shadcn/alert-dialog/alert-dialog-description.svelte +17 -0
- package/src/shadcn/alert-dialog/alert-dialog-footer.svelte +20 -0
- package/src/shadcn/alert-dialog/alert-dialog-header.svelte +20 -0
- package/src/shadcn/alert-dialog/alert-dialog-overlay.svelte +17 -0
- package/src/shadcn/alert-dialog/alert-dialog-portal.svelte +7 -0
- package/src/shadcn/alert-dialog/alert-dialog-title.svelte +17 -0
- package/src/shadcn/alert-dialog/alert-dialog-trigger.svelte +7 -0
- package/src/shadcn/alert-dialog/alert-dialog.svelte +7 -0
- package/src/shadcn/alert-dialog/index.ts +37 -0
- package/src/shadcn/attachment/attachment-action.svelte +23 -0
- package/src/shadcn/attachment/attachment-actions.svelte +23 -0
- package/src/shadcn/attachment/attachment-content.svelte +23 -0
- package/src/shadcn/attachment/attachment-description.svelte +23 -0
- package/src/shadcn/attachment/attachment-group.svelte +23 -0
- package/src/shadcn/attachment/attachment-media.svelte +44 -0
- package/src/shadcn/attachment/attachment-title.svelte +23 -0
- package/src/shadcn/attachment/attachment-trigger.svelte +29 -0
- package/src/shadcn/attachment/attachment.svelte +55 -0
- package/src/shadcn/attachment/index.ts +40 -0
- package/src/shadcn/avatar/avatar-badge.svelte +26 -0
- package/src/shadcn/avatar/avatar-fallback.svelte +20 -0
- package/src/shadcn/avatar/avatar-group-count.svelte +23 -0
- package/src/shadcn/avatar/avatar-group.svelte +23 -0
- package/src/shadcn/avatar/avatar-image.svelte +17 -0
- package/src/shadcn/avatar/avatar.svelte +26 -0
- package/src/shadcn/avatar/index.ts +22 -0
- package/src/shadcn/badge/badge.svelte +54 -0
- package/src/shadcn/badge/index.ts +2 -0
- package/src/shadcn/breadcrumb/breadcrumb-ellipsis.svelte +23 -0
- package/src/shadcn/breadcrumb/breadcrumb-item.svelte +20 -0
- package/src/shadcn/breadcrumb/breadcrumb-link.svelte +31 -0
- package/src/shadcn/breadcrumb/breadcrumb-list.svelte +23 -0
- package/src/shadcn/breadcrumb/breadcrumb-page.svelte +23 -0
- package/src/shadcn/breadcrumb/breadcrumb-separator.svelte +27 -0
- package/src/shadcn/breadcrumb/breadcrumb.svelte +21 -0
- package/src/shadcn/breadcrumb/index.ts +25 -0
- package/src/shadcn/bubble/bubble-content.svelte +31 -0
- package/src/shadcn/bubble/bubble-group.svelte +20 -0
- package/src/shadcn/bubble/bubble-reactions.svelte +52 -0
- package/src/shadcn/bubble/bubble.svelte +58 -0
- package/src/shadcn/bubble/index.ts +25 -0
- package/src/shadcn/button/button.svelte +121 -0
- package/src/shadcn/button/index.ts +17 -0
- package/src/shadcn/calendar/calendar-caption.svelte +76 -0
- package/src/shadcn/calendar/calendar-cell.svelte +19 -0
- package/src/shadcn/calendar/calendar-day.svelte +35 -0
- package/src/shadcn/calendar/calendar-grid-body.svelte +12 -0
- package/src/shadcn/calendar/calendar-grid-head.svelte +12 -0
- package/src/shadcn/calendar/calendar-grid-row.svelte +12 -0
- package/src/shadcn/calendar/calendar-grid.svelte +16 -0
- package/src/shadcn/calendar/calendar-head-cell.svelte +19 -0
- package/src/shadcn/calendar/calendar-header.svelte +19 -0
- package/src/shadcn/calendar/calendar-heading.svelte +16 -0
- package/src/shadcn/calendar/calendar-month-select.svelte +44 -0
- package/src/shadcn/calendar/calendar-month.svelte +15 -0
- package/src/shadcn/calendar/calendar-months.svelte +19 -0
- package/src/shadcn/calendar/calendar-nav.svelte +19 -0
- package/src/shadcn/calendar/calendar-next-button.svelte +31 -0
- package/src/shadcn/calendar/calendar-prev-button.svelte +31 -0
- package/src/shadcn/calendar/calendar-year-select.svelte +43 -0
- package/src/shadcn/calendar/calendar.svelte +124 -0
- package/src/shadcn/calendar/index.ts +40 -0
- package/src/shadcn/card/card-action.svelte +23 -0
- package/src/shadcn/card/card-content.svelte +20 -0
- package/src/shadcn/card/card-description.svelte +20 -0
- package/src/shadcn/card/card-footer.svelte +23 -0
- package/src/shadcn/card/card-header.svelte +23 -0
- package/src/shadcn/card/card-title.svelte +29 -0
- package/src/shadcn/card/card.svelte +25 -0
- package/src/shadcn/card/index.ts +25 -0
- package/src/shadcn/checkbox/checkbox.svelte +38 -0
- package/src/shadcn/checkbox/index.ts +6 -0
- package/src/shadcn/code-block/code-block-actions.svelte +23 -0
- package/src/shadcn/code-block/code-block-content.svelte +55 -0
- package/src/shadcn/code-block/code-block-copy-button.svelte +10 -0
- package/src/shadcn/code-block/code-block-footer.svelte +20 -0
- package/src/shadcn/code-block/code-block-header.svelte +23 -0
- package/src/shadcn/code-block/code-block-line.svelte +71 -0
- package/src/shadcn/code-block/code-block-title.svelte +23 -0
- package/src/shadcn/code-block/code-block.svelte +47 -0
- package/src/shadcn/code-block/index.ts +42 -0
- package/src/shadcn/collapsible/collapsible-content.svelte +7 -0
- package/src/shadcn/collapsible/collapsible-trigger.svelte +7 -0
- package/src/shadcn/collapsible/collapsible.svelte +11 -0
- package/src/shadcn/collapsible/index.ts +13 -0
- package/src/shadcn/command/command-dialog.svelte +66 -0
- package/src/shadcn/command/command-empty.svelte +17 -0
- package/src/shadcn/command/command-group.svelte +40 -0
- package/src/shadcn/command/command-input.svelte +64 -0
- package/src/shadcn/command/command-item.svelte +37 -0
- package/src/shadcn/command/command-link-item.svelte +20 -0
- package/src/shadcn/command/command-list.svelte +20 -0
- package/src/shadcn/command/command-loading.svelte +7 -0
- package/src/shadcn/command/command-separator.svelte +17 -0
- package/src/shadcn/command/command-shortcut.svelte +23 -0
- package/src/shadcn/command/command.svelte +28 -0
- package/src/shadcn/command/index.ts +40 -0
- package/src/shadcn/context-menu/context-menu-checkbox-item.svelte +41 -0
- package/src/shadcn/context-menu/context-menu-content.svelte +28 -0
- package/src/shadcn/context-menu/context-menu-group-heading.svelte +21 -0
- package/src/shadcn/context-menu/context-menu-group.svelte +7 -0
- package/src/shadcn/context-menu/context-menu-item.svelte +27 -0
- package/src/shadcn/context-menu/context-menu-label.svelte +27 -0
- package/src/shadcn/context-menu/context-menu-portal.svelte +7 -0
- package/src/shadcn/context-menu/context-menu-radio-group.svelte +16 -0
- package/src/shadcn/context-menu/context-menu-radio-item.svelte +35 -0
- package/src/shadcn/context-menu/context-menu-separator.svelte +17 -0
- package/src/shadcn/context-menu/context-menu-shortcut.svelte +23 -0
- package/src/shadcn/context-menu/context-menu-sub-content.svelte +25 -0
- package/src/shadcn/context-menu/context-menu-sub-trigger.svelte +29 -0
- package/src/shadcn/context-menu/context-menu-sub.svelte +7 -0
- package/src/shadcn/context-menu/context-menu-trigger.svelte +17 -0
- package/src/shadcn/context-menu/context-menu.svelte +7 -0
- package/src/shadcn/context-menu/index.ts +52 -0
- package/src/shadcn/dialog/dialog-close.svelte +11 -0
- package/src/shadcn/dialog/dialog-content.svelte +57 -0
- package/src/shadcn/dialog/dialog-description.svelte +20 -0
- package/src/shadcn/dialog/dialog-footer.svelte +32 -0
- package/src/shadcn/dialog/dialog-header.svelte +20 -0
- package/src/shadcn/dialog/dialog-overlay.svelte +20 -0
- package/src/shadcn/dialog/dialog-portal.svelte +7 -0
- package/src/shadcn/dialog/dialog-title.svelte +17 -0
- package/src/shadcn/dialog/dialog-trigger.svelte +11 -0
- package/src/shadcn/dialog/dialog.svelte +7 -0
- package/src/shadcn/dialog/index.ts +34 -0
- package/src/shadcn/dropdown-menu/dropdown-menu-checkbox-group.svelte +16 -0
- package/src/shadcn/dropdown-menu/dropdown-menu-checkbox-item.svelte +43 -0
- package/src/shadcn/dropdown-menu/dropdown-menu-content.svelte +31 -0
- package/src/shadcn/dropdown-menu/dropdown-menu-group-heading.svelte +22 -0
- package/src/shadcn/dropdown-menu/dropdown-menu-group.svelte +7 -0
- package/src/shadcn/dropdown-menu/dropdown-menu-item.svelte +29 -0
- package/src/shadcn/dropdown-menu/dropdown-menu-label.svelte +27 -0
- package/src/shadcn/dropdown-menu/dropdown-menu-portal.svelte +7 -0
- package/src/shadcn/dropdown-menu/dropdown-menu-radio-group.svelte +16 -0
- package/src/shadcn/dropdown-menu/dropdown-menu-radio-item.svelte +34 -0
- package/src/shadcn/dropdown-menu/dropdown-menu-separator.svelte +17 -0
- package/src/shadcn/dropdown-menu/dropdown-menu-shortcut.svelte +23 -0
- package/src/shadcn/dropdown-menu/dropdown-menu-sub-content.svelte +20 -0
- package/src/shadcn/dropdown-menu/dropdown-menu-sub-trigger.svelte +29 -0
- package/src/shadcn/dropdown-menu/dropdown-menu-sub.svelte +7 -0
- package/src/shadcn/dropdown-menu/dropdown-menu-trigger.svelte +7 -0
- package/src/shadcn/dropdown-menu/dropdown-menu.svelte +7 -0
- package/src/shadcn/dropdown-menu/index.ts +56 -0
- package/src/shadcn/dropdown-menu/menu-item.ts +43 -0
- package/src/shadcn/empty/empty-content.svelte +23 -0
- package/src/shadcn/empty/empty-description.svelte +23 -0
- package/src/shadcn/empty/empty-header.svelte +20 -0
- package/src/shadcn/empty/empty-media.svelte +41 -0
- package/src/shadcn/empty/empty-title.svelte +20 -0
- package/src/shadcn/empty/empty.svelte +23 -0
- package/src/shadcn/empty/index.ts +22 -0
- package/src/shadcn/field/field-content.svelte +20 -0
- package/src/shadcn/field/field-description.svelte +25 -0
- package/src/shadcn/field/field-error.svelte +58 -0
- package/src/shadcn/field/field-group.svelte +23 -0
- package/src/shadcn/field/field-label.svelte +26 -0
- package/src/shadcn/field/field-legend.svelte +29 -0
- package/src/shadcn/field/field-separator.svelte +35 -0
- package/src/shadcn/field/field-set.svelte +24 -0
- package/src/shadcn/field/field-title.svelte +23 -0
- package/src/shadcn/field/field.svelte +53 -0
- package/src/shadcn/field/index.ts +36 -0
- package/src/shadcn/field/simple-field.svelte +71 -0
- package/src/shadcn/field/simple-field.test.ts +47 -0
- package/src/shadcn/hooks/highlighter.ts +132 -0
- package/src/shadcn/hooks/is-mobile.svelte.ts +9 -0
- package/src/shadcn/hooks/use-highlighted-code.svelte.ts +98 -0
- package/src/shadcn/hover-card/hover-card-content.svelte +31 -0
- package/src/shadcn/hover-card/hover-card-portal.svelte +7 -0
- package/src/shadcn/hover-card/hover-card-trigger.svelte +7 -0
- package/src/shadcn/hover-card/hover-card.svelte +7 -0
- package/src/shadcn/hover-card/index.ts +15 -0
- package/src/shadcn/input/index.ts +9 -0
- package/src/shadcn/input/input.svelte +48 -0
- package/src/shadcn/input/secret-input.svelte +75 -0
- package/src/shadcn/input-otp/index.ts +15 -0
- package/src/shadcn/input-otp/input-otp-group.svelte +20 -0
- package/src/shadcn/input-otp/input-otp-separator.svelte +25 -0
- package/src/shadcn/input-otp/input-otp-slot.svelte +26 -0
- package/src/shadcn/input-otp/input-otp.svelte +22 -0
- package/src/shadcn/kbd/index.ts +10 -0
- package/src/shadcn/kbd/kbd-group.svelte +20 -0
- package/src/shadcn/kbd/kbd.svelte +23 -0
- package/src/shadcn/label/index.ts +7 -0
- package/src/shadcn/label/label.svelte +20 -0
- package/src/shadcn/marker/index.ts +15 -0
- package/src/shadcn/marker/marker-content.svelte +23 -0
- package/src/shadcn/marker/marker-icon.svelte +21 -0
- package/src/shadcn/marker/marker.svelte +52 -0
- package/src/shadcn/message/index.ts +22 -0
- package/src/shadcn/message/message-avatar.svelte +23 -0
- package/src/shadcn/message/message-content.svelte +23 -0
- package/src/shadcn/message/message-footer.svelte +23 -0
- package/src/shadcn/message/message-group.svelte +20 -0
- package/src/shadcn/message/message-header.svelte +23 -0
- package/src/shadcn/message/message.svelte +27 -0
- package/src/shadcn/message-scroller/index.ts +28 -0
- package/src/shadcn/message-scroller/message-scroller-button.svelte +52 -0
- package/src/shadcn/message-scroller/message-scroller-content.svelte +17 -0
- package/src/shadcn/message-scroller/message-scroller-item.svelte +22 -0
- package/src/shadcn/message-scroller/message-scroller-provider.svelte +7 -0
- package/src/shadcn/message-scroller/message-scroller-viewport.svelte +20 -0
- package/src/shadcn/message-scroller/message-scroller.svelte +20 -0
- package/src/shadcn/popover/index.ts +28 -0
- package/src/shadcn/popover/popover-close.svelte +7 -0
- package/src/shadcn/popover/popover-content.svelte +38 -0
- package/src/shadcn/popover/popover-description.svelte +20 -0
- package/src/shadcn/popover/popover-header.svelte +20 -0
- package/src/shadcn/popover/popover-portal.svelte +7 -0
- package/src/shadcn/popover/popover-title.svelte +15 -0
- package/src/shadcn/popover/popover-trigger.svelte +17 -0
- package/src/shadcn/popover/popover.svelte +7 -0
- package/src/shadcn/progress/index.ts +7 -0
- package/src/shadcn/progress/progress.svelte +30 -0
- package/src/shadcn/radio-group/index.ts +10 -0
- package/src/shadcn/radio-group/radio-group-item.svelte +32 -0
- package/src/shadcn/radio-group/radio-group.svelte +19 -0
- package/src/shadcn/scroll-area/index.ts +10 -0
- package/src/shadcn/scroll-area/scroll-area-scrollbar.svelte +30 -0
- package/src/shadcn/scroll-area/scroll-area.svelte +43 -0
- package/src/shadcn/select/index.ts +37 -0
- package/src/shadcn/select/select-content.svelte +45 -0
- package/src/shadcn/select/select-group-heading.svelte +21 -0
- package/src/shadcn/select/select-group.svelte +17 -0
- package/src/shadcn/select/select-item.svelte +38 -0
- package/src/shadcn/select/select-label.svelte +20 -0
- package/src/shadcn/select/select-portal.svelte +7 -0
- package/src/shadcn/select/select-scroll-down-button.svelte +23 -0
- package/src/shadcn/select/select-scroll-up-button.svelte +23 -0
- package/src/shadcn/select/select-separator.svelte +18 -0
- package/src/shadcn/select/select-trigger.svelte +33 -0
- package/src/shadcn/select/select.svelte +11 -0
- package/src/shadcn/separator/index.ts +7 -0
- package/src/shadcn/separator/separator.svelte +23 -0
- package/src/shadcn/sheet/index.ts +34 -0
- package/src/shadcn/sheet/sheet-close.svelte +7 -0
- package/src/shadcn/sheet/sheet-content.svelte +73 -0
- package/src/shadcn/sheet/sheet-description.svelte +17 -0
- package/src/shadcn/sheet/sheet-footer.svelte +20 -0
- package/src/shadcn/sheet/sheet-header.svelte +20 -0
- package/src/shadcn/sheet/sheet-overlay.svelte +20 -0
- package/src/shadcn/sheet/sheet-portal.svelte +7 -0
- package/src/shadcn/sheet/sheet-title.svelte +17 -0
- package/src/shadcn/sheet/sheet-trigger.svelte +7 -0
- package/src/shadcn/sheet/sheet.css +48 -0
- package/src/shadcn/sheet/sheet.svelte +7 -0
- package/src/shadcn/sidebar/constants.ts +6 -0
- package/src/shadcn/sidebar/context.svelte.ts +81 -0
- package/src/shadcn/sidebar/index.ts +75 -0
- package/src/shadcn/sidebar/sidebar-content.svelte +24 -0
- package/src/shadcn/sidebar/sidebar-footer.svelte +21 -0
- package/src/shadcn/sidebar/sidebar-group-action.svelte +33 -0
- package/src/shadcn/sidebar/sidebar-group-content.svelte +21 -0
- package/src/shadcn/sidebar/sidebar-group-label.svelte +33 -0
- package/src/shadcn/sidebar/sidebar-group.svelte +21 -0
- package/src/shadcn/sidebar/sidebar-header.svelte +21 -0
- package/src/shadcn/sidebar/sidebar-input.svelte +21 -0
- package/src/shadcn/sidebar/sidebar-inset.svelte +23 -0
- package/src/shadcn/sidebar/sidebar-menu-action.svelte +37 -0
- package/src/shadcn/sidebar/sidebar-menu-badge.svelte +24 -0
- package/src/shadcn/sidebar/sidebar-menu-button.svelte +103 -0
- package/src/shadcn/sidebar/sidebar-menu-item.svelte +21 -0
- package/src/shadcn/sidebar/sidebar-menu-skeleton.svelte +36 -0
- package/src/shadcn/sidebar/sidebar-menu-sub-button.svelte +39 -0
- package/src/shadcn/sidebar/sidebar-menu-sub-item.svelte +21 -0
- package/src/shadcn/sidebar/sidebar-menu-sub.svelte +24 -0
- package/src/shadcn/sidebar/sidebar-menu.svelte +21 -0
- package/src/shadcn/sidebar/sidebar-provider.svelte +62 -0
- package/src/shadcn/sidebar/sidebar-rail.svelte +36 -0
- package/src/shadcn/sidebar/sidebar-separator.svelte +19 -0
- package/src/shadcn/sidebar/sidebar-trigger.svelte +37 -0
- package/src/shadcn/sidebar/sidebar.svelte +109 -0
- package/src/shadcn/skeleton/index.ts +7 -0
- package/src/shadcn/skeleton/skeleton.svelte +17 -0
- package/src/shadcn/slider/index.ts +7 -0
- package/src/shadcn/slider/slider.svelte +52 -0
- package/src/shadcn/sonner/index.ts +1 -0
- package/src/shadcn/sonner/sonner.svelte +31 -0
- package/src/shadcn/spinner/index.ts +1 -0
- package/src/shadcn/spinner/spinner.svelte +26 -0
- package/src/shadcn/switch/index.ts +7 -0
- package/src/shadcn/switch/switch.svelte +31 -0
- package/src/shadcn/table/index.ts +28 -0
- package/src/shadcn/table/table-body.svelte +20 -0
- package/src/shadcn/table/table-caption.svelte +20 -0
- package/src/shadcn/table/table-cell.svelte +20 -0
- package/src/shadcn/table/table-footer.svelte +20 -0
- package/src/shadcn/table/table-head.svelte +23 -0
- package/src/shadcn/table/table-header.svelte +20 -0
- package/src/shadcn/table/table-row.svelte +23 -0
- package/src/shadcn/table/table.svelte +25 -0
- package/src/shadcn/tabs/index.ts +16 -0
- package/src/shadcn/tabs/tabs-content.svelte +17 -0
- package/src/shadcn/tabs/tabs-list.svelte +36 -0
- package/src/shadcn/tabs/tabs-trigger.svelte +20 -0
- package/src/shadcn/tabs/tabs.svelte +19 -0
- package/src/shadcn/textarea/index.ts +7 -0
- package/src/shadcn/textarea/textarea.svelte +23 -0
- package/src/shadcn/toggle/index.ts +13 -0
- package/src/shadcn/toggle/toggle.svelte +53 -0
- package/src/shadcn/toggle-group/index.ts +10 -0
- package/src/shadcn/toggle-group/toggle-group-item.svelte +35 -0
- package/src/shadcn/toggle-group/toggle-group.svelte +66 -0
- package/src/shadcn/tooltip/context.ts +16 -0
- package/src/shadcn/tooltip/index.ts +19 -0
- package/src/shadcn/tooltip/tooltip-content.svelte +38 -0
- package/src/shadcn/tooltip/tooltip-portal.svelte +7 -0
- package/src/shadcn/tooltip/tooltip-provider.svelte +16 -0
- package/src/shadcn/tooltip/tooltip-trigger.svelte +7 -0
- package/src/shadcn/tooltip/tooltip.svelte +19 -0
- package/src/shadcn/trace/index.ts +29 -0
- package/src/shadcn/trace/trace-collapsible-content.svelte +29 -0
- package/src/shadcn/trace/trace-collapsible-trigger.svelte +29 -0
- package/src/shadcn/trace/trace-collapsible.svelte +20 -0
- package/src/shadcn/trace/trace-description.svelte +20 -0
- package/src/shadcn/trace/trace-icon.svelte +24 -0
- package/src/shadcn/trace/trace-line.svelte +31 -0
- package/src/shadcn/trace/trace-title.svelte +20 -0
- package/src/shadcn/trace/trace.svelte +23 -0
- package/src/shadcn/utilities.css +549 -0
- package/src/test-setup.ts +34 -0
- package/src/tokens.css +993 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trade icon map. Tabler covers the domain Lucide and Phosphor miss.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/*
|
|
6
|
+
* Lucide/Phosphor gap audit (Sept 2026) against the 14 trade pills in the "NOT SURE? TAP WHAT YOU DO" strip. Lucide has `hammer`, `wrench`, `hard-hat`, `bolt`, `brick-wall`,
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/*
|
|
10
|
+
* `building`, `car`, but no `trowel`, no tiling grid, no `window` cleaning `spray/squeegee`, no `crane`, no dedicated `handyman` toolset. Phosphor has `hammer`, `wrench`, `hard-hat`, `paint-roller`, and also no `trowel`.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/*
|
|
14
|
+
* Tabler 3.46 (6184 icons, MIT) has all 14 at a consistent 2px stroke on 24×24: droplet/pipe, bolt, home (roof), tools, key, window,
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/*
|
|
18
|
+
* car-garage, hammer / wave-saw-tool, helmet, trowel, grid-dots, leaf, car, crane. Svelte 5 port is ` @tabler/icons-svelte-runes` (runes, not legacy ` @tabler/icons-svelte`).
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import {
|
|
22
|
+
IconBolt,
|
|
23
|
+
IconCar,
|
|
24
|
+
IconCarGarage,
|
|
25
|
+
IconCrane,
|
|
26
|
+
IconDroplet,
|
|
27
|
+
IconGridDots,
|
|
28
|
+
IconHammer,
|
|
29
|
+
IconHelmet,
|
|
30
|
+
IconHome,
|
|
31
|
+
IconKey,
|
|
32
|
+
IconLeaf,
|
|
33
|
+
IconTools,
|
|
34
|
+
IconTrowel,
|
|
35
|
+
IconWindow,
|
|
36
|
+
} from "@tabler/icons-svelte-runes";
|
|
37
|
+
import type { Component } from "svelte";
|
|
38
|
+
|
|
39
|
+
export type TradeSlug =
|
|
40
|
+
| "plumbers"
|
|
41
|
+
| "electricians"
|
|
42
|
+
| "roofers"
|
|
43
|
+
| "handymen"
|
|
44
|
+
| "locksmiths"
|
|
45
|
+
| "window-cleaners"
|
|
46
|
+
| "garages"
|
|
47
|
+
| "carpenters"
|
|
48
|
+
| "builders"
|
|
49
|
+
| "plasterers"
|
|
50
|
+
| "tilers"
|
|
51
|
+
| "gardeners"
|
|
52
|
+
| "mobile-mechanics"
|
|
53
|
+
| "construction-companies";
|
|
54
|
+
|
|
55
|
+
export const tradeIconMap: Record<TradeSlug, Component> = {
|
|
56
|
+
plumbers: IconDroplet,
|
|
57
|
+
electricians: IconBolt,
|
|
58
|
+
roofers: IconHome,
|
|
59
|
+
handymen: IconTools,
|
|
60
|
+
locksmiths: IconKey,
|
|
61
|
+
"window-cleaners": IconWindow,
|
|
62
|
+
garages: IconCarGarage,
|
|
63
|
+
carpenters: IconHammer,
|
|
64
|
+
builders: IconHelmet,
|
|
65
|
+
plasterers: IconTrowel,
|
|
66
|
+
tilers: IconGridDots,
|
|
67
|
+
gardeners: IconLeaf,
|
|
68
|
+
"mobile-mechanics": IconCar,
|
|
69
|
+
"construction-companies": IconCrane,
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
export const tradeLabels: Record<TradeSlug, string> = {
|
|
73
|
+
plumbers: "PLUMBERS",
|
|
74
|
+
electricians: "ELECTRICIANS",
|
|
75
|
+
roofers: "ROOFERS",
|
|
76
|
+
handymen: "HANDYMEN",
|
|
77
|
+
locksmiths: "LOCKSMITHS",
|
|
78
|
+
"window-cleaners": "WINDOW CLEANERS",
|
|
79
|
+
garages: "GARAGES",
|
|
80
|
+
carpenters: "CARPENTERS",
|
|
81
|
+
builders: "BUILDERS",
|
|
82
|
+
plasterers: "PLASTERERS",
|
|
83
|
+
tilers: "TILERS",
|
|
84
|
+
gardeners: "GARDENERS",
|
|
85
|
+
"mobile-mechanics": "MOBILE MECHANICS",
|
|
86
|
+
"construction-companies": "CONSTRUCTION COMPANIES",
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
export const tradeSlugs: TradeSlug[] = Object.keys(tradeIconMap) as TradeSlug[];
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export { default as BorderBeam } from "./effects/border-beam/BorderBeam.svelte";
|
|
2
|
+
export type { BorderBeamProps } from "./effects/border-beam/types.js";
|
|
3
|
+
export type {
|
|
4
|
+
BorderBeamColorVariant,
|
|
5
|
+
BorderBeamSize,
|
|
6
|
+
BorderBeamTheme,
|
|
7
|
+
SizeConfig,
|
|
8
|
+
ThemeColors,
|
|
9
|
+
} from "./effects/border-beam/presets.js";
|
|
10
|
+
export { sizePresets, sizeThemePresets, themeColors } from "./effects/border-beam/presets.js";
|
|
11
|
+
|
|
12
|
+
export { default as ThemeToggle } from "./effects/theme-toggle/ThemeToggle.svelte";
|
|
13
|
+
|
|
14
|
+
export { default as AnimatedBeam } from "./effects/animated-beam/AnimatedBeam.svelte";
|
|
15
|
+
export type { AnimatedBeamProps, AnchorPosition } from "./effects/animated-beam/types.js";
|
|
16
|
+
|
|
17
|
+
export { default as Spotlight } from "./effects/spotlight/Spotlight.svelte";
|
|
18
|
+
|
|
19
|
+
export { default as MagicCard } from "./effects/magic-card/MagicCard.svelte";
|
|
20
|
+
|
|
21
|
+
export { default as Marquee } from "./effects/marquee/Marquee.svelte";
|
|
22
|
+
|
|
23
|
+
export { default as ImageReveal } from "./effects/image-reveal/ImageReveal.svelte";
|
|
24
|
+
export type { ImageRevealProps, ImageRevealHandle } from "./effects/image-reveal/types.js";
|
|
25
|
+
|
|
26
|
+
export { default as ShaderGradient } from "./effects/shader-gradient/ShaderGradient.svelte";
|
|
27
|
+
export type {
|
|
28
|
+
ShaderGradientProps,
|
|
29
|
+
ShaderGradientUniforms,
|
|
30
|
+
} from "./effects/shader-gradient/types.js";
|
|
31
|
+
|
|
32
|
+
export { default as InView } from "./effects/reveal/InView.svelte";
|
|
33
|
+
export { default as AnimatedGroup } from "./effects/reveal/AnimatedGroup.svelte";
|
|
34
|
+
export { default as TextEffect } from "./effects/reveal/TextEffect.svelte";
|
|
35
|
+
export { observeInView } from "./effects/reveal/observe.js";
|
|
36
|
+
export type {
|
|
37
|
+
RevealPreset,
|
|
38
|
+
RevealPer,
|
|
39
|
+
RevealTiming,
|
|
40
|
+
RevealViewOptions,
|
|
41
|
+
} from "./effects/reveal/types.js";
|
|
42
|
+
|
|
43
|
+
export { default as ProgressiveBlur } from "./effects/progressive-blur/ProgressiveBlur.svelte";
|
|
44
|
+
|
|
45
|
+
export { default as InteractiveHoverButton } from "./effects/interactive-hover-button/InteractiveHoverButton.svelte";
|
|
46
|
+
|
|
47
|
+
export { default as ImageComparison } from "./effects/image-comparison/ImageComparison.svelte";
|
|
48
|
+
|
|
49
|
+
export { magnetic } from "./effects/magnetic/magnetic.js";
|
|
50
|
+
export type { MagneticOptions } from "./effects/magnetic/magnetic.js";
|
|
51
|
+
|
|
52
|
+
export { revealTheme } from "./lib/theme-transition.js";
|
|
53
|
+
export type { RevealOrigin, RevealThemeOptions } from "./lib/theme-transition.js";
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Action } from "svelte/action";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Replays `.t-enter` whenever the value handed in changes, so a panel that swaps
|
|
5
|
+
* its record reads as a new one arriving. `<div use:arrive={selectedId}>`
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// Prefer it to `{#key}`, which rebuilds the subtree and loses scroll, focus and
|
|
9
|
+
// open disclosures. `use:` works on elements only, so a component still needs `{#key}`.
|
|
10
|
+
export const arrive: Action<HTMLElement, unknown> = (node, value) => {
|
|
11
|
+
let previous = value;
|
|
12
|
+
// The first paint is the mount, which already animates on its own class.
|
|
13
|
+
node.classList.add("t-enter");
|
|
14
|
+
|
|
15
|
+
return {
|
|
16
|
+
update(next: unknown) {
|
|
17
|
+
if (next === previous) return;
|
|
18
|
+
previous = next;
|
|
19
|
+
// Remove, force a reflow, re-add. A CSS animation runs once per element,
|
|
20
|
+
// and only a reflow between the two writes makes the browser replay it.
|
|
21
|
+
node.classList.remove("t-enter");
|
|
22
|
+
void node.offsetWidth;
|
|
23
|
+
node.classList.add("t-enter");
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Component } from "svelte";
|
|
2
|
+
import type { SVGAttributes } from "svelte/elements";
|
|
3
|
+
|
|
4
|
+
export type IconWeight = "bold" | "duotone" | "fill" | "light" | "thin" | "regular";
|
|
5
|
+
|
|
6
|
+
type IconBaseProps = {
|
|
7
|
+
color?: string;
|
|
8
|
+
size?: number | string;
|
|
9
|
+
weight?: IconWeight;
|
|
10
|
+
mirrored?: boolean;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
// WHY structural: it matches phosphor-svelte v2 `IconProps` and v3
|
|
14
|
+
// `IconComponentProps` without importing either. This package peers v2, the apps run v3.
|
|
15
|
+
export type PhosphorIcon = Component<
|
|
16
|
+
Omit<SVGAttributes<SVGSVGElement>, keyof IconBaseProps> & IconBaseProps
|
|
17
|
+
>;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** The app's one horizontal gutter. */
|
|
2
|
+
|
|
3
|
+
// WHY a token: the tab strip said `px-4 md:px-6` and page bodies `p-4`, so from
|
|
4
|
+
// `md` up the nav sat 8px right of the content. Same fact typed twice.
|
|
5
|
+
|
|
6
|
+
// The content edge won: sixty page bodies against one strip. Anything lining up
|
|
7
|
+
// with the page body names this instead of retyping a padding.
|
|
8
|
+
export const pageGutterClass = "px-4";
|
package/src/lib/panel.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** The one panel shell: a titled box holding a table, a chart or a stack. */
|
|
2
|
+
|
|
3
|
+
// WHY tokens, not markup: `DetailPanel` and `DataPanel` draw the same box with
|
|
4
|
+
// different props, and their edges drifted because the classes were typed twice.
|
|
5
|
+
|
|
6
|
+
// Dashboards used `Card`, so /ads had a ring and a shadow where /social had a
|
|
7
|
+
// hairline. Flat, one hairline, `rounded-xl`.
|
|
8
|
+
export const panelShellClass = "overflow-hidden rounded-xl border border-border bg-card";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* The panel's header bar: label left, count or controls right. `min-h-11` so a
|
|
12
|
+
* label-only header matches one with a button.
|
|
13
|
+
*/
|
|
14
|
+
export const panelHeaderClass =
|
|
15
|
+
"flex min-h-11 flex-wrap items-center justify-between gap-x-3 gap-y-1 border-b border-border px-4 py-2";
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* The inset well for a control block inside a panel. A visible step at the
|
|
19
|
+
* same depth, for filter rows and grouped controls.
|
|
20
|
+
*/
|
|
21
|
+
export const insetWellClass = "rounded-lg border border-border bg-muted/40 p-2";
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { Attachment } from "svelte/attachments";
|
|
2
|
+
|
|
3
|
+
/** The travelling highlight behind the active tab. Attach it to a span inside the list. */
|
|
4
|
+
|
|
5
|
+
// WHY attach to the pill, not the list: the pill finds its list via
|
|
6
|
+
// `parentElement`, so any strip that renders one span gets the motion.
|
|
7
|
+
|
|
8
|
+
// WHY measure: the active item's width is its label. The selector covers the
|
|
9
|
+
// three ways a strip marks it: a tab, a nav link, a toggle.
|
|
10
|
+
|
|
11
|
+
// Per transitions.dev `tabs-sliding`: first paint and resizes write the
|
|
12
|
+
// position with the transition off, so the pill snaps in instead of flying.
|
|
13
|
+
const ACTIVE = '[data-state="active"],[aria-current="page"],[aria-pressed="true"]';
|
|
14
|
+
|
|
15
|
+
export const slidingPill: Attachment<HTMLElement> = (pill) => {
|
|
16
|
+
const list = pill.parentElement;
|
|
17
|
+
if (!list) return;
|
|
18
|
+
|
|
19
|
+
let settled = false;
|
|
20
|
+
|
|
21
|
+
const move = (animate: boolean) => {
|
|
22
|
+
const active = list.querySelector<HTMLElement>(ACTIVE);
|
|
23
|
+
if (!active) {
|
|
24
|
+
pill.style.opacity = "0";
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
pill.style.opacity = "1";
|
|
28
|
+
if (animate) {
|
|
29
|
+
pill.style.transform = `translateX(${active.offsetLeft}px)`;
|
|
30
|
+
pill.style.width = `${active.offsetWidth}px`;
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
// Suspend, write, reflow, restore. Without the reflow the browser
|
|
34
|
+
// coalesces the two writes and the snap animates anyway.
|
|
35
|
+
pill.style.transition = "none";
|
|
36
|
+
pill.style.transform = `translateX(${active.offsetLeft}px)`;
|
|
37
|
+
pill.style.width = `${active.offsetWidth}px`;
|
|
38
|
+
void pill.offsetWidth;
|
|
39
|
+
pill.style.transition = "";
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
// Position first, THEN hand the highlight over. Swapped, one frame draws both
|
|
43
|
+
// the trigger's own background and a zero-width pill: a flicker on hydration.
|
|
44
|
+
move(false);
|
|
45
|
+
list.dataset.pill = "on";
|
|
46
|
+
settled = true;
|
|
47
|
+
|
|
48
|
+
// The selection lives in an attribute bits-ui owns, and a badge arriving
|
|
49
|
+
// changes a trigger's width without any attribute changing.
|
|
50
|
+
const attributes = new MutationObserver(() => move(settled));
|
|
51
|
+
attributes.observe(list, {
|
|
52
|
+
subtree: true,
|
|
53
|
+
childList: true,
|
|
54
|
+
attributes: true,
|
|
55
|
+
attributeFilter: ["data-state", "aria-current", "aria-pressed"],
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
// A list that reflows (a rail collapsing, a font landing) re-measures
|
|
59
|
+
// without motion: nothing was chosen, so nothing should travel.
|
|
60
|
+
const resize = new ResizeObserver(() => move(false));
|
|
61
|
+
resize.observe(list);
|
|
62
|
+
|
|
63
|
+
return () => {
|
|
64
|
+
attributes.disconnect();
|
|
65
|
+
resize.disconnect();
|
|
66
|
+
delete list.dataset.pill;
|
|
67
|
+
};
|
|
68
|
+
};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
export interface RevealThemeOptions {
|
|
2
|
+
/** Apply the change without the wipe, for a swap that paints the same theme. */
|
|
3
|
+
skip?: boolean;
|
|
4
|
+
/** Wipe length in ms. */
|
|
5
|
+
duration?: number;
|
|
6
|
+
/** Wipe easing, any CSS easing value. */
|
|
7
|
+
easing?: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/** Where the wipe grows from: a click, an element, or a point in the viewport. */
|
|
11
|
+
export type RevealOrigin = MouseEvent | Element | { x: number; y: number };
|
|
12
|
+
|
|
13
|
+
const DEFAULT_DURATION = 400;
|
|
14
|
+
const STYLE_ID = "heyramzi-reveal-theme";
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Run `apply` inside a circular wipe that grows from the centre of the clicked
|
|
18
|
+
* element, the element, or a point. Falls back to a plain `apply()` when the
|
|
19
|
+
* browser has no view transitions, the user prefers reduced motion, or `skip`
|
|
20
|
+
* is set. It adds the `::view-transition-*(root)` reset itself.
|
|
21
|
+
*/
|
|
22
|
+
export function revealTheme(
|
|
23
|
+
origin: RevealOrigin,
|
|
24
|
+
apply: () => void,
|
|
25
|
+
options: RevealThemeOptions = {},
|
|
26
|
+
): void {
|
|
27
|
+
const { skip = false, duration = DEFAULT_DURATION, easing = "ease-in-out" } = options;
|
|
28
|
+
const point = resolveOrigin(origin);
|
|
29
|
+
|
|
30
|
+
const prefersReduced = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
31
|
+
|
|
32
|
+
if (skip || prefersReduced || !document.startViewTransition || !point) {
|
|
33
|
+
apply();
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const { x, y } = point;
|
|
38
|
+
const endRadius = Math.hypot(
|
|
39
|
+
Math.max(x, window.innerWidth - x),
|
|
40
|
+
Math.max(y, window.innerHeight - y),
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
ensureStyles();
|
|
44
|
+
|
|
45
|
+
const transition = document.startViewTransition(() => {
|
|
46
|
+
apply();
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
transition.ready.then(() => {
|
|
50
|
+
document.documentElement.animate(
|
|
51
|
+
{ clipPath: [`circle(0px at ${x}px ${y}px)`, `circle(${endRadius}px at ${x}px ${y}px)`] },
|
|
52
|
+
{ duration, easing, pseudoElement: "::view-transition-new(root)" },
|
|
53
|
+
);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function centreOf(element: Element): { x: number; y: number } {
|
|
58
|
+
const rect = element.getBoundingClientRect();
|
|
59
|
+
return { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 };
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// A click on a child still wipes from the control that owns the handler.
|
|
63
|
+
function resolveOrigin(origin: RevealOrigin): { x: number; y: number } | null {
|
|
64
|
+
if (origin instanceof Element) return centreOf(origin);
|
|
65
|
+
if (origin instanceof MouseEvent) {
|
|
66
|
+
return origin.currentTarget instanceof Element
|
|
67
|
+
? centreOf(origin.currentTarget)
|
|
68
|
+
: { x: origin.clientX, y: origin.clientY };
|
|
69
|
+
}
|
|
70
|
+
return origin;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function ensureStyles(): void {
|
|
74
|
+
if (document.getElementById(STYLE_ID)) return;
|
|
75
|
+
const style = document.createElement("style");
|
|
76
|
+
style.id = STYLE_ID;
|
|
77
|
+
style.textContent = `::view-transition-old(root),::view-transition-new(root){animation:none;mix-blend-mode:normal;}`;
|
|
78
|
+
document.head.appendChild(style);
|
|
79
|
+
}
|
package/src/lib/tone.ts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export type Tone = "neutral" | "accent" | "info" | "success" | "warning" | "destructive";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The severity scale, as Tailwind classes for a chip and as CSS colors for the
|
|
5
|
+
* dot. Tokens are plain CSS variables, so a host app can retheme them. The
|
|
6
|
+
* accent tone reads `--tone-accent` and falls back to `--color-primary`, for a
|
|
7
|
+
* host whose primary is a neutral and whose accent is a brand color.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
export const TONE_CLASS: Record<Tone, string> = {
|
|
11
|
+
neutral: "border-border bg-muted/40 text-muted-foreground",
|
|
12
|
+
accent:
|
|
13
|
+
"border-[color-mix(in_oklab,var(--tone-accent,var(--color-primary))_30%,transparent)] bg-[color-mix(in_oklab,var(--tone-accent,var(--color-primary))_10%,transparent)] text-[color:var(--tone-accent,var(--color-primary))]",
|
|
14
|
+
info: "border-info/30 bg-info/10 text-info-800 dark:text-info-400",
|
|
15
|
+
success: "border-success/30 bg-success/10 text-success-800 dark:text-success-400",
|
|
16
|
+
warning: "border-warning/30 bg-warning/10 text-warning-800 dark:text-warning-400",
|
|
17
|
+
destructive: "border-destructive/30 bg-destructive/10 text-destructive",
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
/** The same scale as text, for a verdict inside a line of muted facts. */
|
|
21
|
+
export const TONE_TEXT: Record<Tone, string> = {
|
|
22
|
+
neutral: "text-muted-foreground",
|
|
23
|
+
accent: "text-[color:var(--tone-accent,var(--color-primary))]",
|
|
24
|
+
info: "text-info-800 dark:text-info-400",
|
|
25
|
+
success: "text-success-800 dark:text-success-400",
|
|
26
|
+
warning: "text-warning-800 dark:text-warning-400",
|
|
27
|
+
destructive: "text-destructive",
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
/** The same scale as icon color. */
|
|
31
|
+
export const TONE_ICON: Record<Tone, string> = {
|
|
32
|
+
neutral: "text-muted-foreground",
|
|
33
|
+
accent: "text-[color:var(--tone-accent,var(--color-primary))]",
|
|
34
|
+
info: "text-info",
|
|
35
|
+
success: "text-success",
|
|
36
|
+
warning: "text-warning",
|
|
37
|
+
destructive: "text-destructive",
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/** The scale as CSS colors, for the SVG dot. */
|
|
41
|
+
export const TONE_COLOR: Record<Tone, string> = {
|
|
42
|
+
neutral: "var(--color-muted-foreground)",
|
|
43
|
+
accent: "var(--tone-accent,var(--color-primary))",
|
|
44
|
+
info: "var(--color-info)",
|
|
45
|
+
success: "var(--color-success)",
|
|
46
|
+
warning: "var(--color-warning)",
|
|
47
|
+
destructive: "var(--color-destructive)",
|
|
48
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Accordion as AccordionPrimitive } from "bits-ui";
|
|
3
|
+
import { cn, type WithoutChild } from "@heyramzi/utils";
|
|
4
|
+
|
|
5
|
+
let {
|
|
6
|
+
ref = $bindable(null),
|
|
7
|
+
class: className,
|
|
8
|
+
children,
|
|
9
|
+
...restProps
|
|
10
|
+
}: WithoutChild<AccordionPrimitive.ContentProps> = $props();
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<AccordionPrimitive.Content
|
|
14
|
+
bind:ref
|
|
15
|
+
data-slot="accordion-content"
|
|
16
|
+
class="data-open:animate-accordion-down data-closed:animate-accordion-up text-sm overflow-hidden"
|
|
17
|
+
{...restProps}
|
|
18
|
+
>
|
|
19
|
+
<div class={cn("pt-0 pb-4 [&_p:not(:last-child)]:mb-4", className)}>
|
|
20
|
+
{@render children?.()}
|
|
21
|
+
</div>
|
|
22
|
+
</AccordionPrimitive.Content>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Accordion as AccordionPrimitive } from "bits-ui";
|
|
3
|
+
import { cn } from "@heyramzi/utils";
|
|
4
|
+
|
|
5
|
+
let {
|
|
6
|
+
ref = $bindable(null),
|
|
7
|
+
class: className,
|
|
8
|
+
...restProps
|
|
9
|
+
}: AccordionPrimitive.ItemProps = $props();
|
|
10
|
+
</script>
|
|
11
|
+
|
|
12
|
+
<AccordionPrimitive.Item
|
|
13
|
+
bind:ref
|
|
14
|
+
data-slot="accordion-item"
|
|
15
|
+
class={cn("not-last:border-b", className)}
|
|
16
|
+
{...restProps}
|
|
17
|
+
/>
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { CaretDown } from "phosphor-svelte";
|
|
3
|
+
import { Accordion as AccordionPrimitive } from "bits-ui";
|
|
4
|
+
import { cn, type WithoutChild } from "@heyramzi/utils";
|
|
5
|
+
import type { Snippet } from "svelte";
|
|
6
|
+
|
|
7
|
+
let {
|
|
8
|
+
ref = $bindable(null),
|
|
9
|
+
class: className,
|
|
10
|
+
level = 3,
|
|
11
|
+
indicator,
|
|
12
|
+
children,
|
|
13
|
+
...restProps
|
|
14
|
+
}: WithoutChild<AccordionPrimitive.TriggerProps> & {
|
|
15
|
+
level?: AccordionPrimitive.HeaderProps["level"];
|
|
16
|
+
/** Replaces the caret, e.g. a plus that turns into a minus. Style it off
|
|
17
|
+
* `group-aria-expanded/accordion-trigger:`. */
|
|
18
|
+
indicator?: Snippet;
|
|
19
|
+
} = $props();
|
|
20
|
+
</script>
|
|
21
|
+
|
|
22
|
+
<AccordionPrimitive.Header {level} class="flex">
|
|
23
|
+
<AccordionPrimitive.Trigger
|
|
24
|
+
data-slot="accordion-trigger"
|
|
25
|
+
bind:ref
|
|
26
|
+
class={cn(
|
|
27
|
+
"focus-visible:ring-ring/50 focus-visible:border-ring focus-visible:after:border-ring **:data-[slot=accordion-trigger-icon]:text-muted-foreground rounded-md py-4 text-left text-sm font-medium hover:underline focus-visible:ring-3 **:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4 group/accordion-trigger relative flex flex-1 items-start justify-between border border-transparent transition-[color,background-color,border-color,box-shadow] duration-[var(--duration-quick)] ease-[var(--ease-smooth-out)] outline-none disabled:pointer-events-none disabled:opacity-50",
|
|
28
|
+
className,
|
|
29
|
+
)}
|
|
30
|
+
{...restProps}
|
|
31
|
+
>
|
|
32
|
+
{@render children?.()}
|
|
33
|
+
{#if indicator}
|
|
34
|
+
{@render indicator()}
|
|
35
|
+
{:else}
|
|
36
|
+
<!-- One caret that turns over, not two that swap. A transform and not a
|
|
37
|
+
`d:` path morph, which is Chromium-only. -->
|
|
38
|
+
<CaretDown
|
|
39
|
+
data-slot="accordion-trigger-icon"
|
|
40
|
+
class="cn-accordion-trigger-icon pointer-events-none shrink-0 transition-transform duration-[var(--duration-fast)] ease-[var(--ease-smooth-out)] group-aria-expanded/accordion-trigger:rotate-180 motion-reduce:transition-none"
|
|
41
|
+
/>
|
|
42
|
+
{/if}
|
|
43
|
+
</AccordionPrimitive.Trigger>
|
|
44
|
+
</AccordionPrimitive.Header>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Accordion as AccordionPrimitive } from "bits-ui";
|
|
3
|
+
import { cn } from "@heyramzi/utils";
|
|
4
|
+
|
|
5
|
+
let {
|
|
6
|
+
ref = $bindable(null),
|
|
7
|
+
value = $bindable(),
|
|
8
|
+
class: className,
|
|
9
|
+
...restProps
|
|
10
|
+
}: AccordionPrimitive.RootProps = $props();
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<AccordionPrimitive.Root
|
|
14
|
+
bind:ref
|
|
15
|
+
bind:value={value as never}
|
|
16
|
+
data-slot="accordion"
|
|
17
|
+
class={cn("cn-accordion flex w-full flex-col", className)}
|
|
18
|
+
{...restProps}
|
|
19
|
+
/>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import Root from "./accordion.svelte";
|
|
2
|
+
import Content from "./accordion-content.svelte";
|
|
3
|
+
import Item from "./accordion-item.svelte";
|
|
4
|
+
import Trigger from "./accordion-trigger.svelte";
|
|
5
|
+
|
|
6
|
+
export {
|
|
7
|
+
Content,
|
|
8
|
+
Content as AccordionContent,
|
|
9
|
+
Item,
|
|
10
|
+
Item as AccordionItem,
|
|
11
|
+
Root,
|
|
12
|
+
//
|
|
13
|
+
Root as Accordion,
|
|
14
|
+
Trigger,
|
|
15
|
+
Trigger as AccordionTrigger,
|
|
16
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { HTMLAttributes } from "svelte/elements";
|
|
3
|
+
import { cn, type WithElementRef } from "@heyramzi/utils";
|
|
4
|
+
|
|
5
|
+
let {
|
|
6
|
+
ref = $bindable(null),
|
|
7
|
+
class: className,
|
|
8
|
+
children,
|
|
9
|
+
...restProps
|
|
10
|
+
}: WithElementRef<HTMLAttributes<HTMLDivElement>> = $props();
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<div
|
|
14
|
+
bind:this={ref}
|
|
15
|
+
data-slot="alert-description"
|
|
16
|
+
class={cn(
|
|
17
|
+
"text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed",
|
|
18
|
+
className,
|
|
19
|
+
)}
|
|
20
|
+
{...restProps}
|
|
21
|
+
>
|
|
22
|
+
{@render children?.()}
|
|
23
|
+
</div>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { HTMLAttributes } from "svelte/elements";
|
|
3
|
+
import { cn, type WithElementRef } from "@heyramzi/utils";
|
|
4
|
+
|
|
5
|
+
let {
|
|
6
|
+
ref = $bindable(null),
|
|
7
|
+
class: className,
|
|
8
|
+
children,
|
|
9
|
+
...restProps
|
|
10
|
+
}: WithElementRef<HTMLAttributes<HTMLDivElement>> = $props();
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<div
|
|
14
|
+
bind:this={ref}
|
|
15
|
+
data-slot="alert-title"
|
|
16
|
+
class={cn("col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight", className)}
|
|
17
|
+
{...restProps}
|
|
18
|
+
>
|
|
19
|
+
{@render children?.()}
|
|
20
|
+
</div>
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import { type VariantProps, tv } from "tailwind-variants";
|
|
3
|
+
|
|
4
|
+
export const alertVariants = tv({
|
|
5
|
+
base: "relative grid w-full grid-cols-[0_1fr] items-start gap-y-0.5 rounded-lg border px-4 py-3 text-sm has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] has-[>svg]:gap-x-3 [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current",
|
|
6
|
+
variants: {
|
|
7
|
+
variant: {
|
|
8
|
+
default: "bg-card text-card-foreground",
|
|
9
|
+
destructive:
|
|
10
|
+
"text-destructive bg-card *:data-[slot=alert-description]:text-destructive/90 [&>svg]:text-current",
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
defaultVariants: {
|
|
14
|
+
variant: "default",
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
export type AlertVariant = VariantProps<typeof alertVariants>["variant"];
|
|
19
|
+
</script>
|
|
20
|
+
|
|
21
|
+
<script lang="ts">
|
|
22
|
+
import type { HTMLAttributes } from "svelte/elements";
|
|
23
|
+
import { cn, type WithElementRef } from "@heyramzi/utils";
|
|
24
|
+
|
|
25
|
+
let {
|
|
26
|
+
ref = $bindable(null),
|
|
27
|
+
class: className,
|
|
28
|
+
variant = "default",
|
|
29
|
+
// A caller whose message isn't urgent passes `status`, so a screen reader doesn't interrupt.
|
|
30
|
+
role = "alert",
|
|
31
|
+
children,
|
|
32
|
+
...restProps
|
|
33
|
+
}: WithElementRef<HTMLAttributes<HTMLDivElement>> & {
|
|
34
|
+
variant?: AlertVariant;
|
|
35
|
+
} = $props();
|
|
36
|
+
</script>
|
|
37
|
+
|
|
38
|
+
<div
|
|
39
|
+
bind:this={ref}
|
|
40
|
+
data-slot="alert"
|
|
41
|
+
class={cn(alertVariants({ variant }), className)}
|
|
42
|
+
{...restProps}
|
|
43
|
+
{role}
|
|
44
|
+
>
|
|
45
|
+
{@render children?.()}
|
|
46
|
+
</div>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import Root from "./alert.svelte";
|
|
2
|
+
import Description from "./alert-description.svelte";
|
|
3
|
+
import Title from "./alert-title.svelte";
|
|
4
|
+
export { alertVariants, type AlertVariant } from "./alert.svelte";
|
|
5
|
+
|
|
6
|
+
export {
|
|
7
|
+
Root,
|
|
8
|
+
Description,
|
|
9
|
+
Title,
|
|
10
|
+
//
|
|
11
|
+
Root as Alert,
|
|
12
|
+
Description as AlertDescription,
|
|
13
|
+
Title as AlertTitle,
|
|
14
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { AlertDialog as AlertDialogPrimitive } from "bits-ui";
|
|
3
|
+
import { buttonVariants } from "../button/index.js";
|
|
4
|
+
import { cn } from "@heyramzi/utils";
|
|
5
|
+
|
|
6
|
+
let {
|
|
7
|
+
ref = $bindable(null),
|
|
8
|
+
class: className,
|
|
9
|
+
...restProps
|
|
10
|
+
}: AlertDialogPrimitive.ActionProps = $props();
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<AlertDialogPrimitive.Action
|
|
14
|
+
bind:ref
|
|
15
|
+
data-slot="alert-dialog-action"
|
|
16
|
+
class={cn(buttonVariants(), className)}
|
|
17
|
+
{...restProps}
|
|
18
|
+
/>
|