@heyramzi/ui 0.0.0-stage → 1.53.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/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 +592 -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 +110 -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 +181 -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 +256 -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,324 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GLSL ported from ruucm/shadergradient (`shaders/defaults/plane`), rewritten for plain WebGL.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/*
|
|
6
|
+
* Upstream runs the same math through a three.js MeshPhysicalMaterial, but its canvas is configured `linear: true, flat: true` (no sRGB encode, no tone mapping) and its only light is `ambientLight`
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/*
|
|
10
|
+
* at `brightness * PI`. With no directional light and no environment map, every specular term of that material is zero and the whole PBR path collapses to
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/*
|
|
14
|
+
* irradiance * BRDF_Lambert(diffuse * (1 - metalness)) = (brightness * PI) * (1 / PI) * (base * 0.8) = brightness * 0.8 * base
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/*
|
|
18
|
+
* which is the one multiply in the fragment shader below.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/*
|
|
22
|
+
* That is why this component carries no `reflection`, `envPreset` or `lightType` prop: upstream reads them, and at these settings none of them can change a pixel.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
/** Classic 3D Perlin noise, from glsl-noise/periodic/3d, exactly as upstream vendors it. */
|
|
26
|
+
const CLASSIC_NOISE_3D = /* glsl */ `
|
|
27
|
+
vec3 mod289(vec3 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }
|
|
28
|
+
vec4 mod289(vec4 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }
|
|
29
|
+
vec4 permute(vec4 x) { return mod289(((x * 34.0) + 1.0) * x); }
|
|
30
|
+
vec4 taylorInvSqrt(vec4 r) { return 1.79284291400159 - 0.85373472095314 * r; }
|
|
31
|
+
vec3 fade(vec3 t) { return t * t * t * (t * (t * 6.0 - 15.0) + 10.0); }
|
|
32
|
+
|
|
33
|
+
float cnoise(vec3 P) {
|
|
34
|
+
vec3 Pi0 = floor(P);
|
|
35
|
+
vec3 Pi1 = Pi0 + vec3(1.0);
|
|
36
|
+
Pi0 = mod289(Pi0);
|
|
37
|
+
Pi1 = mod289(Pi1);
|
|
38
|
+
vec3 Pf0 = fract(P);
|
|
39
|
+
vec3 Pf1 = Pf0 - vec3(1.0);
|
|
40
|
+
vec4 ix = vec4(Pi0.x, Pi1.x, Pi0.x, Pi1.x);
|
|
41
|
+
vec4 iy = vec4(Pi0.yy, Pi1.yy);
|
|
42
|
+
vec4 iz0 = Pi0.zzzz;
|
|
43
|
+
vec4 iz1 = Pi1.zzzz;
|
|
44
|
+
|
|
45
|
+
vec4 ixy = permute(permute(ix) + iy);
|
|
46
|
+
vec4 ixy0 = permute(ixy + iz0);
|
|
47
|
+
vec4 ixy1 = permute(ixy + iz1);
|
|
48
|
+
|
|
49
|
+
vec4 gx0 = ixy0 * (1.0 / 7.0);
|
|
50
|
+
vec4 gy0 = fract(floor(gx0) * (1.0 / 7.0)) - 0.5;
|
|
51
|
+
gx0 = fract(gx0);
|
|
52
|
+
vec4 gz0 = vec4(0.5) - abs(gx0) - abs(gy0);
|
|
53
|
+
vec4 sz0 = step(gz0, vec4(0.0));
|
|
54
|
+
gx0 -= sz0 * (step(0.0, gx0) - 0.5);
|
|
55
|
+
gy0 -= sz0 * (step(0.0, gy0) - 0.5);
|
|
56
|
+
|
|
57
|
+
vec4 gx1 = ixy1 * (1.0 / 7.0);
|
|
58
|
+
vec4 gy1 = fract(floor(gx1) * (1.0 / 7.0)) - 0.5;
|
|
59
|
+
gx1 = fract(gx1);
|
|
60
|
+
vec4 gz1 = vec4(0.5) - abs(gx1) - abs(gy1);
|
|
61
|
+
vec4 sz1 = step(gz1, vec4(0.0));
|
|
62
|
+
gx1 -= sz1 * (step(0.0, gx1) - 0.5);
|
|
63
|
+
gy1 -= sz1 * (step(0.0, gy1) - 0.5);
|
|
64
|
+
|
|
65
|
+
vec3 g000 = vec3(gx0.x, gy0.x, gz0.x);
|
|
66
|
+
vec3 g100 = vec3(gx0.y, gy0.y, gz0.y);
|
|
67
|
+
vec3 g010 = vec3(gx0.z, gy0.z, gz0.z);
|
|
68
|
+
vec3 g110 = vec3(gx0.w, gy0.w, gz0.w);
|
|
69
|
+
vec3 g001 = vec3(gx1.x, gy1.x, gz1.x);
|
|
70
|
+
vec3 g101 = vec3(gx1.y, gy1.y, gz1.y);
|
|
71
|
+
vec3 g011 = vec3(gx1.z, gy1.z, gz1.z);
|
|
72
|
+
vec3 g111 = vec3(gx1.w, gy1.w, gz1.w);
|
|
73
|
+
|
|
74
|
+
vec4 norm0 = taylorInvSqrt(vec4(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110)));
|
|
75
|
+
g000 *= norm0.x;
|
|
76
|
+
g010 *= norm0.y;
|
|
77
|
+
g100 *= norm0.z;
|
|
78
|
+
g110 *= norm0.w;
|
|
79
|
+
vec4 norm1 = taylorInvSqrt(vec4(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111)));
|
|
80
|
+
g001 *= norm1.x;
|
|
81
|
+
g011 *= norm1.y;
|
|
82
|
+
g101 *= norm1.z;
|
|
83
|
+
g111 *= norm1.w;
|
|
84
|
+
|
|
85
|
+
float n000 = dot(g000, Pf0);
|
|
86
|
+
float n100 = dot(g100, vec3(Pf1.x, Pf0.yz));
|
|
87
|
+
float n010 = dot(g010, vec3(Pf0.x, Pf1.y, Pf0.z));
|
|
88
|
+
float n110 = dot(g110, vec3(Pf1.xy, Pf0.z));
|
|
89
|
+
float n001 = dot(g001, vec3(Pf0.xy, Pf1.z));
|
|
90
|
+
float n101 = dot(g101, vec3(Pf1.x, Pf0.y, Pf1.z));
|
|
91
|
+
float n011 = dot(g011, vec3(Pf0.x, Pf1.yz));
|
|
92
|
+
float n111 = dot(g111, Pf1);
|
|
93
|
+
|
|
94
|
+
vec3 fade_xyz = fade(Pf0);
|
|
95
|
+
vec4 n_z = mix(vec4(n000, n100, n010, n110), vec4(n001, n101, n011, n111), fade_xyz.z);
|
|
96
|
+
vec2 n_yz = mix(n_z.xy, n_z.zw, fade_xyz.y);
|
|
97
|
+
float n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x);
|
|
98
|
+
return 2.2 * n_xyz;
|
|
99
|
+
}
|
|
100
|
+
`;
|
|
101
|
+
|
|
102
|
+
export const MESH_VERTEX_SHADER = /* glsl */ `
|
|
103
|
+
precision highp float;
|
|
104
|
+
|
|
105
|
+
attribute vec3 position;
|
|
106
|
+
|
|
107
|
+
uniform mat4 uProjectionMatrix;
|
|
108
|
+
uniform mat4 uViewMatrix;
|
|
109
|
+
uniform mat4 uModelMatrix;
|
|
110
|
+
uniform float uTime;
|
|
111
|
+
uniform float uSpeed;
|
|
112
|
+
uniform float uNoiseDensity;
|
|
113
|
+
uniform float uNoiseStrength;
|
|
114
|
+
|
|
115
|
+
varying vec3 vPos;
|
|
116
|
+
|
|
117
|
+
${CLASSIC_NOISE_3D}
|
|
118
|
+
|
|
119
|
+
void main() {
|
|
120
|
+
float t = uTime * uSpeed;
|
|
121
|
+
|
|
122
|
+
// The plane's normal is a constant (0, 0, 1), so the whole mesh folds along z only.
|
|
123
|
+
vec3 noisePos = 0.43 * position * uNoiseDensity;
|
|
124
|
+
float distortion = 0.75 * cnoise(noisePos + t);
|
|
125
|
+
vec3 pos = position + vec3(0.0, 0.0, 1.0) * distortion * uNoiseStrength;
|
|
126
|
+
|
|
127
|
+
vPos = pos;
|
|
128
|
+
gl_Position = uProjectionMatrix * uViewMatrix * uModelMatrix * vec4(pos, 1.0);
|
|
129
|
+
}
|
|
130
|
+
`;
|
|
131
|
+
|
|
132
|
+
export const MESH_FRAGMENT_SHADER = /* glsl */ `
|
|
133
|
+
precision highp float;
|
|
134
|
+
|
|
135
|
+
uniform vec3 uC1;
|
|
136
|
+
uniform vec3 uC2;
|
|
137
|
+
uniform vec3 uC3;
|
|
138
|
+
uniform float uBrightness;
|
|
139
|
+
uniform float uFoldRange;
|
|
140
|
+
|
|
141
|
+
varying vec3 vPos;
|
|
142
|
+
|
|
143
|
+
void main() {
|
|
144
|
+
// Left to right sweep between the first two stops.
|
|
145
|
+
vec3 base = mix(uC1, uC2, smoothstep(-3.0, 3.0, vPos.x));
|
|
146
|
+
|
|
147
|
+
// The third stop rides the fold depth, over the range the fold actually reaches.
|
|
148
|
+
//
|
|
149
|
+
// WHY this is a smoothstep and not upstream's raw mix of the stop against vPos.z: vPos.z
|
|
150
|
+
// is a world coordinate, not a ratio, and at the preset strength it swings about
|
|
151
|
+
// three units. mix does not clamp, so that reads as a mix factor of -3 to 3 and
|
|
152
|
+
// throws the colour far outside the gamut, where every channel meets 0 or 1 and
|
|
153
|
+
// stops. Each of those meetings is a straight hard edge across the gradient, and
|
|
154
|
+
// they are what draws the diagonal lines. Upstream gets away with it because its
|
|
155
|
+
// stops are pale: a pastel pushed three times past itself is still roughly a
|
|
156
|
+
// colour. A palette with real chroma in it, which is the point of using brand
|
|
157
|
+
// colours, hits the wall almost at once.
|
|
158
|
+
//
|
|
159
|
+
// Mapping the fold across its own range keeps every pixel inside the gamut, so the
|
|
160
|
+
// field stays smooth wherever the stops are taken from. The trade is the blown out
|
|
161
|
+
// highlight upstream gets for free; the answer to that is a brighter third stop,
|
|
162
|
+
// which is a decision the caller can see and make.
|
|
163
|
+
vec3 color = mix(base, uC3, smoothstep(-uFoldRange, uFoldRange, vPos.z));
|
|
164
|
+
|
|
165
|
+
// Ambient-only lighting, metalness 0.2. See the note at the top of this file.
|
|
166
|
+
gl_FragColor = vec4(color * uBrightness * 0.8, 1.0);
|
|
167
|
+
}
|
|
168
|
+
`;
|
|
169
|
+
|
|
170
|
+
export const QUAD_VERTEX_SHADER = /* glsl */ `
|
|
171
|
+
precision highp float;
|
|
172
|
+
|
|
173
|
+
attribute vec2 position;
|
|
174
|
+
|
|
175
|
+
varying vec2 vUV;
|
|
176
|
+
varying vec2 vPosition;
|
|
177
|
+
|
|
178
|
+
void main() {
|
|
179
|
+
vUV = position * 0.5 + 0.5;
|
|
180
|
+
vPosition = position;
|
|
181
|
+
gl_Position = vec4(position, 0.0, 1.0);
|
|
182
|
+
}
|
|
183
|
+
`;
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* RGB halftone, ported from three's HalftoneShader as upstream configures it: dot shape, scatter 1, linear blending at 1 (so the dots replace the source rather than blend with it) and
|
|
187
|
+
*/
|
|
188
|
+
|
|
189
|
+
/*
|
|
190
|
+
* the per-channel rotations from `PostProcessing.tsx`.
|
|
191
|
+
*/
|
|
192
|
+
|
|
193
|
+
/*
|
|
194
|
+
* Upstream's `getSample` averages nine taps spread over `radius * 0.0`, meaning nine taps of the same texel.
|
|
195
|
+
*/
|
|
196
|
+
|
|
197
|
+
/*
|
|
198
|
+
* This keeps one tap, which is the same value for a twelfth of the bandwidth.
|
|
199
|
+
*/
|
|
200
|
+
export const HALFTONE_FRAGMENT_SHADER = /* glsl */ `
|
|
201
|
+
precision highp float;
|
|
202
|
+
|
|
203
|
+
#define PI2 6.28318531
|
|
204
|
+
|
|
205
|
+
uniform sampler2D tDiffuse;
|
|
206
|
+
uniform float uRadius;
|
|
207
|
+
uniform float uRotateR;
|
|
208
|
+
uniform float uRotateG;
|
|
209
|
+
uniform float uRotateB;
|
|
210
|
+
uniform float uScatter;
|
|
211
|
+
uniform float uWidth;
|
|
212
|
+
uniform float uHeight;
|
|
213
|
+
|
|
214
|
+
varying vec2 vUV;
|
|
215
|
+
varying vec2 vPosition;
|
|
216
|
+
|
|
217
|
+
struct Cell {
|
|
218
|
+
vec2 p1;
|
|
219
|
+
vec2 p2;
|
|
220
|
+
vec2 p3;
|
|
221
|
+
vec2 p4;
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
float hypot(float x, float y) { return sqrt(x * x + y * y); }
|
|
225
|
+
|
|
226
|
+
float rand(vec2 seed) {
|
|
227
|
+
return fract(sin(dot(seed.xy, vec2(12.9898, 78.233))) * 43758.5453);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
vec4 getSample(vec2 point) {
|
|
231
|
+
return texture2D(tDiffuse, vec2(point.x / uWidth, point.y / uHeight));
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
float distanceToDotRadius(float channel, vec2 coord, vec2 p, float radMax) {
|
|
235
|
+
float dist = hypot(coord.x - p.x, coord.y - p.y);
|
|
236
|
+
float rad = pow(abs(channel), 1.125) * radMax;
|
|
237
|
+
return rad - dist;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
Cell getReferenceCell(vec2 p, vec2 origin, float gridAngle, float step_) {
|
|
241
|
+
Cell c;
|
|
242
|
+
|
|
243
|
+
vec2 n = vec2(cos(gridAngle), sin(gridAngle));
|
|
244
|
+
float threshold = step_ * 0.5;
|
|
245
|
+
float dotNormal = n.x * (p.x - origin.x) + n.y * (p.y - origin.y);
|
|
246
|
+
float dotLine = -n.y * (p.x - origin.x) + n.x * (p.y - origin.y);
|
|
247
|
+
vec2 offset = vec2(n.x * dotNormal, n.y * dotNormal);
|
|
248
|
+
float offsetNormal = mod(hypot(offset.x, offset.y), step_);
|
|
249
|
+
float normalDir = (dotNormal < 0.0) ? 1.0 : -1.0;
|
|
250
|
+
float normalScale = ((offsetNormal < threshold) ? -offsetNormal : step_ - offsetNormal) * normalDir;
|
|
251
|
+
float offsetLine = mod(hypot((p.x - offset.x) - origin.x, (p.y - offset.y) - origin.y), step_);
|
|
252
|
+
float lineDir = (dotLine < 0.0) ? 1.0 : -1.0;
|
|
253
|
+
float lineScale = ((offsetLine < threshold) ? -offsetLine : step_ - offsetLine) * lineDir;
|
|
254
|
+
|
|
255
|
+
c.p1.x = p.x - n.x * normalScale + n.y * lineScale;
|
|
256
|
+
c.p1.y = p.y - n.y * normalScale - n.x * lineScale;
|
|
257
|
+
|
|
258
|
+
if (uScatter != 0.0) {
|
|
259
|
+
float offMag = uScatter * threshold * 0.5;
|
|
260
|
+
float offAngle = rand(vec2(floor(c.p1.x), floor(c.p1.y))) * PI2;
|
|
261
|
+
c.p1.x += cos(offAngle) * offMag;
|
|
262
|
+
c.p1.y += sin(offAngle) * offMag;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
float normalStep = normalDir * ((offsetNormal < threshold) ? step_ : -step_);
|
|
266
|
+
float lineStep = lineDir * ((offsetLine < threshold) ? step_ : -step_);
|
|
267
|
+
c.p2.x = c.p1.x - n.x * normalStep;
|
|
268
|
+
c.p2.y = c.p1.y - n.y * normalStep;
|
|
269
|
+
c.p3.x = c.p1.x + n.y * lineStep;
|
|
270
|
+
c.p3.y = c.p1.y - n.x * lineStep;
|
|
271
|
+
c.p4.x = c.p1.x - n.x * normalStep + n.y * lineStep;
|
|
272
|
+
c.p4.y = c.p1.y - n.y * normalStep - n.x * lineStep;
|
|
273
|
+
|
|
274
|
+
return c;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
float getDotColour(Cell c, vec2 p, vec3 channel, float aa) {
|
|
278
|
+
// Selected by dot product rather than by component index, because GLSL ES 1.00 leaves
|
|
279
|
+
// dynamic component indexing to the driver and some of them refuse to compile it.
|
|
280
|
+
vec4 channels = vec4(
|
|
281
|
+
dot(getSample(c.p1).rgb, channel),
|
|
282
|
+
dot(getSample(c.p2).rgb, channel),
|
|
283
|
+
dot(getSample(c.p3).rgb, channel),
|
|
284
|
+
dot(getSample(c.p4).rgb, channel)
|
|
285
|
+
);
|
|
286
|
+
|
|
287
|
+
float d1 = distanceToDotRadius(channels.x, c.p1, p, uRadius);
|
|
288
|
+
float d2 = distanceToDotRadius(channels.y, c.p2, p, uRadius);
|
|
289
|
+
float d3 = distanceToDotRadius(channels.z, c.p3, p, uRadius);
|
|
290
|
+
float d4 = distanceToDotRadius(channels.w, c.p4, p, uRadius);
|
|
291
|
+
|
|
292
|
+
float res = (d1 > 0.0) ? clamp(d1 / aa, 0.0, 1.0) : 0.0;
|
|
293
|
+
res += (d2 > 0.0) ? clamp(d2 / aa, 0.0, 1.0) : 0.0;
|
|
294
|
+
res += (d3 > 0.0) ? clamp(d3 / aa, 0.0, 1.0) : 0.0;
|
|
295
|
+
res += (d4 > 0.0) ? clamp(d4 / aa, 0.0, 1.0) : 0.0;
|
|
296
|
+
|
|
297
|
+
return clamp(res, 0.0, 1.0);
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
void main() {
|
|
301
|
+
// Subtracting vPosition is upstream's nudge that keeps the dot grid off the
|
|
302
|
+
// frame edge, where a partial cell reads as a black border.
|
|
303
|
+
vec2 p = vec2(vUV.x * uWidth, vUV.y * uHeight) - vPosition * 3.0;
|
|
304
|
+
vec2 origin = vec2(0.0);
|
|
305
|
+
float aa = (uRadius < 2.5) ? uRadius * 0.5 : 1.25;
|
|
306
|
+
|
|
307
|
+
Cell cellR = getReferenceCell(p, origin, uRotateR, uRadius);
|
|
308
|
+
Cell cellG = getReferenceCell(p, origin, uRotateG, uRadius);
|
|
309
|
+
Cell cellB = getReferenceCell(p, origin, uRotateB, uRadius);
|
|
310
|
+
|
|
311
|
+
float r = getDotColour(cellR, p, vec3(1.0, 0.0, 0.0), aa);
|
|
312
|
+
float g = getDotColour(cellG, p, vec3(0.0, 1.0, 0.0), aa);
|
|
313
|
+
float b = getDotColour(cellB, p, vec3(0.0, 0.0, 1.0), aa);
|
|
314
|
+
|
|
315
|
+
// A channel that is black in the source stays black, so the dots never lighten
|
|
316
|
+
// an unlit part of the frame.
|
|
317
|
+
vec4 source = texture2D(tDiffuse, vUV);
|
|
318
|
+
r = (source.r == 0.0) ? 0.0 : r;
|
|
319
|
+
g = (source.g == 0.0) ? 0.0 : g;
|
|
320
|
+
b = (source.b == 0.0) ? 0.0 : b;
|
|
321
|
+
|
|
322
|
+
gl_FragColor = vec4(r, g, b, 1.0);
|
|
323
|
+
}
|
|
324
|
+
`;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
export interface ShaderGradientProps {
|
|
2
|
+
class?: string;
|
|
3
|
+
/** Warm stop. Any CSS color, including `var(--token)`. Read at the left edge of the plane. */
|
|
4
|
+
color1?: string;
|
|
5
|
+
/** Middle stop. Read at the right edge of the plane. */
|
|
6
|
+
color2?: string;
|
|
7
|
+
/** Cool stop. Mixed in by the noise displacement, so it rides the crests and troughs. */
|
|
8
|
+
color3?: string;
|
|
9
|
+
/** Painted behind the mesh. The mesh covers the frame at the default camera, so it only shows at extreme angles. */
|
|
10
|
+
bgColor?: string;
|
|
11
|
+
/** false freezes the field at `uTime`. Forced false when the visitor asks for reduced motion. */
|
|
12
|
+
animate?: boolean;
|
|
13
|
+
/** Ambient light. 1 is flat, above 1 lifts the whole field. */
|
|
14
|
+
brightness?: number;
|
|
15
|
+
/** Camera azimuth in degrees. */
|
|
16
|
+
cAzimuthAngle?: number;
|
|
17
|
+
/** Camera polar angle in degrees. */
|
|
18
|
+
cPolarAngle?: number;
|
|
19
|
+
/** Camera distance from the origin. */
|
|
20
|
+
cDistance?: number;
|
|
21
|
+
/** Vertical field of view in degrees. */
|
|
22
|
+
fov?: number;
|
|
23
|
+
positionX?: number;
|
|
24
|
+
positionY?: number;
|
|
25
|
+
positionZ?: number;
|
|
26
|
+
/** Mesh rotation in degrees, applied in XYZ order. */
|
|
27
|
+
rotationX?: number;
|
|
28
|
+
rotationY?: number;
|
|
29
|
+
rotationZ?: number;
|
|
30
|
+
/** Noise density. Higher packs more folds into the same plane. */
|
|
31
|
+
uDensity?: number;
|
|
32
|
+
/** Noise travel speed. */
|
|
33
|
+
uSpeed?: number;
|
|
34
|
+
/** Displacement amplitude. Drives how far color3 pushes into the mix. */
|
|
35
|
+
uStrength?: number;
|
|
36
|
+
/** Starting time offset in seconds. Two instances with different offsets never sit on the same frame. */
|
|
37
|
+
uTime?: number;
|
|
38
|
+
/** Halftone dot screen over the render. This is the upstream `grain` switch. */
|
|
39
|
+
grain?: boolean;
|
|
40
|
+
/** Halftone dot radius in device pixels. */
|
|
41
|
+
grainRadius?: number;
|
|
42
|
+
/** Render scale. 1 matches upstream and is enough for a gradient this smooth. */
|
|
43
|
+
pixelDensity?: number;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Everything the renderer needs, with colors already resolved to 0..1 RGB triplets. */
|
|
47
|
+
export interface ShaderGradientUniforms {
|
|
48
|
+
color1: [number, number, number];
|
|
49
|
+
color2: [number, number, number];
|
|
50
|
+
color3: [number, number, number];
|
|
51
|
+
bgColor: [number, number, number];
|
|
52
|
+
brightness: number;
|
|
53
|
+
cAzimuthAngle: number;
|
|
54
|
+
cPolarAngle: number;
|
|
55
|
+
cDistance: number;
|
|
56
|
+
fov: number;
|
|
57
|
+
positionX: number;
|
|
58
|
+
positionY: number;
|
|
59
|
+
positionZ: number;
|
|
60
|
+
rotationX: number;
|
|
61
|
+
rotationY: number;
|
|
62
|
+
rotationZ: number;
|
|
63
|
+
uDensity: number;
|
|
64
|
+
uSpeed: number;
|
|
65
|
+
uStrength: number;
|
|
66
|
+
grain: boolean;
|
|
67
|
+
grainRadius: number;
|
|
68
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
@keyframes spotlight {
|
|
2
|
+
0% {
|
|
3
|
+
opacity: 0;
|
|
4
|
+
transform: translate(-72%, -62%) scale(0.5);
|
|
5
|
+
}
|
|
6
|
+
100% {
|
|
7
|
+
opacity: 1;
|
|
8
|
+
transform: translate(-50%, -40%) scale(1);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.hr-spotlight.animate-spotlight {
|
|
13
|
+
animation: spotlight 2s ease 0.75s 1 forwards;
|
|
14
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
// =========================
|
|
3
|
+
// IMPORTS
|
|
4
|
+
// =========================
|
|
5
|
+
import "./Spotlight.css";
|
|
6
|
+
import { cn } from "@heyramzi/utils";
|
|
7
|
+
|
|
8
|
+
// =========================
|
|
9
|
+
// TYPES
|
|
10
|
+
// =========================
|
|
11
|
+
type Props = {
|
|
12
|
+
class?: string;
|
|
13
|
+
fill?: string;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
// =========================
|
|
17
|
+
// PROPS
|
|
18
|
+
// =========================
|
|
19
|
+
let { class: className, fill = "white" }: Props = $props();
|
|
20
|
+
</script>
|
|
21
|
+
|
|
22
|
+
<!-- =========================== -->
|
|
23
|
+
<!-- MARKUP -->
|
|
24
|
+
<!-- =========================== -->
|
|
25
|
+
<!-- no-inline-svg-ignore: static decorative blob, animated via the spotlight keyframe -->
|
|
26
|
+
<svg
|
|
27
|
+
class={cn(
|
|
28
|
+
"hr-spotlight pointer-events-none absolute z-[1] h-[169%] w-[138%] animate-spotlight opacity-0 lg:w-[84%]",
|
|
29
|
+
className,
|
|
30
|
+
)}
|
|
31
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
32
|
+
viewBox="0 0 3787 2842"
|
|
33
|
+
fill="none"
|
|
34
|
+
>
|
|
35
|
+
<g filter="url(#spotlight-filter)">
|
|
36
|
+
<ellipse
|
|
37
|
+
cx="1924.71"
|
|
38
|
+
cy="273.501"
|
|
39
|
+
rx="1924.71"
|
|
40
|
+
ry="273.501"
|
|
41
|
+
transform="matrix(-0.822377 -0.568943 -0.568943 0.822377 3631.88 2291.09)"
|
|
42
|
+
{fill}
|
|
43
|
+
fill-opacity="0.21"
|
|
44
|
+
></ellipse>
|
|
45
|
+
</g>
|
|
46
|
+
<defs>
|
|
47
|
+
<filter
|
|
48
|
+
id="spotlight-filter"
|
|
49
|
+
x="0.860352"
|
|
50
|
+
y="0.838989"
|
|
51
|
+
width="3785.16"
|
|
52
|
+
height="2840.26"
|
|
53
|
+
filterUnits="userSpaceOnUse"
|
|
54
|
+
color-interpolation-filters="sRGB"
|
|
55
|
+
>
|
|
56
|
+
<feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood>
|
|
57
|
+
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"></feBlend>
|
|
58
|
+
<feGaussianBlur stdDeviation="151" result="effect1_foregroundBlur"></feGaussianBlur>
|
|
59
|
+
</filter>
|
|
60
|
+
</defs>
|
|
61
|
+
</svg>
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
.theme-toggle:active {
|
|
2
|
+
transform: scale(0.97);
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
.theme-toggle--inverted {
|
|
6
|
+
border: 1px solid color-mix(in oklch, var(--color-background) 30%, transparent);
|
|
7
|
+
background: color-mix(in oklch, var(--color-background) 8%, transparent);
|
|
8
|
+
color: color-mix(in oklch, var(--color-background) 70%, transparent);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.theme-toggle--inverted:hover {
|
|
12
|
+
border-color: color-mix(in oklch, var(--color-background) 40%, transparent);
|
|
13
|
+
background: color-mix(in oklch, var(--color-background) 12%, transparent);
|
|
14
|
+
color: var(--color-background);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/* The slide variant: a pill track with a thumb that moves to the active side.
|
|
18
|
+
A caller sets brand colours with custom properties on the class:
|
|
19
|
+
--theme-toggle-thumb-light, --theme-toggle-thumb-dark, --theme-toggle-track,
|
|
20
|
+
--theme-toggle-track-hover, --theme-toggle-sun, --theme-toggle-moon,
|
|
21
|
+
--theme-toggle-thumb-icon and --theme-toggle-glow. */
|
|
22
|
+
.theme-toggle-slide {
|
|
23
|
+
--tt-thumb: 1.5rem;
|
|
24
|
+
--tt-pad: 0.25rem;
|
|
25
|
+
position: relative;
|
|
26
|
+
display: flex;
|
|
27
|
+
align-items: center;
|
|
28
|
+
box-sizing: content-box;
|
|
29
|
+
width: calc(var(--tt-thumb) * 2);
|
|
30
|
+
height: var(--tt-thumb);
|
|
31
|
+
padding: var(--tt-pad);
|
|
32
|
+
border: 0;
|
|
33
|
+
border-radius: 9999px;
|
|
34
|
+
cursor: pointer;
|
|
35
|
+
background: var(
|
|
36
|
+
--theme-toggle-track,
|
|
37
|
+
color-mix(in oklch, var(--color-foreground) 10%, transparent)
|
|
38
|
+
);
|
|
39
|
+
transition:
|
|
40
|
+
background-color 300ms,
|
|
41
|
+
box-shadow 300ms,
|
|
42
|
+
transform 300ms;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.theme-toggle-slide--lg {
|
|
46
|
+
--tt-thumb: 2rem;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.theme-toggle-slide:hover {
|
|
50
|
+
background: var(
|
|
51
|
+
--theme-toggle-track-hover,
|
|
52
|
+
color-mix(in oklch, var(--color-foreground) 20%, transparent)
|
|
53
|
+
);
|
|
54
|
+
box-shadow: 0 0 15px color-mix(in oklch, var(--theme-toggle-glow, transparent) 30%, transparent);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.theme-toggle-slide:active {
|
|
58
|
+
transform: scale(0.97);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.theme-toggle-slide:focus-visible {
|
|
62
|
+
outline: 2px solid var(--color-ring, var(--color-primary));
|
|
63
|
+
outline-offset: 2px;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.theme-toggle-slide__glow {
|
|
67
|
+
position: absolute;
|
|
68
|
+
inset: 0;
|
|
69
|
+
border-radius: inherit;
|
|
70
|
+
pointer-events: none;
|
|
71
|
+
opacity: 0;
|
|
72
|
+
background: radial-gradient(
|
|
73
|
+
circle at var(--tt-glow-x, 25%) 50%,
|
|
74
|
+
color-mix(in oklch, var(--theme-toggle-glow, transparent) 20%, transparent),
|
|
75
|
+
transparent 70%
|
|
76
|
+
);
|
|
77
|
+
transition: opacity 500ms;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.theme-toggle-slide:hover .theme-toggle-slide__glow {
|
|
81
|
+
opacity: 1;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.theme-toggle-slide[data-state="dark"] {
|
|
85
|
+
--tt-glow-x: 75%;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.theme-toggle-slide__icon {
|
|
89
|
+
position: absolute;
|
|
90
|
+
display: flex;
|
|
91
|
+
opacity: 0.3;
|
|
92
|
+
transform: scale(0.75);
|
|
93
|
+
transition:
|
|
94
|
+
opacity 300ms,
|
|
95
|
+
transform 300ms;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.theme-toggle-slide__icon--sun {
|
|
99
|
+
left: calc(var(--tt-pad) + (var(--tt-thumb) - 14px) / 2);
|
|
100
|
+
color: var(--theme-toggle-sun, var(--color-muted-foreground));
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.theme-toggle-slide__icon--moon {
|
|
104
|
+
right: calc(var(--tt-pad) + (var(--tt-thumb) - 14px) / 2);
|
|
105
|
+
color: var(--theme-toggle-moon, var(--color-muted-foreground));
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.theme-toggle-slide[data-state="light"] .theme-toggle-slide__icon--sun,
|
|
109
|
+
.theme-toggle-slide[data-state="dark"] .theme-toggle-slide__icon--moon {
|
|
110
|
+
opacity: 0.7;
|
|
111
|
+
transform: scale(1);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.theme-toggle-slide[data-state="light"] .theme-toggle-slide__icon--sun {
|
|
115
|
+
animation: theme-toggle-spin 8s linear infinite;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.theme-toggle-slide[data-state="dark"] .theme-toggle-slide__icon--moon {
|
|
119
|
+
animation: theme-toggle-wiggle 2s ease-in-out infinite;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.theme-toggle-slide__thumb {
|
|
123
|
+
--tt-thumb-color: var(--theme-toggle-thumb-light, var(--color-primary));
|
|
124
|
+
position: relative;
|
|
125
|
+
display: flex;
|
|
126
|
+
align-items: center;
|
|
127
|
+
justify-content: center;
|
|
128
|
+
width: var(--tt-thumb);
|
|
129
|
+
height: var(--tt-thumb);
|
|
130
|
+
border-radius: 9999px;
|
|
131
|
+
background: var(--tt-thumb-color);
|
|
132
|
+
color: var(--theme-toggle-thumb-icon, var(--color-primary-foreground));
|
|
133
|
+
box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
|
|
134
|
+
transition:
|
|
135
|
+
transform 500ms cubic-bezier(0.165, 0.84, 0.44, 1),
|
|
136
|
+
background-color 500ms;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.theme-toggle-slide[data-state="dark"] .theme-toggle-slide__thumb {
|
|
140
|
+
--tt-thumb-color: var(--theme-toggle-thumb-dark, var(--color-primary));
|
|
141
|
+
transform: translateX(var(--tt-thumb));
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.theme-toggle-slide__ring {
|
|
145
|
+
position: absolute;
|
|
146
|
+
inset: 0;
|
|
147
|
+
border-radius: inherit;
|
|
148
|
+
background: color-mix(in oklch, var(--tt-thumb-color) 50%, transparent);
|
|
149
|
+
animation: theme-toggle-pulse 2s ease-in-out infinite;
|
|
150
|
+
pointer-events: none;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.theme-toggle-slide__mark {
|
|
154
|
+
position: absolute;
|
|
155
|
+
transition:
|
|
156
|
+
opacity 300ms,
|
|
157
|
+
transform 300ms;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.theme-toggle-slide__mark--sun {
|
|
161
|
+
opacity: 1;
|
|
162
|
+
transform: scale(1) rotate(0);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.theme-toggle-slide__mark--moon {
|
|
166
|
+
opacity: 0;
|
|
167
|
+
transform: scale(0) rotate(-90deg);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
.theme-toggle-slide[data-state="dark"] .theme-toggle-slide__mark--sun {
|
|
171
|
+
opacity: 0;
|
|
172
|
+
transform: scale(0) rotate(90deg);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
.theme-toggle-slide[data-state="dark"] .theme-toggle-slide__mark--moon {
|
|
176
|
+
opacity: 1;
|
|
177
|
+
transform: scale(1) rotate(0);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
@keyframes theme-toggle-spin {
|
|
181
|
+
to {
|
|
182
|
+
transform: rotate(360deg);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
@keyframes theme-toggle-wiggle {
|
|
187
|
+
0%,
|
|
188
|
+
100% {
|
|
189
|
+
transform: rotate(-5deg);
|
|
190
|
+
}
|
|
191
|
+
50% {
|
|
192
|
+
transform: rotate(5deg);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
@keyframes theme-toggle-pulse {
|
|
197
|
+
0%,
|
|
198
|
+
100% {
|
|
199
|
+
transform: scale(1);
|
|
200
|
+
opacity: 0;
|
|
201
|
+
}
|
|
202
|
+
50% {
|
|
203
|
+
transform: scale(1.5);
|
|
204
|
+
opacity: 0.4;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
@media (prefers-reduced-motion: reduce) {
|
|
209
|
+
.theme-toggle-slide,
|
|
210
|
+
.theme-toggle-slide * {
|
|
211
|
+
animation: none !important;
|
|
212
|
+
transition: none !important;
|
|
213
|
+
}
|
|
214
|
+
}
|