@mova-ui/react 0.4.1 → 0.4.4
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/README.md +1 -1
- package/dist/index.js +477 -829
- package/dist/styles.css +116 -1
- package/dist/ui/ai/ai-context-meter.d.ts +2 -1
- package/dist/ui/ai/ai-sources.d.ts +2 -1
- package/dist/ui/ai/ai-task-list.d.ts +2 -1
- package/dist/ui/ai/ai-tool-call.d.ts +2 -1
- package/package.json +1 -1
- package/registry/1.json +1 -1
- package/registry/10.json +1 -1
- package/registry/11.json +1 -1
- package/registry/12.json +1 -1
- package/registry/13.json +1 -1
- package/registry/14.json +1 -1
- package/registry/15.json +1 -1
- package/registry/16.json +1 -1
- package/registry/17.json +1 -1
- package/registry/18.json +1 -1
- package/registry/19.json +1 -1
- package/registry/2.json +1 -1
- package/registry/20.json +1 -1
- package/registry/21.json +1 -1
- package/registry/22.json +1 -1
- package/registry/23.json +1 -1
- package/registry/24.json +1 -1
- package/registry/25.json +1 -1
- package/registry/26.json +1 -1
- package/registry/27.json +1 -1
- package/registry/28.json +1 -1
- package/registry/29.json +1 -1
- package/registry/3.json +1 -1
- package/registry/30.json +1 -1
- package/registry/31.json +1 -1
- package/registry/32.json +1 -1
- package/registry/33.json +1 -1
- package/registry/34.json +1 -1
- package/registry/35.json +1 -1
- package/registry/36.json +1 -1
- package/registry/37.json +1 -1
- package/registry/4.json +1 -1
- package/registry/5.json +1 -1
- package/registry/6.json +1 -1
- package/registry/7.json +1 -1
- package/registry/8.json +1 -1
- package/registry/9.json +1 -1
- package/registry/ab-segmented-tabs.json +1 -1
- package/registry/accordion-blind.json +1 -1
- package/registry/accordion-loader.json +1 -1
- package/registry/ai-approval-card.json +2 -2
- package/registry/ai-code-block.json +2 -2
- package/registry/ai-context-meter.json +2 -2
- package/registry/ai-fine-tune-card.json +2 -2
- package/registry/ai-prompt-bar.json +2 -2
- package/registry/ai-sidebar-nav.json +2 -2
- package/registry/ai-sources.json +2 -2
- package/registry/ai-suggestions.json +1 -1
- package/registry/ai-task-list.json +2 -2
- package/registry/ai-tool-call.json +2 -2
- package/registry/analyzing-image.json +1 -1
- package/registry/animated-sidebar.json +1 -1
- package/registry/animated-tags.json +1 -1
- package/registry/app-icon-load.json +1 -1
- package/registry/apple-breathe.json +1 -1
- package/registry/apple-equalizer.json +1 -1
- package/registry/apple-icon-morph.json +1 -1
- package/registry/apple-pulse-dots.json +1 -1
- package/registry/apple-scale-pulse.json +1 -1
- package/registry/apple-sound-wave.json +1 -1
- package/registry/apple-text-reveal.json +1 -1
- package/registry/apple-unlock.json +1 -1
- package/registry/arc-tracer.json +1 -1
- package/registry/bar-cascade.json +1 -1
- package/registry/bar-sweep.json +1 -1
- package/registry/blur-text.json +1 -1
- package/registry/blur-up-char.json +1 -1
- package/registry/blur-up-word.json +1 -1
- package/registry/bobbing-dots.json +1 -1
- package/registry/bookmark-corner-peel.json +1 -1
- package/registry/bookmark-save-pill.json +1 -1
- package/registry/bookmark-toggle.json +1 -1
- package/registry/border-trail-loading.json +1 -1
- package/registry/bounce-dots.json +1 -1
- package/registry/bounce-in-char.json +1 -1
- package/registry/bouncing-bars.json +1 -1
- package/registry/bouncing-dots.json +1 -1
- package/registry/bouncing-lines.json +1 -1
- package/registry/bouncing-square.json +1 -1
- package/registry/breathe-ring.json +1 -1
- package/registry/breathing-glow.json +1 -1
- package/registry/breathing-square.json +1 -1
- package/registry/btn-1.json +1 -1
- package/registry/btn-10.json +1 -1
- package/registry/btn-11.json +1 -1
- package/registry/btn-12.json +1 -1
- package/registry/btn-13.json +1 -1
- package/registry/btn-14.json +1 -1
- package/registry/btn-15.json +1 -1
- package/registry/btn-16.json +1 -1
- package/registry/btn-17.json +1 -1
- package/registry/btn-18.json +1 -1
- package/registry/btn-19.json +1 -1
- package/registry/btn-2.json +1 -1
- package/registry/btn-20.json +1 -1
- package/registry/btn-21.json +1 -1
- package/registry/btn-22.json +1 -1
- package/registry/btn-23.json +1 -1
- package/registry/btn-24.json +1 -1
- package/registry/btn-25.json +1 -1
- package/registry/btn-26.json +1 -1
- package/registry/btn-27.json +1 -1
- package/registry/btn-28.json +1 -1
- package/registry/btn-29.json +1 -1
- package/registry/btn-3.json +1 -1
- package/registry/btn-30.json +1 -1
- package/registry/btn-31.json +1 -1
- package/registry/btn-32.json +1 -1
- package/registry/btn-33.json +1 -1
- package/registry/btn-34.json +1 -1
- package/registry/btn-35.json +1 -1
- package/registry/btn-36.json +1 -1
- package/registry/btn-37.json +1 -1
- package/registry/btn-4.json +1 -1
- package/registry/btn-5.json +1 -1
- package/registry/btn-6.json +1 -1
- package/registry/btn-7.json +1 -1
- package/registry/btn-8.json +1 -1
- package/registry/btn-9.json +1 -1
- package/registry/button-slide-arrow.json +1 -1
- package/registry/cacheable-bandwidth-cost.json +1 -1
- package/registry/card-arc-5.json +1 -1
- package/registry/card-arc-7.json +1 -1
- package/registry/card-carousel-mono.json +1 -1
- package/registry/card-carousel.json +1 -1
- package/registry/card-cascade-stagger.json +1 -1
- package/registry/card-corner-fan.json +1 -1
- package/registry/card-cover-flow-mono.json +1 -1
- package/registry/card-cover-flow.json +1 -1
- package/registry/card-deck-cascade.json +1 -1
- package/registry/card-glance-preview.json +1 -1
- package/registry/card-hover.json +1 -1
- package/registry/card-linear-spread.json +1 -1
- package/registry/card-long-arc-5.json +1 -1
- package/registry/card-scatter-spread.json +1 -1
- package/registry/card-stack-peel.json +1 -1
- package/registry/card-stamp-arc.json +1 -1
- package/registry/card-time-machine-mono.json +1 -1
- package/registry/card-time-machine.json +1 -1
- package/registry/card-wheel-fan.json +1 -1
- package/registry/category-select.json +1 -1
- package/registry/character-stagger.json +1 -1
- package/registry/checkbox-draw.json +1 -1
- package/registry/checkmark-draw.json +1 -1
- package/registry/circle-toggle.json +1 -1
- package/registry/circuit-trace-draw.json +1 -1
- package/registry/circular-bars.json +1 -1
- package/registry/circular-create-button.json +1 -1
- package/registry/classic-spinner.json +1 -1
- package/registry/classic-toggle.json +1 -1
- package/registry/clock-spinner.json +1 -1
- package/registry/comet-spinner.json +1 -1
- package/registry/compass-needle-deflect.json +1 -1
- package/registry/concentric-pulse.json +1 -1
- package/registry/concentric-ring.json +1 -1
- package/registry/concentric-squares.json +1 -1
- package/registry/context-menu.json +1 -1
- package/registry/conveyor-loop.json +1 -1
- package/registry/credit-score-barcode-meter.json +1 -1
- package/registry/cross-spinner.json +1 -1
- package/registry/cube-flip-spring.json +1 -1
- package/registry/cursor-trail.json +1 -1
- package/registry/dash-ring.json +1 -1
- package/registry/dashed-spiral.json +1 -1
- package/registry/date-position-selector.json +1 -1
- package/registry/dia-text-reveal.json +1 -1
- package/registry/diamond-grid.json +1 -1
- package/registry/diamond-rotate-spring.json +1 -1
- package/registry/dislike-toggle.json +1 -1
- package/registry/dither-book.json +1 -1
- package/registry/domino-cascade.json +1 -1
- package/registry/dot-spinner.json +1 -1
- package/registry/dots-ring.json +1 -1
- package/registry/double-bounce-toggle.json +1 -1
- package/registry/double-ring.json +1 -1
- package/registry/download-icons.json +1 -1
- package/registry/drop-dot.json +1 -1
- package/registry/drop-in-char.json +1 -1
- package/registry/droplet-squish.json +1 -1
- package/registry/dual-arc.json +1 -1
- package/registry/dual-magnet-dipole.json +1 -1
- package/registry/dynamic-island.json +1 -1
- package/registry/elastic-bars.json +1 -1
- package/registry/elastic-square.json +1 -1
- package/registry/elastic-tag-snap.json +1 -1
- package/registry/error-shake.json +1 -1
- package/registry/expanding-cross.json +1 -1
- package/registry/expanding-icon-tabs.json +1 -1
- package/registry/face-id-scan.json +1 -1
- package/registry/fade-arc.json +1 -1
- package/registry/fade-dots.json +1 -1
- package/registry/fade-down.json +1 -1
- package/registry/fade-in-char.json +1 -1
- package/registry/fade-in-text.json +1 -1
- package/registry/fade-in-word.json +1 -1
- package/registry/fade-in.json +1 -1
- package/registry/fade-up.json +1 -1
- package/registry/file-upload-dropzone.json +1 -1
- package/registry/filter-tag-pill.json +1 -1
- package/registry/flip-square.json +1 -1
- package/registry/flip-x-char.json +1 -1
- package/registry/flip-y-char.json +1 -1
- package/registry/float-char.json +1 -1
- package/registry/float-word.json +1 -1
- package/registry/floating-diamonds.json +1 -1
- package/registry/floating-label-input.json +1 -1
- package/registry/fluid-bars.json +1 -1
- package/registry/fluid-diamond.json +1 -1
- package/registry/fluid-dot-orbit.json +1 -1
- package/registry/fluid-skeleton.json +1 -1
- package/registry/focus-blur.json +1 -1
- package/registry/form-submit-button.json +1 -1
- package/registry/french-doors-3d.json +1 -1
- package/registry/gear-tooth-step.json +1 -1
- package/registry/gears.json +1 -1
- package/registry/gelatin-wobble.json +1 -1
- package/registry/geometric-iris-shutter.json +1 -1
- package/registry/glassmorphic-card.json +1 -1
- package/registry/glow-button.json +1 -1
- package/registry/glow-text.json +1 -1
- package/registry/gooey-popover.json +1 -1
- package/registry/gradient-arc.json +1 -1
- package/registry/gradient-shimmer.json +1 -1
- package/registry/grid-dots.json +1 -1
- package/registry/haptic-ring.json +1 -1
- package/registry/heartbeat.json +1 -1
- package/registry/hex-lattice-draw.json +1 -1
- package/registry/hexagon-spinner.json +1 -1
- package/registry/hourglass.json +1 -1
- package/registry/hover-lift-char.json +1 -1
- package/registry/hover-lift-word.json +1 -1
- package/registry/hover-link-card.json +1 -1
- package/registry/hover-scale-char.json +1 -1
- package/registry/hover-scale-word.json +1 -1
- package/registry/inertia-skid-stop.json +1 -1
- package/registry/infinity-path.json +1 -1
- package/registry/input-focus-glow.json +1 -1
- package/registry/inset-action-button.json +1 -1
- package/registry/inset-button.json +1 -1
- package/registry/intersecting-rings.json +1 -1
- package/registry/ios-spinner.json +1 -1
- package/registry/kinetic-metronome-tick.json +1 -1
- package/registry/kinetic-tension-capsule.json +1 -1
- package/registry/light-dark-morph.json +1 -1
- package/registry/like-toggle.json +1 -1
- package/registry/line-spinner.json +1 -1
- package/registry/liquid-dots.json +1 -1
- package/registry/mac-terminal.json +1 -1
- package/registry/magnetic-button.json +1 -1
- package/registry/magnetic-disks.json +1 -1
- package/registry/magnetic-dots.json +1 -1
- package/registry/magnetic-slide-btn.json +1 -1
- package/registry/manifest.json +656 -650
- package/registry/matrix-grid-loader.json +1 -1
- package/registry/minimal-triangle.json +1 -1
- package/registry/modular-tile-snap.json +1 -1
- package/registry/mono-activity-blue.json +1 -1
- package/registry/mono-activity-green.json +1 -1
- package/registry/mono-activity-purple.json +1 -1
- package/registry/mono-heatmap.json +1 -1
- package/registry/mono-rounded-area.json +1 -1
- package/registry/mono-rounded-bar.json +1 -1
- package/registry/mono-rounded-bubble.json +1 -1
- package/registry/mono-rounded-bullet.json +1 -1
- package/registry/mono-rounded-candlestick.json +1 -1
- package/registry/mono-rounded-composed.json +1 -1
- package/registry/mono-rounded-donut.json +1 -1
- package/registry/mono-rounded-funnel.json +1 -1
- package/registry/mono-rounded-gauge-arc.json +1 -1
- package/registry/mono-rounded-heatmap.json +1 -1
- package/registry/mono-rounded-kpi.json +1 -1
- package/registry/mono-rounded-line.json +1 -1
- package/registry/mono-rounded-meter.json +1 -1
- package/registry/mono-rounded-polar.json +1 -1
- package/registry/mono-rounded-pyramid.json +1 -1
- package/registry/mono-rounded-radar.json +1 -1
- package/registry/mono-rounded-radial-gauge.json +1 -1
- package/registry/mono-rounded-radial-group.json +1 -1
- package/registry/mono-rounded-range.json +1 -1
- package/registry/mono-rounded-sankey.json +1 -1
- package/registry/mono-rounded-scatter.json +1 -1
- package/registry/mono-rounded-sparkline.json +1 -1
- package/registry/mono-rounded-stacked-bar.json +1 -1
- package/registry/mono-rounded-step.json +1 -1
- package/registry/mono-rounded-stream.json +1 -1
- package/registry/mono-rounded-treemap.json +1 -1
- package/registry/mono-rounded-waterfall.json +1 -1
- package/registry/mono-stock.json +1 -1
- package/registry/morph-action-pill.json +1 -1
- package/registry/morph-dot-ring.json +1 -1
- package/registry/morph-loader.json +1 -1
- package/registry/morph-toggle.json +1 -1
- package/registry/morphing-bars.json +1 -1
- package/registry/morphing-infinity.json +1 -1
- package/registry/morphing-ring.json +1 -1
- package/registry/morphing-shape.json +1 -1
- package/registry/mouse-follow.json +1 -1
- package/registry/multi-select-chips.json +1 -1
- package/registry/multi-tab-bar.json +1 -1
- package/registry/neon-sign-draw.json +1 -1
- package/registry/nested-orbital-gimbal.json +1 -1
- package/registry/network-telemetry-matrix.json +1 -1
- package/registry/newtons-cradle.json +1 -1
- package/registry/noise-decibel-level.json +1 -1
- package/registry/obsidian-liquid-wave.json +1 -1
- package/registry/offset-rings.json +1 -1
- package/registry/orbiting-circles.json +1 -1
- package/registry/orbiting-dot.json +1 -1
- package/registry/origami-envelope-unfold.json +1 -1
- package/registry/origami-shape.json +1 -1
- package/registry/otp-input.json +1 -1
- package/registry/overview-bar-scrubber-card.json +1 -1
- package/registry/page-transition.json +1 -1
- package/registry/page-turn-curl.json +1 -1
- package/registry/password-toggle.json +1 -1
- package/registry/pendulum-bubble-level.json +1 -1
- package/registry/pendulum.json +1 -1
- package/registry/perspective-flip-stage.json +1 -1
- package/registry/perspective-flip.json +1 -1
- package/registry/perspective-layout-switcher.json +1 -1
- package/registry/physics-dock.json +1 -1
- package/registry/pill-tabs.json +1 -1
- package/registry/plus-minus-toggle.json +1 -1
- package/registry/presets.json +1 -1
- package/registry/prism-block-stack.json +1 -1
- package/registry/progress-indicator-piano.json +1 -1
- package/registry/progress-indicator.json +1 -1
- package/registry/progress-stepper.json +1 -1
- package/registry/pulsating-dots.json +1 -1
- package/registry/pulse-char.json +1 -1
- package/registry/pulse-dot.json +1 -1
- package/registry/pulse-dots.json +1 -1
- package/registry/pulse-square.json +1 -1
- package/registry/pulse-word.json +1 -1
- package/registry/pulse.json +1 -1
- package/registry/pumping-heart.json +1 -1
- package/registry/pyramid-block-build.json +1 -1
- package/registry/radar-sweep.json +1 -1
- package/registry/radial-iris-mask.json +1 -1
- package/registry/radial-spinner.json +1 -1
- package/registry/radio-scale.json +1 -1
- package/registry/range-slider.json +1 -1
- package/registry/receipt-tape-print.json +1 -1
- package/registry/rectangle-toggle.json +1 -1
- package/registry/repost-toggle.json +1 -1
- package/registry/reveal-text.json +1 -1
- package/registry/ribbon-banner-slide.json +1 -1
- package/registry/ring-sweep.json +1 -1
- package/registry/ripple-effect.json +1 -1
- package/registry/rise-up-word.json +1 -1
- package/registry/roller-blind-drop.json +1 -1
- package/registry/rolling-tumble.json +1 -1
- package/registry/rotate-in-char.json +1 -1
- package/registry/rotating-cross.json +1 -1
- package/registry/rotating-louvers.json +1 -1
- package/registry/rotating-triangle.json +1 -1
- package/registry/rudder-issue-board.json +2 -2
- package/registry/sales-analytics-dual-bars.json +1 -1
- package/registry/sales-overview-radial-dashboard.json +1 -1
- package/registry/sales-target-segmented-arc.json +1 -1
- package/registry/scale-in-char.json +1 -1
- package/registry/scale-in-text.json +1 -1
- package/registry/scale-in-word.json +1 -1
- package/registry/scale-in.json +1 -1
- package/registry/scramble-text.json +1 -1
- package/registry/scroll-canvas-unroll.json +1 -1
- package/registry/scroll-reveal.json +1 -1
- package/registry/search-expand.json +1 -1
- package/registry/segmented-arc-meter.json +1 -1
- package/registry/segmented-link-stretch.json +1 -1
- package/registry/segmented-step-bar.json +1 -1
- package/registry/segmented-stepper-dots.json +1 -1
- package/registry/select-dropdown.json +1 -1
- package/registry/server-performance-step-bars.json +1 -1
- package/registry/shape-shift-grid.json +1 -1
- package/registry/shimmer-line.json +1 -1
- package/registry/shimmer-text.json +1 -1
- package/registry/shutter-slide.json +1 -1
- package/registry/shutter-step-slices.json +1 -1
- package/registry/siri-wave.json +1 -1
- package/registry/skeleton-loader.json +1 -1
- package/registry/skeleton.json +1 -1
- package/registry/skew-x-char.json +1 -1
- package/registry/slide-down-char.json +1 -1
- package/registry/slide-down-word.json +1 -1
- package/registry/slide-left-char.json +1 -1
- package/registry/slide-left.json +1 -1
- package/registry/slide-right-char.json +1 -1
- package/registry/slide-right.json +1 -1
- package/registry/slide-up-char.json +1 -1
- package/registry/slide-up-text.json +1 -1
- package/registry/slide-up-word.json +1 -1
- package/registry/sliding-bars.json +1 -1
- package/registry/slinky-coil.json +1 -1
- package/registry/smart-card-dispenser.json +1 -1
- package/registry/smooth-dot-shift.json +1 -1
- package/registry/smooth-ring.json +1 -1
- package/registry/smooth-rounded-square.json +1 -1
- package/registry/solid-switch.json +1 -1
- package/registry/spatial-door-portal.json +1 -1
- package/registry/spinning-squares.json +1 -1
- package/registry/spiral-spinner.json +1 -1
- package/registry/split-gate-reveal.json +1 -1
- package/registry/spotlight.json +1 -1
- package/registry/spring-bars.json +1 -1
- package/registry/spring-dot-matrix.json +1 -1
- package/registry/spring-hexagon.json +1 -1
- package/registry/spring-ring-expand.json +1 -1
- package/registry/spring-text-pop.json +1 -1
- package/registry/spring-text.json +1 -1
- package/registry/square-accordion.json +1 -1
- package/registry/square-grid.json +1 -1
- package/registry/square-snake.json +1 -1
- package/registry/square-spinner.json +1 -1
- package/registry/squash-sphere.json +1 -1
- package/registry/stacked-bar-pulse.json +1 -1
- package/registry/stagger-text.json +1 -1
- package/registry/staggered-glass-curtain.json +1 -1
- package/registry/sticky-note-peel.json +1 -1
- package/registry/sticky-reveal.json +1 -1
- package/registry/stretch-x-char.json +1 -1
- package/registry/stretch-y-char.json +1 -1
- package/registry/stroke-waveform.json +1 -1
- package/registry/submenu-flyout.json +1 -1
- package/registry/success-check.json +1 -1
- package/registry/sudden-brake.json +1 -1
- package/registry/swapping-dots.json +1 -1
- package/registry/swing-word.json +1 -1
- package/registry/swirling-spinner.json +1 -1
- package/registry/symmetric-wave.json +1 -1
- package/registry/terminal-loader.json +1 -1
- package/registry/text-blink.json +1 -1
- package/registry/text-dots.json +1 -1
- package/registry/text-morph.json +1 -1
- package/registry/text-reveal.json +1 -1
- package/registry/text-shimmer-wave.json +1 -1
- package/registry/text-shimmer.json +1 -1
- package/registry/textarea-auto-grow.json +1 -1
- package/registry/theme-toggle.json +1 -1
- package/registry/tilt-card.json +1 -1
- package/registry/timer-preparation-segmented.json +1 -1
- package/registry/tracking-in-text.json +1 -1
- package/registry/tracking-out-text.json +1 -1
- package/registry/trailing-dots.json +1 -1
- package/registry/triple-dot-spinner.json +1 -1
- package/registry/twin-orbit.json +1 -1
- package/registry/typewriter-text.json +1 -1
- package/registry/typing-indicator.json +1 -1
- package/registry/typing.json +1 -1
- package/registry/use-mouse-position.json +1 -1
- package/registry/use-reduced-motion.json +1 -1
- package/registry/use-scroll-progress.json +1 -1
- package/registry/use-stagger.json +1 -1
- package/registry/use-web-haptics.json +1 -1
- package/registry/users-growth-pill-progress.json +1 -1
- package/registry/utils.json +1 -1
- package/registry/vertical-wheel-counter.json +1 -1
- package/registry/views-hourly-wave-chart.json +1 -1
- package/registry/wandering-cube.json +1 -1
- package/registry/wandering-eyes.json +1 -1
- package/registry/watch-spinner.json +1 -1
- package/registry/wave-dots.json +1 -1
- package/registry/wave-physics-loader.json +1 -1
- package/registry/wave-reveal.json +1 -1
- package/registry/waveform-loader.json +1 -1
- package/registry/word-reveal.json +1 -1
- package/registry/zig-zag-pulse.json +1 -1
- package/registry/zoom-in-text.json +1 -1
- package/registry/zoom-in.json +1 -1
- package/registry/zoom-out-text.json +1 -1
package/dist/index.js
CHANGED
|
@@ -410,18 +410,18 @@ function ApprovalCard({
|
|
|
410
410
|
};
|
|
411
411
|
if (questions.length === 0) return /* @__PURE__ */ jsx("div", { role: "status", className: "text-[13px]", children: "No questions to approve." });
|
|
412
412
|
if (!open) {
|
|
413
|
-
return /* @__PURE__ */ jsx("button", { ref: reopenRef, type: "button", onClick: () => setOpen(true), className: "rounded-[8px] bg-[var(--surface)] px-3 py-2 text-[12.5px] font-medium text-[var(--ink)] shadow-[var(--shadow-btn)] transition-colors duration-150 hover:bg-[var(--hover)]", children: "Open approval" });
|
|
413
|
+
return /* @__PURE__ */ jsx("button", { ref: reopenRef, type: "button", onClick: () => setOpen(true), className: "rounded-[8px] bg-[var(--mova-ai-surface,#fff)] px-3 py-2 text-[12.5px] font-medium text-[var(--mova-ai-ink,#202020)] shadow-[var(--mova-ai-shadow-btn,none)] transition-colors duration-150 hover:bg-[var(--mova-ai-hover,#f1f1f1)]", children: "Open approval" });
|
|
414
414
|
}
|
|
415
415
|
if (sent) {
|
|
416
416
|
return /* @__PURE__ */ jsxs("div", { ref: sentStatusRef, tabIndex: -1, role: "status", className: "flex w-full max-w-80 flex-wrap items-center gap-3", style: { animation: "mova-ai-approval-card-pop-in 260ms cubic-bezier(0.23,1,0.32,1) both" }, children: [
|
|
417
|
-
/* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1.5 rounded-full bg-[var(--
|
|
418
|
-
/* @__PURE__ */ jsx("span", { className: "flex size-4.5 items-center justify-center rounded-full bg-[var(--
|
|
417
|
+
/* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1.5 rounded-full bg-[var(--mova-ai-success-tint,#e8f3ec)] py-1 pr-2.5 pl-1 text-[12.5px] font-medium text-[var(--mova-ai-success,#28734d)]", children: [
|
|
418
|
+
/* @__PURE__ */ jsx("span", { className: "flex size-4.5 items-center justify-center rounded-full bg-[var(--mova-ai-success,#28734d)] text-white", children: /* @__PURE__ */ jsx("svg", { width: "11", height: "11", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "3", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "M20 6L9 17l-5-5" }) }) }),
|
|
419
419
|
t.sentMessage
|
|
420
420
|
] }),
|
|
421
|
-
resettable && /* @__PURE__ */ jsx("button", { type: "button", onClick: reset, className: "text-[12px] font-medium text-[var(--ink-
|
|
421
|
+
resettable && /* @__PURE__ */ jsx("button", { type: "button", onClick: reset, className: "text-[12px] font-medium text-[var(--mova-ai-ink-muted,#858585)] transition-colors duration-150 hover:text-[var(--mova-ai-ink,#202020)]", children: "Start over" })
|
|
422
422
|
] });
|
|
423
423
|
}
|
|
424
|
-
return /* @__PURE__ */ jsx("div", { className: "w-full max-w-80", children: /* @__PURE__ */ jsxs("div", { className: "relative overflow-hidden rounded-[
|
|
424
|
+
return /* @__PURE__ */ jsx("div", { className: "w-full max-w-80", children: /* @__PURE__ */ jsxs("div", { className: "relative overflow-hidden rounded-lg border border-[var(--mova-ai-border,#dedede)] bg-[var(--mova-ai-surface,#fff)] text-[color:var(--mova-ai-ink,#202020)] shadow-[var(--mova-ai-shadow-card,none)]", style: { animation: "mova-ai-approval-card-fade-up 380ms cubic-bezier(0.23,1,0.32,1) both" }, children: [
|
|
425
425
|
/* @__PURE__ */ jsx(
|
|
426
426
|
"button",
|
|
427
427
|
{
|
|
@@ -431,7 +431,7 @@ function ApprovalCard({
|
|
|
431
431
|
if (advanceTimer.current) clearTimeout(advanceTimer.current);
|
|
432
432
|
setOpen(false);
|
|
433
433
|
},
|
|
434
|
-
className: "primitive-icon-button absolute right-2.5 top-2.5 z-10 text-[var(--ink-
|
|
434
|
+
className: "primitive-icon-button absolute right-2.5 top-2.5 z-10 text-[var(--mova-ai-ink-muted,#858585)] transition-colors duration-100 hover:bg-[var(--mova-ai-hover,#f1f1f1)] hover:text-[var(--mova-ai-ink,#202020)]",
|
|
435
435
|
children: /* @__PURE__ */ jsx(Ico, { size: 14, sw: 2.2, path: /* @__PURE__ */ jsx("path", { d: "M18 6L6 18M6 6l12 12" }) })
|
|
436
436
|
}
|
|
437
437
|
),
|
|
@@ -471,8 +471,8 @@ function ApprovalCard({
|
|
|
471
471
|
"aria-hidden": active ? void 0 : true,
|
|
472
472
|
style: questionStyle,
|
|
473
473
|
children: [
|
|
474
|
-
/* @__PURE__ */ jsx("div", { className: "pr-7 text-[14px] font-medium text-[var(--ink)]", children: question.q }),
|
|
475
|
-
/* @__PURE__ */ jsxs(GlideMenu, { className: "mt-2.5 flex flex-col gap-1", highlightClassName: "inset-x-0 rounded-[8px] bg-[var(--hover)]", children: [
|
|
474
|
+
/* @__PURE__ */ jsx("div", { className: "pr-7 text-[14px] font-medium text-[var(--mova-ai-ink,#202020)]", children: question.q }),
|
|
475
|
+
/* @__PURE__ */ jsxs(GlideMenu, { className: "mt-2.5 flex flex-col gap-1", highlightClassName: "inset-x-0 rounded-[8px] bg-[var(--mova-ai-hover,#f1f1f1)]", children: [
|
|
476
476
|
question.options.map((option, i) => {
|
|
477
477
|
const on = picked.includes(i);
|
|
478
478
|
return /* @__PURE__ */ jsxs(
|
|
@@ -492,11 +492,11 @@ function ApprovalCard({
|
|
|
492
492
|
{
|
|
493
493
|
className: `flex size-4 shrink-0 items-center justify-center transition-colors duration-200
|
|
494
494
|
${question.type === "radio" ? "rounded-full" : "rounded-[5px]"}
|
|
495
|
-
${on ? "bg-[var(--ink)] text-[var(--canvas)]" : "shadow-[inset_0_0_0_1.5px_var(--
|
|
496
|
-
children: question.type === "radio" ? /* @__PURE__ */ jsx("span", { className: "size-1.5 rounded-full bg-[var(--canvas)] transition-transform duration-200", style: { transform: on ? "scale(1)" : "scale(0)" } }) : /* @__PURE__ */ jsx("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "3", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "M20 6L9 17l-5-5" }) })
|
|
495
|
+
${on ? "bg-[var(--mova-ai-ink,#202020)] text-[var(--mova-ai-canvas,#f4f4f4)]" : "shadow-[inset_0_0_0_1.5px_var(--mova-ai-border-strong,#c8c8c8)] text-transparent"}`,
|
|
496
|
+
children: question.type === "radio" ? /* @__PURE__ */ jsx("span", { className: "size-1.5 rounded-full bg-[var(--mova-ai-canvas,#f4f4f4)] transition-transform duration-200", style: { transform: on ? "scale(1)" : "scale(0)" } }) : /* @__PURE__ */ jsx("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "3", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "M20 6L9 17l-5-5" }) })
|
|
497
497
|
}
|
|
498
498
|
),
|
|
499
|
-
/* @__PURE__ */ jsx("span", { className: `text-[13px] leading-snug transition-colors duration-200 ${on ? "text-[var(--ink)]" : "text-[var(--ink-
|
|
499
|
+
/* @__PURE__ */ jsx("span", { className: `text-[13px] leading-snug transition-colors duration-200 ${on ? "text-[var(--mova-ai-ink,#202020)]" : "text-[var(--mova-ai-ink-secondary,#666)]"}`, children: option })
|
|
500
500
|
]
|
|
501
501
|
},
|
|
502
502
|
option
|
|
@@ -521,7 +521,7 @@ function ApprovalCard({
|
|
|
521
521
|
},
|
|
522
522
|
placeholder: t.customPlaceholder,
|
|
523
523
|
"aria-label": "Custom answer",
|
|
524
|
-
className: "min-w-0 flex-1 bg-transparent pl-1.5 text-[13px] text-[var(--ink)] outline-none placeholder:text-[var(--ink-
|
|
524
|
+
className: "min-w-0 flex-1 bg-transparent pl-1.5 text-[13px] text-[var(--mova-ai-ink,#202020)] outline-none placeholder:text-[var(--mova-ai-ink-muted,#858585)]"
|
|
525
525
|
}
|
|
526
526
|
) })
|
|
527
527
|
] })
|
|
@@ -535,7 +535,7 @@ function ApprovalCard({
|
|
|
535
535
|
}
|
|
536
536
|
) }),
|
|
537
537
|
/* @__PURE__ */ jsxs("div", { className: "primitive-card-footer flex items-center justify-between gap-3", children: [
|
|
538
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 text-[var(--ink-
|
|
538
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 text-[var(--mova-ai-ink-muted,#858585)]", children: [
|
|
539
539
|
/* @__PURE__ */ jsx(
|
|
540
540
|
"button",
|
|
541
541
|
{
|
|
@@ -543,11 +543,11 @@ function ApprovalCard({
|
|
|
543
543
|
"aria-label": "Previous question",
|
|
544
544
|
disabled: qi <= 0,
|
|
545
545
|
onClick: () => goTo(qi - 1),
|
|
546
|
-
className: "flex size-[18px] items-center justify-center rounded-[5px] transition-colors duration-100 enabled:hover:text-[var(--ink)] disabled:opacity-30",
|
|
546
|
+
className: "flex size-[18px] items-center justify-center rounded-[5px] transition-colors duration-100 enabled:hover:text-[var(--mova-ai-ink,#202020)] disabled:opacity-30",
|
|
547
547
|
children: /* @__PURE__ */ jsx(Ico, { size: 14, path: /* @__PURE__ */ jsx("path", { d: "M18 15l-6-6-6 6" }) })
|
|
548
548
|
}
|
|
549
549
|
),
|
|
550
|
-
/* @__PURE__ */ jsx("span", { className: "inline-flex items-center text-[12px] font-medium tabular-nums text-[var(--ink-
|
|
550
|
+
/* @__PURE__ */ jsx("span", { className: "inline-flex items-center text-[12px] font-medium tabular-nums text-[var(--mova-ai-ink-muted,#858585)]", style: { letterSpacing: "-0.1px", lineHeight: 1 }, children: /* @__PURE__ */ jsx(RollingDigits, { value: `${qi + 1} / ${questions.length}` }) }),
|
|
551
551
|
/* @__PURE__ */ jsx(
|
|
552
552
|
"button",
|
|
553
553
|
{
|
|
@@ -555,7 +555,7 @@ function ApprovalCard({
|
|
|
555
555
|
"aria-label": "Next question",
|
|
556
556
|
disabled: last,
|
|
557
557
|
onClick: () => goTo(qi + 1),
|
|
558
|
-
className: "flex size-[18px] items-center justify-center rounded-[5px] transition-colors duration-100 enabled:hover:text-[var(--ink)] disabled:opacity-30",
|
|
558
|
+
className: "flex size-[18px] items-center justify-center rounded-[5px] transition-colors duration-100 enabled:hover:text-[var(--mova-ai-ink,#202020)] disabled:opacity-30",
|
|
559
559
|
children: /* @__PURE__ */ jsx(Ico, { size: 14, path: /* @__PURE__ */ jsx("path", { d: "M6 9l6 6 6-6" }) })
|
|
560
560
|
}
|
|
561
561
|
)
|
|
@@ -574,7 +574,7 @@ function ApprovalCard({
|
|
|
574
574
|
function GlideMenu({
|
|
575
575
|
children,
|
|
576
576
|
className = "",
|
|
577
|
-
highlightClassName = "inset-x-0 rounded-[8px] bg-[var(--hover)]",
|
|
577
|
+
highlightClassName = "inset-x-0 rounded-[8px] bg-[var(--mova-ai-hover,#f1f1f1)]",
|
|
578
578
|
rowSelector = "[data-menu-row]"
|
|
579
579
|
}) {
|
|
580
580
|
const ref = useRef(null);
|
|
@@ -621,116 +621,29 @@ function GlideMenu({
|
|
|
621
621
|
);
|
|
622
622
|
}
|
|
623
623
|
function Button({ variant = "secondary", size = "md", className = "", ...props }) {
|
|
624
|
-
const variants = { secondary: "bg-[var(--surface)] text-[var(--ink)] shadow-[var(--shadow-btn)] hover:bg-[var(--inset)]", ghost: "bg-[var(--hover-
|
|
625
|
-
return /* @__PURE__ */ jsx("button", { type: "button", className: `inline-flex items-center justify-center font-medium select-none transition-[transform,background-color,opacity] duration-150 ease-out active:scale-[0.96] disabled:opacity-50 disabled:pointer-events-none ${variants[variant]} ${size === "sm" ? "h-[27px] px-3 text-[13px] leading-none rounded-full gap-1.5" : "px-4 py-[9px] text-sm leading-none rounded-full gap-2"} ${className}`, ...props });
|
|
626
|
-
}
|
|
627
|
-
var
|
|
628
|
-
|
|
629
|
-
--canvas: oklch(0.961 0.002 247.84);
|
|
630
|
-
--surface: oklch(1 0 0);
|
|
631
|
-
--inset: oklch(0.979 0.002 247.839);
|
|
632
|
-
--hover: oklch(0.97 0.002 247.839);
|
|
633
|
-
--hover-2: oklch(0.933 0.003 247.86);
|
|
634
|
-
|
|
635
|
-
--ink: oklch(0.247 0.006 258.361);
|
|
636
|
-
--ink-2: oklch(0.506 0.01 264.477);
|
|
637
|
-
--ink-3: oklch(0.695 0.009 264.505);
|
|
638
|
-
|
|
639
|
-
--line: oklch(0.946 0.003 264.542);
|
|
640
|
-
--line-strong: oklch(0.912 0.005 258.326);
|
|
641
|
-
--line-soft: oklch(0.966 0.002 264.542);
|
|
642
|
-
--grid-line: color-mix(in srgb, var(--line) 78%, transparent);
|
|
643
|
-
--field: oklch(0.961 0.001 286.375);
|
|
644
|
-
--stripe: oklch(0.405 0 0 / 0.075);
|
|
645
|
-
--stripe-bg: oklch(0.97 0 0);
|
|
646
|
-
|
|
647
|
-
--accent: oklch(0.626 0.205 254.947);
|
|
648
|
-
--accent-ink: oklch(0.556 0.187 255.617);
|
|
649
|
-
--accent-tint: oklch(0.96 0.019 252.878);
|
|
650
|
-
|
|
651
|
-
--green: oklch(0.603 0.155 150.883);
|
|
652
|
-
--green-tint: oklch(0.958 0.017 159.118);
|
|
653
|
-
--orange: oklch(0.689 0.179 49.902);
|
|
654
|
-
--orange-tint: oklch(0.964 0.021 67.581);
|
|
655
|
-
--red: oklch(0.621 0.192 23.042);
|
|
656
|
-
--red-tint: oklch(0.956 0.017 17.462);
|
|
657
|
-
|
|
658
|
-
--tooltip-bg: oklch(0.272 0.008 264.435);
|
|
659
|
-
--tooltip-fg: oklch(0.976 0.002 247.839);
|
|
660
|
-
--tooltip-muted: oklch(0.731 0.008 260.731);
|
|
661
|
-
--tooltip-border: oklch(0.356 0.007 264.474);
|
|
662
|
-
|
|
663
|
-
--shadow-hairline: 0 0 0 1px var(--line);
|
|
664
|
-
--shadow-btn: 0 0 0 1px var(--line-strong), var(--shadow-xs);
|
|
665
|
-
--shadow-card: 0 0 0 1px var(--line), var(--shadow-sm);
|
|
666
|
-
--shadow-raised: 0 0 0 1px var(--line), var(--shadow-md);
|
|
667
|
-
--shadow-overlay: 0 0 0 1px var(--line), var(--shadow-lg);
|
|
668
|
-
--shadow-inset-field: inset 0 1px 2px oklch(0 0 0 / 0.12);--shadow-xs: 0 0 4px 0 rgba(0, 0, 0, 0.04);--shadow-sm: 0 18px 47px 0 rgba(0, 0, 0, 0.03), 0 7.5px 19px 0 rgba(0, 0, 0, 0.02),
|
|
669
|
-
0 4px 10.5px 0 rgba(0, 0, 0, 0.02), 0 2.3px 5.8px 0 rgba(0, 0, 0, 0.01),
|
|
670
|
-
0 1.2px 3.1px 0 rgba(0, 0, 0, 0.01), 0 0.5px 1.3px 0 rgba(0, 0, 0, 0.01);--shadow-md: 0 17.54px 23.39px 0 rgba(0, 0, 0, 0.04), 0 9.4px 12.5px 0 rgba(0, 0, 0, 0.03),
|
|
671
|
-
0 5.25px 7px 0 rgba(0, 0, 0, 0.02), 0 2.79px 3.72px -2px rgba(0, 0, 0, 0.01),
|
|
672
|
-
0 1.16px 1.5px 0 rgba(0, 0, 0, 0.01);--radius-control:8px;
|
|
673
|
-
width:100%;max-width:320px;min-width:0;font-family:Inter,ui-sans-serif,system-ui,sans-serif;font-size:14px;line-height:1.5;letter-spacing:-.01em;color:var(--ink);}
|
|
674
|
-
.mova-ai-approval-card[data-theme="dark"]{
|
|
675
|
-
--page: oklch(0.209 0.004 264.477);
|
|
676
|
-
--canvas: oklch(0.231 0.004 264.487);
|
|
677
|
-
--surface: oklch(0.26 0.006 271.191);
|
|
678
|
-
--inset: oklch(0.243 0.004 264.492);
|
|
679
|
-
--hover: oklch(0.289 0.006 271.22);
|
|
680
|
-
--hover-2: oklch(0.318 0.007 274.747);
|
|
681
|
-
|
|
682
|
-
--ink: oklch(0.964 0.002 247.839);
|
|
683
|
-
--ink-2: oklch(0.731 0.008 260.731);
|
|
684
|
-
--ink-3: oklch(0.541 0.01 264.484);
|
|
685
|
-
|
|
686
|
-
--line: oklch(0.308 0.006 258.354);
|
|
687
|
-
--line-strong: oklch(0.356 0.007 264.474);
|
|
688
|
-
--line-soft: oklch(0.278 0.006 258.354);
|
|
689
|
-
--field: oklch(0.293 0.006 271.223);
|
|
690
|
-
--stripe: oklch(1 0 0 / 0.055);
|
|
691
|
-
--stripe-bg: oklch(0.226 0.004 264.485);
|
|
692
|
-
|
|
693
|
-
--accent: oklch(0.68 0.173 253.301);
|
|
694
|
-
--accent-ink: oklch(0.788 0.113 248.33);
|
|
695
|
-
--accent-tint: oklch(0.68 0.173 253.301 / 0.16);
|
|
696
|
-
|
|
697
|
-
--green: oklch(0.705 0.154 153.814);
|
|
698
|
-
--green-tint: oklch(0.705 0.154 153.814 / 0.14);
|
|
699
|
-
--orange: oklch(0.746 0.156 55.642);
|
|
700
|
-
--orange-tint: oklch(0.746 0.156 55.642 / 0.14);
|
|
701
|
-
--red: oklch(0.666 0.18 21.433);
|
|
702
|
-
--red-tint: oklch(0.666 0.18 21.433 / 0.14);
|
|
703
|
-
|
|
704
|
-
--tooltip-bg: oklch(0.182 0.004 264.459);
|
|
705
|
-
--tooltip-fg: oklch(0.964 0.002 247.839);
|
|
706
|
-
--tooltip-muted: oklch(0.731 0.008 260.731);
|
|
707
|
-
--tooltip-border: oklch(0.308 0.006 258.354);
|
|
708
|
-
|
|
709
|
-
--shadow-hairline: 0 0 0 1px var(--line);
|
|
710
|
-
--shadow-btn: 0 0 0 1px oklch(1 0 0 / 0.1), 0 1px 2px oklch(0 0 0 / 0.3);
|
|
711
|
-
--shadow-card:
|
|
712
|
-
0 0 0 1px oklch(1 0 0 / 0.11), 0 1px 2px oklch(0 0 0 / 0.2),
|
|
713
|
-
0 2px 6px oklch(0 0 0 / 0.2);
|
|
714
|
-
--shadow-raised:
|
|
715
|
-
0 0 0 1px oklch(1 0 0 / 0.13), 0 2px 10px oklch(0 0 0 / 0.22);
|
|
716
|
-
--shadow-overlay:
|
|
717
|
-
0 0 0 1px oklch(1 0 0 / 0.15), 0 8px 28px oklch(0 0 0 / 0.34);
|
|
718
|
-
--shadow-inset-field: inset 0 1px 2px oklch(0 0 0 / 0.4);}
|
|
624
|
+
const variants = { secondary: "bg-[var(--mova-ai-surface,#fff)] text-[var(--mova-ai-ink,#202020)] shadow-[var(--mova-ai-shadow-btn,none)] hover:bg-[var(--mova-ai-inset,#f8f8f8)]", ghost: "bg-[var(--mova-ai-hover-strong,#e9e9e9)] text-[var(--mova-ai-ink,#202020)] hover:bg-[var(--mova-ai-border-strong,#c8c8c8)]", accent: "approval-accent shadow-[inset_0_1px_0_rgba(255,255,255,0.14)]" };
|
|
625
|
+
return /* @__PURE__ */ jsx("button", { type: "button", className: `inline-flex items-center justify-center font-medium select-none transition-[transform,background-color,color,opacity,filter] duration-150 ease-out active:scale-[0.96] active:brightness-110 disabled:opacity-50 disabled:pointer-events-none ${variants[variant]} ${size === "sm" ? "h-[27px] px-3 text-[13px] leading-none rounded-full gap-1.5" : "px-4 py-[9px] text-sm leading-none rounded-full gap-2"} ${className}`, ...props });
|
|
626
|
+
}
|
|
627
|
+
var AI_THEME_STYLES = '/* Shared public tokens for the standalone AI component family. */\n.mova-ai-theme {\n color-scheme: light;\n color: var(--mova-ai-ink, #202020);\n font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;\n font-size: 13px;\n line-height: 1.45;\n letter-spacing: -0.01em;\n\n --mova-ai-page: #f7f7f7;\n --mova-ai-canvas: #f4f4f4;\n --mova-ai-surface: #ffffff;\n --mova-ai-inset: #f8f8f8;\n --mova-ai-hover: #f1f1f1;\n --mova-ai-hover-strong: #e9e9e9;\n\n --mova-ai-ink: #202020;\n --mova-ai-ink-secondary: #666666;\n --mova-ai-ink-muted: #858585;\n\n --mova-ai-border: #dedede;\n --mova-ai-border-soft: #ededed;\n --mova-ai-border-strong: #c8c8c8;\n --mova-ai-field: #f6f6f6;\n --mova-ai-grid: color-mix(in srgb, var(--mova-ai-border) 78%, transparent);\n --mova-ai-stripe: rgb(32 35 38 / 7%);\n --mova-ai-stripe-bg: #242424;\n\n --mova-ai-accent: #454545;\n --mova-ai-accent-ink: #333333;\n --mova-ai-accent-foreground: #ffffff;\n --mova-ai-accent-tint: #eeeeee;\n --mova-ai-success: #28734d;\n --mova-ai-success-tint: #e8f3ec;\n --mova-ai-warning: #986517;\n --mova-ai-warning-tint: #f8f0df;\n --mova-ai-danger: #a33c3c;\n --mova-ai-danger-tint: #f7eaea;\n --mova-ai-info: #496b89;\n --mova-ai-info-tint: #eaf0f5;\n --mova-ai-neutral-status: #69737d;\n --mova-ai-status-on: #ffffff;\n\n --mova-ai-tooltip-bg: #292929;\n --mova-ai-tooltip-fg: #f6f6f6;\n --mova-ai-tooltip-muted: #c3c3c3;\n --mova-ai-tooltip-border: #484848;\n\n --mova-ai-radius-panel: 8px;\n --mova-ai-radius-control: 8px;\n --mova-ai-shadow-xs: 0 1px 2px rgb(22 28 33 / 5%);\n --mova-ai-shadow-sm: 0 2px 8px rgb(22 28 33 / 7%);\n --mova-ai-shadow-md: 0 8px 20px rgb(22 28 33 / 11%);\n --mova-ai-shadow-lg: 0 14px 32px rgb(22 28 33 / 15%);\n --mova-ai-shadow-hairline: 0 0 0 1px var(--mova-ai-border);\n --mova-ai-shadow-btn: 0 0 0 1px var(--mova-ai-border-strong), var(--mova-ai-shadow-xs);\n --mova-ai-shadow-card: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-sm);\n --mova-ai-shadow-raised: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-md);\n --mova-ai-shadow-overlay: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-lg);\n --mova-ai-shadow-inset-field: inset 0 1px 2px rgb(22 28 33 / 12%);\n}\n\n.mova-ai-theme[data-theme="dark"] {\n color-scheme: dark;\n --mova-ai-page: #181818;\n --mova-ai-canvas: #202020;\n --mova-ai-surface: #272727;\n --mova-ai-inset: #1d1d1d;\n --mova-ai-hover: #2d2d2d;\n --mova-ai-hover-strong: #393939;\n\n --mova-ai-ink: #eeeeee;\n --mova-ai-ink-secondary: #b5b5b5;\n --mova-ai-ink-muted: #929292;\n\n --mova-ai-border: #3b3b3b;\n --mova-ai-border-soft: #303030;\n --mova-ai-border-strong: #505050;\n --mova-ai-field: #2c2c2c;\n --mova-ai-grid: color-mix(in srgb, var(--mova-ai-border) 78%, transparent);\n --mova-ai-stripe: rgb(255 255 255 / 6%);\n --mova-ai-stripe-bg: #202528;\n\n --mova-ai-accent: #c2c2c2;\n --mova-ai-accent-ink: #d5d5d5;\n --mova-ai-accent-foreground: #202020;\n --mova-ai-accent-tint: #353535;\n --mova-ai-success: #88c7a0;\n --mova-ai-success-tint: #293b30;\n --mova-ai-warning: #d7b66f;\n --mova-ai-warning-tint: #3c3525;\n --mova-ai-danger: #e5928e;\n --mova-ai-danger-tint: #3c2b2b;\n --mova-ai-info: #9bbbd6;\n --mova-ai-info-tint: #293541;\n --mova-ai-neutral-status: #a0a0a0;\n --mova-ai-status-on: #181818;\n\n --mova-ai-tooltip-bg: #121212;\n --mova-ai-tooltip-fg: #eeeeee;\n --mova-ai-tooltip-muted: #b5b5b5;\n --mova-ai-tooltip-border: #3b3b3b;\n\n --mova-ai-shadow-xs: 0 1px 2px rgb(0 0 0 / 22%);\n --mova-ai-shadow-sm: 0 2px 8px rgb(0 0 0 / 25%);\n --mova-ai-shadow-md: 0 8px 20px rgb(0 0 0 / 30%);\n --mova-ai-shadow-lg: 0 14px 32px rgb(0 0 0 / 38%);\n --mova-ai-shadow-hairline: 0 0 0 1px var(--mova-ai-border);\n --mova-ai-shadow-btn: 0 0 0 1px var(--mova-ai-border-strong), var(--mova-ai-shadow-xs);\n --mova-ai-shadow-card: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-sm);\n --mova-ai-shadow-raised: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-md);\n --mova-ai-shadow-overlay: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-lg);\n --mova-ai-shadow-inset-field: inset 0 1px 2px rgb(0 0 0 / 42%);\n}\n';
|
|
628
|
+
var scopedStyles = `.mova-ai-approval-card{--approval-action-bg:#454545;--approval-action-fg:#fff;--approval-action-hover:#333;--approval-action-disabled-bg:#e9e9e9;--approval-action-disabled-fg:#858585} .mova-ai-approval-card[data-theme="dark"]{--approval-action-bg:#f5f5f5;--approval-action-fg:#202020;--approval-action-hover:#fff;--approval-action-disabled-bg:#3b3b3b;--approval-action-disabled-fg:#929292} .mova-ai-approval-card .approval-accent{background-color:var(--approval-action-bg);color:var(--approval-action-fg)} .mova-ai-approval-card .approval-accent:not(:disabled):hover{background-color:var(--approval-action-hover)} .mova-ai-approval-card .approval-accent:disabled{background-color:var(--approval-action-disabled-bg);color:var(--approval-action-disabled-fg);opacity:1}
|
|
719
629
|
.mova-ai-approval-card .primitive-card-pad{padding:12px} .mova-ai-approval-card .primitive-card-bar{padding:10px 12px} .mova-ai-approval-card .primitive-card-footer{padding:10px} .mova-ai-approval-card .primitive-icon-button{display:inline-flex;width:28px;height:28px;align-items:center;justify-content:center;border-radius:8px}
|
|
720
|
-
.mova-ai-approval-card :is(button,input,[tabindex]):focus-visible{outline:2px solid var(--accent)!important;outline-offset:2px} .mova-ai-approval-card button:not(:disabled){cursor:pointer} .mova-ai-approval-card code{overflow-wrap:anywhere} .mova-ai-approval-card *, .mova-ai-approval-card *::before,.mova-ai-approval-card *::after{box-sizing:border-box}
|
|
630
|
+
.mova-ai-approval-card :is(button,input,[tabindex]):focus-visible{outline:2px solid var(--mova-ai-accent,#454545)!important;outline-offset:2px} .mova-ai-approval-card button:not(:disabled){cursor:pointer} .mova-ai-approval-card code{overflow-wrap:anywhere} .mova-ai-approval-card *, .mova-ai-approval-card *::before,.mova-ai-approval-card *::after{box-sizing:border-box}
|
|
721
631
|
@keyframes mova-ai-approval-card-pop-in{from{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}
|
|
722
632
|
@keyframes mova-ai-approval-card-fade-up{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}
|
|
723
633
|
@keyframes mova-ai-approval-card-shimmer-text{from{background-position:150% center}to{background-position:-50% center}}
|
|
724
634
|
@media(prefers-reduced-motion:reduce){.mova-ai-approval-card *, .mova-ai-approval-card *::before, .mova-ai-approval-card *::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}`;
|
|
725
635
|
function AIApprovalCard({ theme = "light", ...props } = {}) {
|
|
726
|
-
return /* @__PURE__ */ jsxs("div", { className: "mova-ai-approval-card", "data-theme": theme, children: [
|
|
727
|
-
/* @__PURE__ */
|
|
636
|
+
return /* @__PURE__ */ jsxs("div", { className: "mova-ai-theme mova-ai-approval-card", "data-theme": theme, children: [
|
|
637
|
+
/* @__PURE__ */ jsxs("style", { children: [
|
|
638
|
+
AI_THEME_STYLES,
|
|
639
|
+
scopedStyles
|
|
640
|
+
] }),
|
|
728
641
|
/* @__PURE__ */ jsx(ApprovalCard, { ...props })
|
|
729
642
|
] });
|
|
730
643
|
}
|
|
731
644
|
|
|
732
645
|
// .generated/ui/ai/ai-code-block.tsx
|
|
733
|
-
import { useCallback as useCallback2, useEffect as useEffect5, useRef as useRef2, useState as useState5 } from "react";
|
|
646
|
+
import { useCallback as useCallback2, useEffect as useEffect5, useLayoutEffect as useLayoutEffect2, useRef as useRef2, useState as useState5 } from "react";
|
|
734
647
|
import { Fragment as Fragment2, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
735
648
|
var FILE = "churn.ts";
|
|
736
649
|
var CODE_LINES = [
|
|
@@ -752,7 +665,7 @@ var DIFF = [
|
|
|
752
665
|
{ old: 5, cur: 6, type: "ctx", pieces: [{ text: " return base.gallons;" }] },
|
|
753
666
|
{ old: 6, cur: 7, type: "ctx", pieces: [{ text: "}" }] }
|
|
754
667
|
];
|
|
755
|
-
var HATCH = "repeating-linear-gradient(45deg, var(--
|
|
668
|
+
var HATCH = "repeating-linear-gradient(45deg, var(--mova-ai-danger,#a33c3c) 0, var(--mova-ai-danger,#a33c3c) 1.5px, transparent 1.5px, transparent 3px)";
|
|
756
669
|
var KEYWORDS = /* @__PURE__ */ new Set(["import", "from", "export", "default", "async", "function", "const", "let", "var", "await", "return", "if", "else", "for", "while", "new", "throw", "try", "catch", "null", "true", "false", "undefined"]);
|
|
757
670
|
var TOKEN = /("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|`[^`]*`|\b\d+(?:\.\d+)?\b|\b(?:import|from|export|default|async|function|const|let|var|await|return|if|else|for|while|new|throw|try|catch|null|true|false|undefined)\b|[A-Za-z_$][\w$]*(?=\s*\())/g;
|
|
758
671
|
function highlight(text) {
|
|
@@ -765,10 +678,10 @@ function highlight(text) {
|
|
|
765
678
|
if (idx > last) nodes.push(/* @__PURE__ */ jsx2("span", { children: text.slice(last, idx) }, k++));
|
|
766
679
|
let color;
|
|
767
680
|
let weight;
|
|
768
|
-
if (/^["'`]/.test(t) || /^\d/.test(t)) color = "var(--
|
|
769
|
-
else if (KEYWORDS.has(t)) color = "var(--accent-ink)";
|
|
681
|
+
if (/^["'`]/.test(t) || /^\d/.test(t)) color = "var(--mova-ai-warning,#986517)";
|
|
682
|
+
else if (KEYWORDS.has(t)) color = "var(--mova-ai-accent-ink,#333)";
|
|
770
683
|
else {
|
|
771
|
-
color = "var(--ink)";
|
|
684
|
+
color = "var(--mova-ai-ink,#202020)";
|
|
772
685
|
weight = 500;
|
|
773
686
|
}
|
|
774
687
|
nodes.push(/* @__PURE__ */ jsx2("span", { style: { color, fontWeight: weight }, children: t }, k++));
|
|
@@ -800,8 +713,37 @@ function Pieces({ pieces }) {
|
|
|
800
713
|
return /* @__PURE__ */ jsx2("span", { children: highlight(p.text) }, i);
|
|
801
714
|
}) });
|
|
802
715
|
}
|
|
716
|
+
function CodeContent({ isDiff, lines, diff }) {
|
|
717
|
+
return isDiff ? /* @__PURE__ */ jsxs2("div", { className: "relative", children: [
|
|
718
|
+
/* @__PURE__ */ jsx2("span", { className: "pointer-events-none absolute inset-y-0 left-5 w-px bg-[var(--mova-ai-border,#dedede)]" }),
|
|
719
|
+
diff.map((r, i) => {
|
|
720
|
+
const add = r.type === "add";
|
|
721
|
+
const del = r.type === "del";
|
|
722
|
+
const num = del ? r.old : r.cur;
|
|
723
|
+
return /* @__PURE__ */ jsxs2(
|
|
724
|
+
"div",
|
|
725
|
+
{
|
|
726
|
+
className: `relative grid grid-cols-[20px_minmax(0,1fr)] items-start
|
|
727
|
+
${add ? "bg-[var(--mova-ai-success-tint,#e8f3ec)]" : del ? "bg-[var(--mova-ai-danger-tint,#f7eaea)]" : ""}`,
|
|
728
|
+
children: [
|
|
729
|
+
(add || del) && /* @__PURE__ */ jsx2("span", { className: "absolute inset-y-0 left-0 w-[3px]", style: { background: add ? "var(--mova-ai-success,#28734d)" : HATCH } }),
|
|
730
|
+
/* @__PURE__ */ jsx2("span", { className: `select-none text-center text-[11px] ${add ? "text-[var(--mova-ai-success,#28734d)]" : del ? "text-[var(--mova-ai-danger,#a33c3c)]" : "text-[var(--mova-ai-ink-muted,#858585)]"}`, children: num ?? "" }),
|
|
731
|
+
/* @__PURE__ */ jsx2("code", { className: "pr-3 pl-1 break-words whitespace-pre-wrap", children: /* @__PURE__ */ jsx2(Pieces, { pieces: r.pieces }) })
|
|
732
|
+
]
|
|
733
|
+
},
|
|
734
|
+
i
|
|
735
|
+
);
|
|
736
|
+
})
|
|
737
|
+
] }) : /* @__PURE__ */ jsxs2("div", { className: "relative", children: [
|
|
738
|
+
/* @__PURE__ */ jsx2("span", { className: "pointer-events-none absolute inset-y-0 left-5 w-px bg-[var(--mova-ai-border,#dedede)]" }),
|
|
739
|
+
lines.map((line, i) => /* @__PURE__ */ jsxs2("div", { className: "grid grid-cols-[20px_minmax(0,1fr)] items-start", children: [
|
|
740
|
+
/* @__PURE__ */ jsx2("span", { className: "select-none text-center text-[11px] text-[var(--mova-ai-ink-muted,#858585)]", children: i + 1 }),
|
|
741
|
+
/* @__PURE__ */ jsx2("code", { className: "pr-3 pl-1 break-words whitespace-pre-wrap", children: highlight(line) })
|
|
742
|
+
] }, i))
|
|
743
|
+
] });
|
|
744
|
+
}
|
|
803
745
|
function FileIcon() {
|
|
804
|
-
return /* @__PURE__ */ jsx2("svg", { "aria-hidden": true, width: "15", height: "15", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.8", strokeLinecap: "round", strokeLinejoin: "round", className: "shrink-0 text-[var(--ink-
|
|
746
|
+
return /* @__PURE__ */ jsx2("svg", { "aria-hidden": true, width: "15", height: "15", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.8", strokeLinecap: "round", strokeLinejoin: "round", className: "shrink-0 text-[var(--mova-ai-ink-muted,#858585)]", children: /* @__PURE__ */ jsx2("path", { d: "M17.25 6.75 22.5 12l-5.25 5.25m-10.5 0L1.5 12l5.25-5.25m7.5-3-4.5 16.5" }) });
|
|
805
747
|
}
|
|
806
748
|
var DEFAULT_LABELS2 = { copy: "Copy", copied: "Copied" };
|
|
807
749
|
function CodeBlock({
|
|
@@ -815,12 +757,41 @@ function CodeBlock({
|
|
|
815
757
|
}) {
|
|
816
758
|
const [copied, setCopied] = useState5(false);
|
|
817
759
|
const [view, setView] = useState5("Code");
|
|
760
|
+
const [hasSwitchedView, setHasSwitchedView] = useState5(false);
|
|
818
761
|
const isDiff = (variant ?? view) === "Diff";
|
|
819
762
|
const [copyError, setCopyError] = useState5(false);
|
|
820
763
|
const copyTimer = useRef2(null);
|
|
821
764
|
useEffect5(() => () => {
|
|
822
765
|
if (copyTimer.current) clearTimeout(copyTimer.current);
|
|
823
766
|
}, []);
|
|
767
|
+
const contentRef = useRef2(null);
|
|
768
|
+
const codeMeasureRef = useRef2(null);
|
|
769
|
+
const diffMeasureRef = useRef2(null);
|
|
770
|
+
const [reservedHeight, setReservedHeight] = useState5(0);
|
|
771
|
+
useLayoutEffect2(() => {
|
|
772
|
+
const content = contentRef.current;
|
|
773
|
+
if (!content) return;
|
|
774
|
+
let measuredWidth = -1;
|
|
775
|
+
const measure = (force = false) => {
|
|
776
|
+
const width = content.clientWidth;
|
|
777
|
+
if (!force && width === measuredWidth) return;
|
|
778
|
+
measuredWidth = width;
|
|
779
|
+
const codeHeight = codeMeasureRef.current?.scrollHeight ?? 0;
|
|
780
|
+
const diffHeight = diffMeasureRef.current?.scrollHeight ?? 0;
|
|
781
|
+
setReservedHeight(Math.max(codeHeight, diffHeight));
|
|
782
|
+
};
|
|
783
|
+
measure();
|
|
784
|
+
const observer = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(() => measure(true));
|
|
785
|
+
const handleResize = () => measure(true);
|
|
786
|
+
observer?.observe(content);
|
|
787
|
+
if (codeMeasureRef.current) observer?.observe(codeMeasureRef.current);
|
|
788
|
+
if (diffMeasureRef.current) observer?.observe(diffMeasureRef.current);
|
|
789
|
+
window.addEventListener("resize", handleResize);
|
|
790
|
+
return () => {
|
|
791
|
+
observer?.disconnect();
|
|
792
|
+
window.removeEventListener("resize", handleResize);
|
|
793
|
+
};
|
|
794
|
+
}, [lines, diff]);
|
|
824
795
|
const text = { ...DEFAULT_LABELS2, ...labels };
|
|
825
796
|
const raw = code ?? (isDiff ? diff.map((row) => `${row.type === "add" ? "+" : row.type === "del" ? "-" : " "}${row.pieces.map((piece) => piece.text).join("")}`).join("\n") : lines.join("\n"));
|
|
826
797
|
const copy = useCallback2(() => {
|
|
@@ -838,178 +809,93 @@ function CodeBlock({
|
|
|
838
809
|
}, [raw, onCopy]);
|
|
839
810
|
const added = diff.filter((r) => r.type === "add").length;
|
|
840
811
|
const removed = diff.filter((r) => r.type === "del").length;
|
|
841
|
-
return /* @__PURE__ */ jsxs2("div", { className: "w-full max-w-105 overflow-hidden rounded-[
|
|
842
|
-
/* @__PURE__ */ jsxs2("div", { className: "
|
|
843
|
-
/* @__PURE__ */ jsxs2("span", { className: "inline-flex min-w-0 items-center gap-[7px]", children: [
|
|
812
|
+
return /* @__PURE__ */ jsxs2("div", { className: "w-full max-w-105 overflow-hidden rounded-lg border border-[var(--mova-ai-border,#dedede)] bg-[var(--mova-ai-surface,#fff)] text-[color:var(--mova-ai-ink,#202020)] shadow-[var(--mova-ai-shadow-card,none)]", children: [
|
|
813
|
+
/* @__PURE__ */ jsxs2("div", { className: "mova-ai-code-header grid min-h-11 grid-cols-[minmax(0,1fr)_auto_minmax(0,1fr)] items-center gap-2 border-b border-[var(--mova-ai-border,#dedede)] px-4 text-[12.5px]", children: [
|
|
814
|
+
/* @__PURE__ */ jsxs2("span", { className: "mova-ai-code-filename inline-flex min-w-0 items-center gap-[7px]", children: [
|
|
844
815
|
/* @__PURE__ */ jsx2(FileIcon, {}),
|
|
845
|
-
/* @__PURE__ */ jsx2("span", { className: "truncate font-mono leading-none text-[var(--ink)]", children: filename })
|
|
816
|
+
/* @__PURE__ */ jsx2("span", { className: "min-w-0 truncate font-mono leading-none text-[var(--mova-ai-ink,#202020)]", children: filename })
|
|
846
817
|
] }),
|
|
847
|
-
variant === void 0 && /* @__PURE__ */
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
]
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
818
|
+
variant === void 0 && /* @__PURE__ */ jsxs2("div", { role: "group", "aria-label": "Code view", className: "mova-ai-code-view-controls relative inline-grid shrink-0 grid-cols-2 items-center justify-self-center rounded-[6px] bg-[var(--mova-ai-field,#f6f6f6)] p-0.5", children: [
|
|
819
|
+
/* @__PURE__ */ jsx2(
|
|
820
|
+
"span",
|
|
821
|
+
{
|
|
822
|
+
"aria-hidden": "true",
|
|
823
|
+
className: "pointer-events-none absolute left-0.5 top-0.5 bottom-0.5 rounded-[4px] bg-[var(--mova-ai-surface,#fff)] shadow-[var(--mova-ai-shadow-btn,none)] transition-transform duration-200 ease-out motion-reduce:transition-none",
|
|
824
|
+
style: { width: "calc((100% - 4px) / 2)", transform: view === "Diff" ? "translateX(100%)" : "translateX(0)" }
|
|
825
|
+
}
|
|
826
|
+
),
|
|
827
|
+
["Code", "Diff"].map((item) => /* @__PURE__ */ jsx2("button", { type: "button", "aria-pressed": view === item, onClick: () => {
|
|
828
|
+
setView(item);
|
|
829
|
+
setHasSwitchedView(true);
|
|
830
|
+
setCopied(false);
|
|
831
|
+
setCopyError(false);
|
|
832
|
+
}, className: `relative z-10 min-w-[34px] rounded-[4px] px-1.5 py-1 text-[11px] leading-none transition-colors duration-150 ${view === item ? "text-[var(--mova-ai-ink,#202020)]" : "text-[var(--mova-ai-ink-muted,#858585)]"}`, children: item }, item))
|
|
861
833
|
] }),
|
|
862
|
-
/* @__PURE__ */ jsxs2(
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
type: "button",
|
|
866
|
-
"aria-label": isDiff ? "Copy diff" : "Copy code",
|
|
867
|
-
"aria-live": "polite",
|
|
868
|
-
onClick: copy,
|
|
869
|
-
className: `-mr-1 ml-auto flex h-6 items-center gap-1 rounded-[6px] px-1.5 text-[12px]
|
|
870
|
-
font-medium transition-colors duration-100 hover:bg-[var(--hover)]
|
|
871
|
-
${copied ? "text-[var(--green)]" : "text-[var(--ink-3)] hover:text-[var(--ink)]"}`,
|
|
872
|
-
children: [
|
|
873
|
-
copied ? /* @__PURE__ */ jsx2("svg", { width: "11", height: "11", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "3", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx2("path", { d: "M20 6L9 17l-5-5" }) }) : /* @__PURE__ */ jsxs2("svg", { width: "11", height: "11", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
|
|
874
|
-
/* @__PURE__ */ jsx2("rect", { x: "9", y: "9", width: "12", height: "12", rx: "2.5" }),
|
|
875
|
-
/* @__PURE__ */ jsx2("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })
|
|
876
|
-
] }),
|
|
877
|
-
copied ? text.copied : text.copy
|
|
878
|
-
]
|
|
879
|
-
}
|
|
880
|
-
)
|
|
881
|
-
] }),
|
|
882
|
-
copyError && /* @__PURE__ */ jsx2("div", { role: "alert", className: "px-4 py-1 text-[11px] text-[var(--red)]", children: "Clipboard unavailable. Select the code to copy." }),
|
|
883
|
-
/* @__PURE__ */ jsx2("div", { className: "py-3 font-mono text-[12.5px] leading-[1.65] text-[var(--ink-2)]", children: isDiff ? /* @__PURE__ */ jsxs2("div", { className: "relative", children: [
|
|
884
|
-
/* @__PURE__ */ jsx2("span", { className: "pointer-events-none absolute inset-y-0 left-5 w-px bg-[var(--line)]" }),
|
|
885
|
-
diff.map((r, i) => {
|
|
886
|
-
const add = r.type === "add";
|
|
887
|
-
const del = r.type === "del";
|
|
888
|
-
const num = del ? r.old : r.cur;
|
|
889
|
-
return /* @__PURE__ */ jsxs2(
|
|
890
|
-
"div",
|
|
834
|
+
/* @__PURE__ */ jsxs2("div", { className: "mova-ai-code-actions col-start-3 flex min-w-0 flex-wrap items-center justify-end gap-2", children: [
|
|
835
|
+
/* @__PURE__ */ jsxs2(
|
|
836
|
+
"span",
|
|
891
837
|
{
|
|
892
|
-
|
|
893
|
-
|
|
838
|
+
"aria-hidden": !isDiff,
|
|
839
|
+
className: `inline-flex shrink-0 items-center gap-2 font-mono text-[12px] leading-none tabular-nums ${isDiff ? "visible" : "invisible"}`,
|
|
894
840
|
children: [
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
841
|
+
/* @__PURE__ */ jsxs2("span", { className: "text-[var(--mova-ai-success,#28734d)]", children: [
|
|
842
|
+
"+",
|
|
843
|
+
added
|
|
844
|
+
] }),
|
|
845
|
+
/* @__PURE__ */ jsxs2("span", { className: "text-[var(--mova-ai-danger,#a33c3c)]", children: [
|
|
846
|
+
"-",
|
|
847
|
+
removed
|
|
848
|
+
] })
|
|
898
849
|
]
|
|
899
|
-
}
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
850
|
+
}
|
|
851
|
+
),
|
|
852
|
+
/* @__PURE__ */ jsxs2(
|
|
853
|
+
"button",
|
|
854
|
+
{
|
|
855
|
+
type: "button",
|
|
856
|
+
"aria-label": isDiff ? "Copy diff" : "Copy code",
|
|
857
|
+
"aria-live": "polite",
|
|
858
|
+
onClick: copy,
|
|
859
|
+
className: `mova-ai-code-copy-button flex min-h-6 min-w-0 max-w-full items-center gap-1 rounded-[6px] px-1.5 text-[12px]
|
|
860
|
+
font-medium transition-colors duration-100 hover:bg-[var(--mova-ai-hover,#f1f1f1)]
|
|
861
|
+
${copied ? "text-[var(--mova-ai-success,#28734d)]" : "text-[var(--mova-ai-ink-muted,#858585)] hover:text-[var(--mova-ai-ink,#202020)]"}`,
|
|
862
|
+
children: [
|
|
863
|
+
copied ? /* @__PURE__ */ jsx2("svg", { width: "11", height: "11", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "3", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx2("path", { d: "M20 6L9 17l-5-5" }) }) : /* @__PURE__ */ jsxs2("svg", { width: "11", height: "11", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
|
|
864
|
+
/* @__PURE__ */ jsx2("rect", { x: "9", y: "9", width: "12", height: "12", rx: "2.5" }),
|
|
865
|
+
/* @__PURE__ */ jsx2("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })
|
|
866
|
+
] }),
|
|
867
|
+
/* @__PURE__ */ jsx2("span", { className: "min-w-0 break-words", children: copied ? text.copied : text.copy })
|
|
868
|
+
]
|
|
869
|
+
}
|
|
870
|
+
)
|
|
871
|
+
] })
|
|
872
|
+
] }),
|
|
873
|
+
copyError && /* @__PURE__ */ jsx2("div", { role: "alert", className: "px-4 py-1 text-[11px] text-[var(--mova-ai-danger,#a33c3c)]", children: "Clipboard unavailable. Select the code to copy." }),
|
|
874
|
+
/* @__PURE__ */ jsx2("div", { className: "py-3 font-mono text-[12.5px] leading-[1.65] text-[var(--mova-ai-ink-secondary,#666)]", children: /* @__PURE__ */ jsxs2("div", { ref: contentRef, className: "relative", style: { minHeight: reservedHeight || void 0 }, children: [
|
|
875
|
+
/* @__PURE__ */ jsxs2("div", { "aria-hidden": "true", className: "pointer-events-none invisible absolute inset-0 select-none", children: [
|
|
876
|
+
/* @__PURE__ */ jsx2("div", { ref: codeMeasureRef, className: "absolute inset-x-0 top-0", children: /* @__PURE__ */ jsx2(CodeContent, { isDiff: false, lines, diff }) }),
|
|
877
|
+
/* @__PURE__ */ jsx2("div", { ref: diffMeasureRef, className: "absolute inset-x-0 top-0", children: /* @__PURE__ */ jsx2(CodeContent, { isDiff: true, lines, diff }) })
|
|
878
|
+
] }),
|
|
879
|
+
/* @__PURE__ */ jsx2("div", { className: hasSwitchedView ? "mova-ai-code-view-enter" : void 0, children: /* @__PURE__ */ jsx2(CodeContent, { isDiff, lines, diff }) }, isDiff ? "diff" : "code")
|
|
909
880
|
] }) })
|
|
910
881
|
] });
|
|
911
882
|
}
|
|
912
|
-
var
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
--hover: oklch(0.97 0.002 247.839);
|
|
918
|
-
--hover-2: oklch(0.933 0.003 247.86);
|
|
919
|
-
|
|
920
|
-
--ink: oklch(0.247 0.006 258.361);
|
|
921
|
-
--ink-2: oklch(0.506 0.01 264.477);
|
|
922
|
-
--ink-3: oklch(0.695 0.009 264.505);
|
|
923
|
-
|
|
924
|
-
--line: oklch(0.946 0.003 264.542);
|
|
925
|
-
--line-strong: oklch(0.912 0.005 258.326);
|
|
926
|
-
--line-soft: oklch(0.966 0.002 264.542);
|
|
927
|
-
--grid-line: color-mix(in srgb, var(--line) 78%, transparent);
|
|
928
|
-
--field: oklch(0.961 0.001 286.375);
|
|
929
|
-
--stripe: oklch(0.405 0 0 / 0.075);
|
|
930
|
-
--stripe-bg: oklch(0.97 0 0);
|
|
931
|
-
|
|
932
|
-
--accent: oklch(0.626 0.205 254.947);
|
|
933
|
-
--accent-ink: oklch(0.556 0.187 255.617);
|
|
934
|
-
--accent-tint: oklch(0.96 0.019 252.878);
|
|
935
|
-
|
|
936
|
-
--green: oklch(0.603 0.155 150.883);
|
|
937
|
-
--green-tint: oklch(0.958 0.017 159.118);
|
|
938
|
-
--orange: oklch(0.689 0.179 49.902);
|
|
939
|
-
--orange-tint: oklch(0.964 0.021 67.581);
|
|
940
|
-
--red: oklch(0.621 0.192 23.042);
|
|
941
|
-
--red-tint: oklch(0.956 0.017 17.462);
|
|
942
|
-
|
|
943
|
-
--tooltip-bg: oklch(0.272 0.008 264.435);
|
|
944
|
-
--tooltip-fg: oklch(0.976 0.002 247.839);
|
|
945
|
-
--tooltip-muted: oklch(0.731 0.008 260.731);
|
|
946
|
-
--tooltip-border: oklch(0.356 0.007 264.474);
|
|
947
|
-
|
|
948
|
-
--shadow-hairline: 0 0 0 1px var(--line);
|
|
949
|
-
--shadow-btn: 0 0 0 1px var(--line-strong), var(--shadow-xs);
|
|
950
|
-
--shadow-card: 0 0 0 1px var(--line), var(--shadow-sm);
|
|
951
|
-
--shadow-raised: 0 0 0 1px var(--line), var(--shadow-md);
|
|
952
|
-
--shadow-overlay: 0 0 0 1px var(--line), var(--shadow-lg);
|
|
953
|
-
--shadow-inset-field: inset 0 1px 2px oklch(0 0 0 / 0.12);--shadow-xs: 0 0 4px 0 rgba(0, 0, 0, 0.04);--shadow-sm: 0 18px 47px 0 rgba(0, 0, 0, 0.03), 0 7.5px 19px 0 rgba(0, 0, 0, 0.02),
|
|
954
|
-
0 4px 10.5px 0 rgba(0, 0, 0, 0.02), 0 2.3px 5.8px 0 rgba(0, 0, 0, 0.01),
|
|
955
|
-
0 1.2px 3.1px 0 rgba(0, 0, 0, 0.01), 0 0.5px 1.3px 0 rgba(0, 0, 0, 0.01);--shadow-md: 0 17.54px 23.39px 0 rgba(0, 0, 0, 0.04), 0 9.4px 12.5px 0 rgba(0, 0, 0, 0.03),
|
|
956
|
-
0 5.25px 7px 0 rgba(0, 0, 0, 0.02), 0 2.79px 3.72px -2px rgba(0, 0, 0, 0.01),
|
|
957
|
-
0 1.16px 1.5px 0 rgba(0, 0, 0, 0.01);--radius-control:8px;
|
|
958
|
-
width:100%;max-width:420px;min-width:0;font-family:Inter,ui-sans-serif,system-ui,sans-serif;font-size:14px;line-height:1.5;letter-spacing:-.01em;color:var(--ink);}
|
|
959
|
-
.mova-ai-code-block[data-theme="dark"]{
|
|
960
|
-
--page: oklch(0.209 0.004 264.477);
|
|
961
|
-
--canvas: oklch(0.231 0.004 264.487);
|
|
962
|
-
--surface: oklch(0.26 0.006 271.191);
|
|
963
|
-
--inset: oklch(0.243 0.004 264.492);
|
|
964
|
-
--hover: oklch(0.289 0.006 271.22);
|
|
965
|
-
--hover-2: oklch(0.318 0.007 274.747);
|
|
966
|
-
|
|
967
|
-
--ink: oklch(0.964 0.002 247.839);
|
|
968
|
-
--ink-2: oklch(0.731 0.008 260.731);
|
|
969
|
-
--ink-3: oklch(0.541 0.01 264.484);
|
|
970
|
-
|
|
971
|
-
--line: oklch(0.308 0.006 258.354);
|
|
972
|
-
--line-strong: oklch(0.356 0.007 264.474);
|
|
973
|
-
--line-soft: oklch(0.278 0.006 258.354);
|
|
974
|
-
--field: oklch(0.293 0.006 271.223);
|
|
975
|
-
--stripe: oklch(1 0 0 / 0.055);
|
|
976
|
-
--stripe-bg: oklch(0.226 0.004 264.485);
|
|
977
|
-
|
|
978
|
-
--accent: oklch(0.68 0.173 253.301);
|
|
979
|
-
--accent-ink: oklch(0.788 0.113 248.33);
|
|
980
|
-
--accent-tint: oklch(0.68 0.173 253.301 / 0.16);
|
|
981
|
-
|
|
982
|
-
--green: oklch(0.705 0.154 153.814);
|
|
983
|
-
--green-tint: oklch(0.705 0.154 153.814 / 0.14);
|
|
984
|
-
--orange: oklch(0.746 0.156 55.642);
|
|
985
|
-
--orange-tint: oklch(0.746 0.156 55.642 / 0.14);
|
|
986
|
-
--red: oklch(0.666 0.18 21.433);
|
|
987
|
-
--red-tint: oklch(0.666 0.18 21.433 / 0.14);
|
|
988
|
-
|
|
989
|
-
--tooltip-bg: oklch(0.182 0.004 264.459);
|
|
990
|
-
--tooltip-fg: oklch(0.964 0.002 247.839);
|
|
991
|
-
--tooltip-muted: oklch(0.731 0.008 260.731);
|
|
992
|
-
--tooltip-border: oklch(0.308 0.006 258.354);
|
|
993
|
-
|
|
994
|
-
--shadow-hairline: 0 0 0 1px var(--line);
|
|
995
|
-
--shadow-btn: 0 0 0 1px oklch(1 0 0 / 0.1), 0 1px 2px oklch(0 0 0 / 0.3);
|
|
996
|
-
--shadow-card:
|
|
997
|
-
0 0 0 1px oklch(1 0 0 / 0.11), 0 1px 2px oklch(0 0 0 / 0.2),
|
|
998
|
-
0 2px 6px oklch(0 0 0 / 0.2);
|
|
999
|
-
--shadow-raised:
|
|
1000
|
-
0 0 0 1px oklch(1 0 0 / 0.13), 0 2px 10px oklch(0 0 0 / 0.22);
|
|
1001
|
-
--shadow-overlay:
|
|
1002
|
-
0 0 0 1px oklch(1 0 0 / 0.15), 0 8px 28px oklch(0 0 0 / 0.34);
|
|
1003
|
-
--shadow-inset-field: inset 0 1px 2px oklch(0 0 0 / 0.4);}
|
|
1004
|
-
.mova-ai-code-block .primitive-card-pad{padding:12px} .mova-ai-code-block .primitive-card-bar{padding:10px 12px} .mova-ai-code-block .primitive-card-footer{padding:10px} .mova-ai-code-block .primitive-icon-button{display:inline-flex;width:28px;height:28px;align-items:center;justify-content:center;border-radius:8px}
|
|
1005
|
-
.mova-ai-code-block :is(button,input,[tabindex]):focus-visible{outline:2px solid var(--accent)!important;outline-offset:2px} .mova-ai-code-block button:not(:disabled){cursor:pointer} .mova-ai-code-block code{overflow-wrap:anywhere} .mova-ai-code-block *, .mova-ai-code-block *::before,.mova-ai-code-block *::after{box-sizing:border-box}
|
|
883
|
+
var AI_THEME_STYLES2 = '/* Shared public tokens for the standalone AI component family. */\n.mova-ai-theme {\n color-scheme: light;\n color: var(--mova-ai-ink, #202020);\n font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;\n font-size: 13px;\n line-height: 1.45;\n letter-spacing: -0.01em;\n\n --mova-ai-page: #f7f7f7;\n --mova-ai-canvas: #f4f4f4;\n --mova-ai-surface: #ffffff;\n --mova-ai-inset: #f8f8f8;\n --mova-ai-hover: #f1f1f1;\n --mova-ai-hover-strong: #e9e9e9;\n\n --mova-ai-ink: #202020;\n --mova-ai-ink-secondary: #666666;\n --mova-ai-ink-muted: #858585;\n\n --mova-ai-border: #dedede;\n --mova-ai-border-soft: #ededed;\n --mova-ai-border-strong: #c8c8c8;\n --mova-ai-field: #f6f6f6;\n --mova-ai-grid: color-mix(in srgb, var(--mova-ai-border) 78%, transparent);\n --mova-ai-stripe: rgb(32 35 38 / 7%);\n --mova-ai-stripe-bg: #242424;\n\n --mova-ai-accent: #454545;\n --mova-ai-accent-ink: #333333;\n --mova-ai-accent-foreground: #ffffff;\n --mova-ai-accent-tint: #eeeeee;\n --mova-ai-success: #28734d;\n --mova-ai-success-tint: #e8f3ec;\n --mova-ai-warning: #986517;\n --mova-ai-warning-tint: #f8f0df;\n --mova-ai-danger: #a33c3c;\n --mova-ai-danger-tint: #f7eaea;\n --mova-ai-info: #496b89;\n --mova-ai-info-tint: #eaf0f5;\n --mova-ai-neutral-status: #69737d;\n --mova-ai-status-on: #ffffff;\n\n --mova-ai-tooltip-bg: #292929;\n --mova-ai-tooltip-fg: #f6f6f6;\n --mova-ai-tooltip-muted: #c3c3c3;\n --mova-ai-tooltip-border: #484848;\n\n --mova-ai-radius-panel: 8px;\n --mova-ai-radius-control: 8px;\n --mova-ai-shadow-xs: 0 1px 2px rgb(22 28 33 / 5%);\n --mova-ai-shadow-sm: 0 2px 8px rgb(22 28 33 / 7%);\n --mova-ai-shadow-md: 0 8px 20px rgb(22 28 33 / 11%);\n --mova-ai-shadow-lg: 0 14px 32px rgb(22 28 33 / 15%);\n --mova-ai-shadow-hairline: 0 0 0 1px var(--mova-ai-border);\n --mova-ai-shadow-btn: 0 0 0 1px var(--mova-ai-border-strong), var(--mova-ai-shadow-xs);\n --mova-ai-shadow-card: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-sm);\n --mova-ai-shadow-raised: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-md);\n --mova-ai-shadow-overlay: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-lg);\n --mova-ai-shadow-inset-field: inset 0 1px 2px rgb(22 28 33 / 12%);\n}\n\n.mova-ai-theme[data-theme="dark"] {\n color-scheme: dark;\n --mova-ai-page: #181818;\n --mova-ai-canvas: #202020;\n --mova-ai-surface: #272727;\n --mova-ai-inset: #1d1d1d;\n --mova-ai-hover: #2d2d2d;\n --mova-ai-hover-strong: #393939;\n\n --mova-ai-ink: #eeeeee;\n --mova-ai-ink-secondary: #b5b5b5;\n --mova-ai-ink-muted: #929292;\n\n --mova-ai-border: #3b3b3b;\n --mova-ai-border-soft: #303030;\n --mova-ai-border-strong: #505050;\n --mova-ai-field: #2c2c2c;\n --mova-ai-grid: color-mix(in srgb, var(--mova-ai-border) 78%, transparent);\n --mova-ai-stripe: rgb(255 255 255 / 6%);\n --mova-ai-stripe-bg: #202528;\n\n --mova-ai-accent: #c2c2c2;\n --mova-ai-accent-ink: #d5d5d5;\n --mova-ai-accent-foreground: #202020;\n --mova-ai-accent-tint: #353535;\n --mova-ai-success: #88c7a0;\n --mova-ai-success-tint: #293b30;\n --mova-ai-warning: #d7b66f;\n --mova-ai-warning-tint: #3c3525;\n --mova-ai-danger: #e5928e;\n --mova-ai-danger-tint: #3c2b2b;\n --mova-ai-info: #9bbbd6;\n --mova-ai-info-tint: #293541;\n --mova-ai-neutral-status: #a0a0a0;\n --mova-ai-status-on: #181818;\n\n --mova-ai-tooltip-bg: #121212;\n --mova-ai-tooltip-fg: #eeeeee;\n --mova-ai-tooltip-muted: #b5b5b5;\n --mova-ai-tooltip-border: #3b3b3b;\n\n --mova-ai-shadow-xs: 0 1px 2px rgb(0 0 0 / 22%);\n --mova-ai-shadow-sm: 0 2px 8px rgb(0 0 0 / 25%);\n --mova-ai-shadow-md: 0 8px 20px rgb(0 0 0 / 30%);\n --mova-ai-shadow-lg: 0 14px 32px rgb(0 0 0 / 38%);\n --mova-ai-shadow-hairline: 0 0 0 1px var(--mova-ai-border);\n --mova-ai-shadow-btn: 0 0 0 1px var(--mova-ai-border-strong), var(--mova-ai-shadow-xs);\n --mova-ai-shadow-card: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-sm);\n --mova-ai-shadow-raised: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-md);\n --mova-ai-shadow-overlay: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-lg);\n --mova-ai-shadow-inset-field: inset 0 1px 2px rgb(0 0 0 / 42%);\n}\n';
|
|
884
|
+
var scopedStyles2 = `.mova-ai-code-block{container-type:inline-size} .mova-ai-code-block .primitive-card-pad{padding:12px} .mova-ai-code-block .primitive-card-bar{padding:10px 12px} .mova-ai-code-block .primitive-card-footer{padding:10px} .mova-ai-code-block .primitive-icon-button{display:inline-flex;width:28px;height:28px;align-items:center;justify-content:center;border-radius:8px}
|
|
885
|
+
.mova-ai-code-block :is(button,input,[tabindex]):focus-visible{outline:2px solid var(--mova-ai-accent,#454545)!important;outline-offset:2px} .mova-ai-code-block button:not(:disabled){cursor:pointer} .mova-ai-code-block code{overflow-wrap:anywhere} .mova-ai-code-block *, .mova-ai-code-block *::before,.mova-ai-code-block *::after{box-sizing:border-box}
|
|
886
|
+
.mova-ai-code-block .mova-ai-code-view-enter{animation:mova-ai-code-block-view-enter 180ms cubic-bezier(.2,.7,.2,1) both}
|
|
887
|
+
@keyframes mova-ai-code-block-view-enter{from{opacity:0;transform:translateY(3px)}to{opacity:1;transform:translateY(0)}}
|
|
1006
888
|
@keyframes mova-ai-code-block-pop-in{from{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}
|
|
1007
889
|
@keyframes mova-ai-code-block-fade-up{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}
|
|
1008
890
|
@keyframes mova-ai-code-block-shimmer-text{from{background-position:150% center}to{background-position:-50% center}}
|
|
891
|
+
@container (max-width:360px){.mova-ai-code-block .mova-ai-code-header{grid-template-columns:minmax(0,1fr) minmax(0,1fr);row-gap:8px;padding-top:8px;padding-bottom:8px}.mova-ai-code-block .mova-ai-code-filename{grid-column:1;grid-row:1}.mova-ai-code-block .mova-ai-code-actions{grid-column:2;grid-row:1;max-width:100%}.mova-ai-code-block .mova-ai-code-view-controls{grid-column:1/-1;grid-row:2}}
|
|
1009
892
|
@media(prefers-reduced-motion:reduce){.mova-ai-code-block *, .mova-ai-code-block *::before, .mova-ai-code-block *::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}`;
|
|
1010
893
|
function AICodeBlock({ theme = "light", ...props } = {}) {
|
|
1011
|
-
return /* @__PURE__ */ jsxs2("div", { className: "mova-ai-code-block", "data-theme": theme, children: [
|
|
1012
|
-
/* @__PURE__ */
|
|
894
|
+
return /* @__PURE__ */ jsxs2("div", { className: "mova-ai-theme mova-ai-code-block w-full min-w-0 max-w-105", "data-theme": theme, children: [
|
|
895
|
+
/* @__PURE__ */ jsxs2("style", { children: [
|
|
896
|
+
AI_THEME_STYLES2,
|
|
897
|
+
scopedStyles2
|
|
898
|
+
] }),
|
|
1013
899
|
/* @__PURE__ */ jsx2(CodeBlock, { ...props })
|
|
1014
900
|
] });
|
|
1015
901
|
}
|
|
@@ -1020,14 +906,15 @@ import { useState as useState6 } from "react";
|
|
|
1020
906
|
import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
1021
907
|
var SPRING_DEFAULT = { bounce: 0.1, duration: 0.25, type: "spring" };
|
|
1022
908
|
var EASE_OUT = [0.23, 1, 0.32, 1];
|
|
909
|
+
var AI_THEME_STYLES3 = '/* Shared public tokens for the standalone AI component family. */\n.mova-ai-theme {\n color-scheme: light;\n color: var(--mova-ai-ink, #202020);\n font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;\n font-size: 13px;\n line-height: 1.45;\n letter-spacing: -0.01em;\n\n --mova-ai-page: #f7f7f7;\n --mova-ai-canvas: #f4f4f4;\n --mova-ai-surface: #ffffff;\n --mova-ai-inset: #f8f8f8;\n --mova-ai-hover: #f1f1f1;\n --mova-ai-hover-strong: #e9e9e9;\n\n --mova-ai-ink: #202020;\n --mova-ai-ink-secondary: #666666;\n --mova-ai-ink-muted: #858585;\n\n --mova-ai-border: #dedede;\n --mova-ai-border-soft: #ededed;\n --mova-ai-border-strong: #c8c8c8;\n --mova-ai-field: #f6f6f6;\n --mova-ai-grid: color-mix(in srgb, var(--mova-ai-border) 78%, transparent);\n --mova-ai-stripe: rgb(32 35 38 / 7%);\n --mova-ai-stripe-bg: #242424;\n\n --mova-ai-accent: #454545;\n --mova-ai-accent-ink: #333333;\n --mova-ai-accent-foreground: #ffffff;\n --mova-ai-accent-tint: #eeeeee;\n --mova-ai-success: #28734d;\n --mova-ai-success-tint: #e8f3ec;\n --mova-ai-warning: #986517;\n --mova-ai-warning-tint: #f8f0df;\n --mova-ai-danger: #a33c3c;\n --mova-ai-danger-tint: #f7eaea;\n --mova-ai-info: #496b89;\n --mova-ai-info-tint: #eaf0f5;\n --mova-ai-neutral-status: #69737d;\n --mova-ai-status-on: #ffffff;\n\n --mova-ai-tooltip-bg: #292929;\n --mova-ai-tooltip-fg: #f6f6f6;\n --mova-ai-tooltip-muted: #c3c3c3;\n --mova-ai-tooltip-border: #484848;\n\n --mova-ai-radius-panel: 8px;\n --mova-ai-radius-control: 8px;\n --mova-ai-shadow-xs: 0 1px 2px rgb(22 28 33 / 5%);\n --mova-ai-shadow-sm: 0 2px 8px rgb(22 28 33 / 7%);\n --mova-ai-shadow-md: 0 8px 20px rgb(22 28 33 / 11%);\n --mova-ai-shadow-lg: 0 14px 32px rgb(22 28 33 / 15%);\n --mova-ai-shadow-hairline: 0 0 0 1px var(--mova-ai-border);\n --mova-ai-shadow-btn: 0 0 0 1px var(--mova-ai-border-strong), var(--mova-ai-shadow-xs);\n --mova-ai-shadow-card: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-sm);\n --mova-ai-shadow-raised: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-md);\n --mova-ai-shadow-overlay: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-lg);\n --mova-ai-shadow-inset-field: inset 0 1px 2px rgb(22 28 33 / 12%);\n}\n\n.mova-ai-theme[data-theme="dark"] {\n color-scheme: dark;\n --mova-ai-page: #181818;\n --mova-ai-canvas: #202020;\n --mova-ai-surface: #272727;\n --mova-ai-inset: #1d1d1d;\n --mova-ai-hover: #2d2d2d;\n --mova-ai-hover-strong: #393939;\n\n --mova-ai-ink: #eeeeee;\n --mova-ai-ink-secondary: #b5b5b5;\n --mova-ai-ink-muted: #929292;\n\n --mova-ai-border: #3b3b3b;\n --mova-ai-border-soft: #303030;\n --mova-ai-border-strong: #505050;\n --mova-ai-field: #2c2c2c;\n --mova-ai-grid: color-mix(in srgb, var(--mova-ai-border) 78%, transparent);\n --mova-ai-stripe: rgb(255 255 255 / 6%);\n --mova-ai-stripe-bg: #202528;\n\n --mova-ai-accent: #c2c2c2;\n --mova-ai-accent-ink: #d5d5d5;\n --mova-ai-accent-foreground: #202020;\n --mova-ai-accent-tint: #353535;\n --mova-ai-success: #88c7a0;\n --mova-ai-success-tint: #293b30;\n --mova-ai-warning: #d7b66f;\n --mova-ai-warning-tint: #3c3525;\n --mova-ai-danger: #e5928e;\n --mova-ai-danger-tint: #3c2b2b;\n --mova-ai-info: #9bbbd6;\n --mova-ai-info-tint: #293541;\n --mova-ai-neutral-status: #a0a0a0;\n --mova-ai-status-on: #181818;\n\n --mova-ai-tooltip-bg: #121212;\n --mova-ai-tooltip-fg: #eeeeee;\n --mova-ai-tooltip-muted: #b5b5b5;\n --mova-ai-tooltip-border: #3b3b3b;\n\n --mova-ai-shadow-xs: 0 1px 2px rgb(0 0 0 / 22%);\n --mova-ai-shadow-sm: 0 2px 8px rgb(0 0 0 / 25%);\n --mova-ai-shadow-md: 0 8px 20px rgb(0 0 0 / 30%);\n --mova-ai-shadow-lg: 0 14px 32px rgb(0 0 0 / 38%);\n --mova-ai-shadow-hairline: 0 0 0 1px var(--mova-ai-border);\n --mova-ai-shadow-btn: 0 0 0 1px var(--mova-ai-border-strong), var(--mova-ai-shadow-xs);\n --mova-ai-shadow-card: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-sm);\n --mova-ai-shadow-raised: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-md);\n --mova-ai-shadow-overlay: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-lg);\n --mova-ai-shadow-inset-field: inset 0 1px 2px rgb(0 0 0 / 42%);\n}\n';
|
|
1023
910
|
var VIEWBOX = 32;
|
|
1024
911
|
var CENTER = VIEWBOX / 2;
|
|
1025
912
|
var RADIUS = 13;
|
|
1026
913
|
var STROKE_WIDTH = 3;
|
|
1027
914
|
var DEFAULT_WARNING_AT = 0.8;
|
|
1028
915
|
var DEFAULT_DANGER_AT = 0.95;
|
|
1029
|
-
var WARNING_COLOR = "
|
|
1030
|
-
var DANGER_COLOR = "
|
|
916
|
+
var WARNING_COLOR = "var(--mova-ai-warning,#986517)";
|
|
917
|
+
var DANGER_COLOR = "var(--mova-ai-danger,#a33c3c)";
|
|
1031
918
|
var formatTokens = (tokens) => {
|
|
1032
919
|
if (tokens >= 1e6) return `${(tokens / 1e6).toFixed(1)}M`;
|
|
1033
920
|
if (tokens >= 1e4) return `${Math.round(tokens / 1e3)}k`;
|
|
@@ -1039,6 +926,7 @@ function AIContextMeter({
|
|
|
1039
926
|
className = "",
|
|
1040
927
|
dangerAt = DEFAULT_DANGER_AT,
|
|
1041
928
|
limit,
|
|
929
|
+
theme = "light",
|
|
1042
930
|
used,
|
|
1043
931
|
warningAt = DEFAULT_WARNING_AT
|
|
1044
932
|
}) {
|
|
@@ -1048,13 +936,14 @@ function AIContextMeter({
|
|
|
1048
936
|
const percent = Math.round(fraction * 100);
|
|
1049
937
|
const color = fraction >= dangerAt ? DANGER_COLOR : fraction >= warningAt ? WARNING_COLOR : "currentColor";
|
|
1050
938
|
const hasBreakdown = Boolean(breakdown?.length);
|
|
1051
|
-
return /* @__PURE__ */ jsxs3("div", { className: `relative inline-block ${className}`, children: [
|
|
939
|
+
return /* @__PURE__ */ jsxs3("div", { className: `mova-ai-theme relative inline-block ${className}`, "data-theme": theme, children: [
|
|
940
|
+
/* @__PURE__ */ jsx3("style", { children: AI_THEME_STYLES3 }),
|
|
1052
941
|
/* @__PURE__ */ jsxs3(
|
|
1053
942
|
"button",
|
|
1054
943
|
{
|
|
1055
944
|
"aria-expanded": hasBreakdown ? isOpen : void 0,
|
|
1056
945
|
"aria-label": `Context window ${percent}% used, ${formatTokens(used)} of ${formatTokens(limit)} tokens`,
|
|
1057
|
-
className: "flex cursor-pointer items-center gap-1.5 rounded-lg px-1 py-0.5 text-
|
|
946
|
+
className: "flex cursor-pointer items-center gap-1.5 rounded-lg px-1 py-0.5 text-[color:var(--mova-ai-ink-secondary,#666)] text-xs transition-colors hover:text-[color:var(--mova-ai-ink,#202020)]",
|
|
1058
947
|
disabled: !hasBreakdown,
|
|
1059
948
|
onBlur: () => setIsOpen(false),
|
|
1060
949
|
onClick: () => setIsOpen((current) => !current),
|
|
@@ -1092,14 +981,14 @@ function AIContextMeter({
|
|
|
1092
981
|
motion.div,
|
|
1093
982
|
{
|
|
1094
983
|
animate: { opacity: 1, scale: 1, y: 0 },
|
|
1095
|
-
className: "absolute bottom-full left-
|
|
984
|
+
className: "absolute bottom-full left-1/2 z-50 mb-1.5 w-56 -translate-x-1/2 rounded-lg border border-[var(--mova-ai-border,#dedede)] bg-[var(--mova-ai-surface,#fff)] p-2.5 text-[color:var(--mova-ai-ink,#202020)] shadow-lg",
|
|
1096
985
|
exit: shouldReduceMotion ? { opacity: 0, transition: { duration: 0 } } : { opacity: 0, scale: 0.96, y: 4 },
|
|
1097
986
|
initial: shouldReduceMotion ? { opacity: 1, scale: 1, y: 0 } : { opacity: 0, scale: 0.96, y: 4 },
|
|
1098
|
-
style: { transformOrigin: "bottom
|
|
987
|
+
style: { transformOrigin: "bottom center" },
|
|
1099
988
|
transition: shouldReduceMotion ? { duration: 0 } : { duration: 0.18, ease: EASE_OUT },
|
|
1100
989
|
children: /* @__PURE__ */ jsx3("ul", { className: "list-none space-y-1", children: breakdown?.map((item) => /* @__PURE__ */ jsxs3("li", { className: "flex items-baseline justify-between gap-3 text-xs", children: [
|
|
1101
|
-
/* @__PURE__ */ jsx3("span", { className: "truncate text-
|
|
1102
|
-
/* @__PURE__ */ jsx3("span", { className: "shrink-0 text-
|
|
990
|
+
/* @__PURE__ */ jsx3("span", { className: "truncate text-[color:var(--mova-ai-ink-secondary,#666)]", children: item.label }),
|
|
991
|
+
/* @__PURE__ */ jsx3("span", { className: "shrink-0 text-[color:var(--mova-ai-ink,#202020)] tabular-nums", children: formatTokens(item.tokens) })
|
|
1103
992
|
] }, item.label)) })
|
|
1104
993
|
}
|
|
1105
994
|
) : null })
|
|
@@ -1139,8 +1028,8 @@ function ScrubField({
|
|
|
1139
1028
|
{
|
|
1140
1029
|
className: "flex h-6.5 min-w-0 items-center gap-1 rounded-[6px] py-1 pr-1 pl-0.5\n transition-[background-color,box-shadow] duration-200",
|
|
1141
1030
|
style: {
|
|
1142
|
-
background: active ? "var(--accent-tint)" : "var(--field)",
|
|
1143
|
-
boxShadow: active ? "0 0 0 1px var(--accent)" : "none"
|
|
1031
|
+
background: active ? "var(--mova-ai-accent-tint,#eee)" : "var(--mova-ai-field,#f6f6f6)",
|
|
1032
|
+
boxShadow: active ? "0 0 0 1px var(--mova-ai-accent,#454545)" : "none"
|
|
1144
1033
|
},
|
|
1145
1034
|
children: [
|
|
1146
1035
|
/* @__PURE__ */ jsx4(
|
|
@@ -1173,7 +1062,7 @@ function ScrubField({
|
|
|
1173
1062
|
onChange(clamp2(value - step * mult));
|
|
1174
1063
|
}
|
|
1175
1064
|
},
|
|
1176
|
-
className: "flex h-full shrink-0 cursor-ew-resize touch-none items-center rounded-[4px]\n px-0.5 text-[12px] text-[var(--ink-
|
|
1065
|
+
className: "flex h-full shrink-0 cursor-ew-resize touch-none items-center rounded-[4px]\n px-0.5 text-[12px] text-[var(--mova-ai-ink-muted,#858585)] select-none hover:text-[var(--mova-ai-ink-secondary,#666)] focus-visible:text-[var(--mova-ai-accent-ink,#333)]\n focus-visible:outline-none",
|
|
1177
1066
|
children: label
|
|
1178
1067
|
}
|
|
1179
1068
|
),
|
|
@@ -1198,10 +1087,10 @@ function ScrubField({
|
|
|
1198
1087
|
}
|
|
1199
1088
|
},
|
|
1200
1089
|
"aria-label": `${label} value`,
|
|
1201
|
-
className: "min-w-0 flex-1 bg-transparent text-[12px] text-[var(--ink)] tabular-nums outline-none"
|
|
1090
|
+
className: "min-w-0 flex-1 bg-transparent text-[12px] text-[var(--mova-ai-ink,#202020)] tabular-nums outline-none"
|
|
1202
1091
|
}
|
|
1203
1092
|
),
|
|
1204
|
-
suffix && /* @__PURE__ */ jsx4("span", { className: "shrink-0 pr-0.5 text-[11.5px] text-[var(--ink-
|
|
1093
|
+
suffix && /* @__PURE__ */ jsx4("span", { className: "shrink-0 pr-0.5 text-[11.5px] text-[var(--mova-ai-ink-muted,#858585)]", children: suffix })
|
|
1205
1094
|
]
|
|
1206
1095
|
}
|
|
1207
1096
|
);
|
|
@@ -1275,13 +1164,13 @@ function FineTuneCard({
|
|
|
1275
1164
|
};
|
|
1276
1165
|
const changed = fields.some((f) => values[f.key] !== f.value);
|
|
1277
1166
|
const done = seg !== 0 || changed || typeValue !== text.placeholder;
|
|
1278
|
-
return /* @__PURE__ */ jsxs4("div", { className: "relative w-full max-w-60 rounded-[
|
|
1279
|
-
/* @__PURE__ */ jsxs4("div", { className: "primitive-card-bar flex items-center justify-between border-b border-[var(--
|
|
1280
|
-
/* @__PURE__ */ jsx4("span", { className: "text-[13px] font-medium text-[var(--ink)]", children: text.title }),
|
|
1167
|
+
return /* @__PURE__ */ jsxs4("div", { className: "relative w-full max-w-60 rounded-lg border border-[var(--mova-ai-border,#dedede)] bg-[var(--mova-ai-surface,#fff)] text-[color:var(--mova-ai-ink,#202020)] shadow-[var(--mova-ai-shadow-raised,none)]", children: [
|
|
1168
|
+
/* @__PURE__ */ jsxs4("div", { className: "primitive-card-bar flex items-center justify-between border-b border-[var(--mova-ai-border,#dedede)]", children: [
|
|
1169
|
+
/* @__PURE__ */ jsx4("span", { className: "text-[13px] font-medium text-[var(--mova-ai-ink,#202020)]", children: text.title }),
|
|
1281
1170
|
done ? /* @__PURE__ */ jsxs4(
|
|
1282
1171
|
"span",
|
|
1283
1172
|
{
|
|
1284
|
-
className: "flex items-center gap-1.5 text-[12px] font-medium text-[var(--
|
|
1173
|
+
className: "flex items-center gap-1.5 text-[12px] font-medium text-[var(--mova-ai-success,#28734d)]",
|
|
1285
1174
|
style: { animation: "mova-ai-fine-tune-card-pop-in 250ms cubic-bezier(0.23,1,0.32,1) both" },
|
|
1286
1175
|
children: [
|
|
1287
1176
|
/* @__PURE__ */ jsx4("svg", { width: "10", height: "10", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "3", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx4("path", { d: "M20 6L9 17l-5-5" }) }),
|
|
@@ -1289,13 +1178,13 @@ function FineTuneCard({
|
|
|
1289
1178
|
]
|
|
1290
1179
|
}
|
|
1291
1180
|
) : /* @__PURE__ */ jsxs4("span", { className: "flex items-center gap-1.5", children: [
|
|
1292
|
-
/* @__PURE__ */ jsx4("span", { className: "flex size-4.5 items-center justify-center rounded-[5px] border border-[var(--accent)]/30 bg-[var(--accent-tint)]", children: /* @__PURE__ */ jsx4("svg", { width: "9", height: "9", viewBox: "0 0 24 24", fill: "var(--accent)", children: /* @__PURE__ */ jsx4("path", { d: "M12 2l2.4 7.2L22 12l-7.6 2.8L12 22l-2.4-7.2L2 12l7.6-2.8z" }) }) }),
|
|
1181
|
+
/* @__PURE__ */ jsx4("span", { className: "flex size-4.5 items-center justify-center rounded-[5px] border border-[var(--mova-ai-accent,#454545)]/30 bg-[var(--mova-ai-accent-tint,#eee)]", children: /* @__PURE__ */ jsx4("svg", { width: "9", height: "9", viewBox: "0 0 24 24", fill: "var(--mova-ai-accent,#454545)", children: /* @__PURE__ */ jsx4("path", { d: "M12 2l2.4 7.2L22 12l-7.6 2.8L12 22l-2.4-7.2L2 12l7.6-2.8z" }) }) }),
|
|
1293
1182
|
/* @__PURE__ */ jsx4(
|
|
1294
1183
|
"span",
|
|
1295
1184
|
{
|
|
1296
1185
|
className: "bg-clip-text text-[12px] font-medium text-transparent",
|
|
1297
1186
|
style: {
|
|
1298
|
-
backgroundImage: "linear-gradient(90deg, var(--accent) 35%, var(--accent-ink) 50%, var(--accent) 65%)",
|
|
1187
|
+
backgroundImage: "linear-gradient(90deg, var(--mova-ai-accent,#454545) 35%, var(--mova-ai-accent-ink,#333) 50%, var(--mova-ai-accent,#454545) 65%)",
|
|
1299
1188
|
backgroundSize: "200% 100%",
|
|
1300
1189
|
animation: "mova-ai-fine-tune-card-shimmer-text 1.4s linear infinite"
|
|
1301
1190
|
},
|
|
@@ -1304,14 +1193,14 @@ function FineTuneCard({
|
|
|
1304
1193
|
)
|
|
1305
1194
|
] })
|
|
1306
1195
|
] }),
|
|
1307
|
-
/* @__PURE__ */ jsxs4("div", { className: "primitive-card-pad flex flex-col gap-2 border-b border-[var(--
|
|
1308
|
-
/* @__PURE__ */ jsx4("p", { className: "text-[12.5px] font-medium text-[var(--ink)]", children: text.layout }),
|
|
1309
|
-
/* @__PURE__ */ jsxs4("div", { className: "relative grid grid-cols-3 rounded-[8px] bg-[var(--field)] p-0.5", children: [
|
|
1196
|
+
/* @__PURE__ */ jsxs4("div", { className: "primitive-card-pad flex flex-col gap-2 border-b border-[var(--mova-ai-border,#dedede)]", children: [
|
|
1197
|
+
/* @__PURE__ */ jsx4("p", { className: "text-[12.5px] font-medium text-[var(--mova-ai-ink,#202020)]", children: text.layout }),
|
|
1198
|
+
/* @__PURE__ */ jsxs4("div", { className: "relative grid grid-cols-3 rounded-[8px] bg-[var(--mova-ai-field,#f6f6f6)] p-0.5", children: [
|
|
1310
1199
|
/* @__PURE__ */ jsx4(
|
|
1311
1200
|
"span",
|
|
1312
1201
|
{
|
|
1313
1202
|
"aria-hidden": true,
|
|
1314
|
-
className: "absolute inset-y-0.5 rounded-[6px] bg-[var(--surface)] shadow-[var(--shadow-btn)] transition-transform duration-300",
|
|
1203
|
+
className: "absolute inset-y-0.5 rounded-[6px] bg-[var(--mova-ai-surface,#fff)] shadow-[var(--mova-ai-shadow-btn,none)] transition-transform duration-300",
|
|
1315
1204
|
style: {
|
|
1316
1205
|
width: "calc((100% - 4px) / 3)",
|
|
1317
1206
|
left: 2,
|
|
@@ -1328,7 +1217,7 @@ function FineTuneCard({
|
|
|
1328
1217
|
"aria-pressed": i === seg,
|
|
1329
1218
|
onClick: () => selectSeg(i),
|
|
1330
1219
|
className: `relative z-10 flex h-6 items-center justify-center transition-colors duration-200
|
|
1331
|
-
${i === seg ? "text-[var(--accent)]" : "text-[var(--ink-
|
|
1220
|
+
${i === seg ? "text-[var(--mova-ai-accent,#454545)]" : "text-[var(--mova-ai-ink-muted,#858585)]"}`,
|
|
1332
1221
|
children: /* @__PURE__ */ jsx4(SegmentIcon, { kind: s })
|
|
1333
1222
|
},
|
|
1334
1223
|
s
|
|
@@ -1350,7 +1239,7 @@ function FineTuneCard({
|
|
|
1350
1239
|
)) }, ri))
|
|
1351
1240
|
] }),
|
|
1352
1241
|
/* @__PURE__ */ jsxs4("div", { className: "primitive-card-footer flex items-center justify-between", children: [
|
|
1353
|
-
/* @__PURE__ */ jsx4("span", { className: "text-[12px] text-[var(--ink-
|
|
1242
|
+
/* @__PURE__ */ jsx4("span", { className: "text-[12px] text-[var(--mova-ai-ink-muted,#858585)]", children: text.type }),
|
|
1354
1243
|
/* @__PURE__ */ jsxs4("div", { ref: menuRef, className: "relative -mr-0.5 w-30", onBlur: (event) => {
|
|
1355
1244
|
if (!event.currentTarget.contains(event.relatedTarget)) setMenuOpen(false);
|
|
1356
1245
|
}, onKeyDown: (event) => {
|
|
@@ -1374,10 +1263,10 @@ function FineTuneCard({
|
|
|
1374
1263
|
"aria-label": text.type,
|
|
1375
1264
|
"aria-expanded": menuOpen,
|
|
1376
1265
|
onClick: () => setMenuOpen((current) => !current),
|
|
1377
|
-
className: "flex h-6.5 w-full items-center justify-between rounded-[6px] bg-[var(--inset)] py-1 pr-1 pl-2\n shadow-[var(--shadow-hairline)] transition-shadow duration-200 focus-visible:outline-none",
|
|
1378
|
-
style: { boxShadow: menuOpen ? "0 0 0 1px var(--accent)" : void 0 },
|
|
1266
|
+
className: "flex h-6.5 w-full items-center justify-between rounded-[6px] bg-[var(--mova-ai-inset,#f8f8f8)] py-1 pr-1 pl-2\n shadow-[var(--mova-ai-shadow-hairline,none)] transition-shadow duration-200 focus-visible:outline-none",
|
|
1267
|
+
style: { boxShadow: menuOpen ? "0 0 0 1px var(--mova-ai-accent,#454545)" : void 0 },
|
|
1379
1268
|
children: [
|
|
1380
|
-
/* @__PURE__ */ jsx4("span", { className: `text-[12px] ${typeValue !== text.placeholder ? "text-[var(--ink)]" : "text-[var(--ink-
|
|
1269
|
+
/* @__PURE__ */ jsx4("span", { className: `text-[12px] ${typeValue !== text.placeholder ? "text-[var(--mova-ai-ink,#202020)]" : "text-[var(--mova-ai-ink-muted,#858585)]"}`, children: typeValue }),
|
|
1381
1270
|
/* @__PURE__ */ jsx4(
|
|
1382
1271
|
"svg",
|
|
1383
1272
|
{
|
|
@@ -1385,7 +1274,7 @@ function FineTuneCard({
|
|
|
1385
1274
|
height: "11",
|
|
1386
1275
|
viewBox: "0 0 24 24",
|
|
1387
1276
|
fill: "none",
|
|
1388
|
-
stroke: "var(--ink-
|
|
1277
|
+
stroke: "var(--mova-ai-ink-muted,#858585)",
|
|
1389
1278
|
strokeWidth: "2.5",
|
|
1390
1279
|
strokeLinecap: "round",
|
|
1391
1280
|
strokeLinejoin: "round",
|
|
@@ -1402,12 +1291,12 @@ function FineTuneCard({
|
|
|
1402
1291
|
{
|
|
1403
1292
|
role: "menu",
|
|
1404
1293
|
"aria-label": text.type,
|
|
1405
|
-
className: "absolute right-0 bottom-8 z-10 w-30 rounded-[10px] bg-[var(--surface)] p-1 shadow-[var(--shadow-raised)]",
|
|
1294
|
+
className: "absolute right-0 bottom-8 z-10 w-30 rounded-[10px] bg-[var(--mova-ai-surface,#fff)] p-1 shadow-[var(--mova-ai-shadow-raised,none)]",
|
|
1406
1295
|
style: {
|
|
1407
1296
|
animation: "mova-ai-fine-tune-card-pop-in 200ms cubic-bezier(0.23,1,0.32,1) both",
|
|
1408
1297
|
transformOrigin: "bottom right"
|
|
1409
1298
|
},
|
|
1410
|
-
children: /* @__PURE__ */ jsx4(GlideMenu2, { className: "flex flex-col gap-px", highlightClassName: "inset-x-0 rounded-[6px] bg-[var(--field)]", children: options.map((item) => /* @__PURE__ */ jsx4(
|
|
1299
|
+
children: /* @__PURE__ */ jsx4(GlideMenu2, { className: "flex flex-col gap-px", highlightClassName: "inset-x-0 rounded-[6px] bg-[var(--mova-ai-field,#f6f6f6)]", children: options.map((item) => /* @__PURE__ */ jsx4(
|
|
1411
1300
|
"button",
|
|
1412
1301
|
{
|
|
1413
1302
|
"data-menu-row": true,
|
|
@@ -1415,7 +1304,7 @@ function FineTuneCard({
|
|
|
1415
1304
|
"aria-checked": item === typeValue,
|
|
1416
1305
|
type: "button",
|
|
1417
1306
|
onClick: () => selectType(item),
|
|
1418
|
-
className: `relative z-10 flex h-6.5 w-full items-center rounded-[6px] px-2 text-left text-[12.5px] text-[var(--ink)] ${item === typeValue ? "bg-[var(--field)] group-hover/glide-menu:bg-transparent" : ""}`,
|
|
1307
|
+
className: `relative z-10 flex h-6.5 w-full items-center rounded-[6px] px-2 text-left text-[12.5px] text-[var(--mova-ai-ink,#202020)] ${item === typeValue ? "bg-[var(--mova-ai-field,#f6f6f6)] group-hover/glide-menu:bg-transparent" : ""}`,
|
|
1419
1308
|
children: item
|
|
1420
1309
|
},
|
|
1421
1310
|
item
|
|
@@ -1429,7 +1318,7 @@ function FineTuneCard({
|
|
|
1429
1318
|
function GlideMenu2({
|
|
1430
1319
|
children,
|
|
1431
1320
|
className = "",
|
|
1432
|
-
highlightClassName = "inset-x-0 rounded-[8px] bg-[var(--hover)]",
|
|
1321
|
+
highlightClassName = "inset-x-0 rounded-[8px] bg-[var(--mova-ai-hover,#f1f1f1)]",
|
|
1433
1322
|
rowSelector = "[data-menu-row]"
|
|
1434
1323
|
}) {
|
|
1435
1324
|
const ref = useRef3(null);
|
|
@@ -1475,221 +1364,30 @@ function GlideMenu2({
|
|
|
1475
1364
|
}
|
|
1476
1365
|
);
|
|
1477
1366
|
}
|
|
1478
|
-
var
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
--surface: oklch(1 0 0);
|
|
1482
|
-
--inset: oklch(0.979 0.002 247.839);
|
|
1483
|
-
--hover: oklch(0.97 0.002 247.839);
|
|
1484
|
-
--hover-2: oklch(0.933 0.003 247.86);
|
|
1485
|
-
|
|
1486
|
-
--ink: oklch(0.247 0.006 258.361);
|
|
1487
|
-
--ink-2: oklch(0.506 0.01 264.477);
|
|
1488
|
-
--ink-3: oklch(0.695 0.009 264.505);
|
|
1489
|
-
|
|
1490
|
-
--line: oklch(0.946 0.003 264.542);
|
|
1491
|
-
--line-strong: oklch(0.912 0.005 258.326);
|
|
1492
|
-
--line-soft: oklch(0.966 0.002 264.542);
|
|
1493
|
-
--grid-line: color-mix(in srgb, var(--line) 78%, transparent);
|
|
1494
|
-
--field: oklch(0.961 0.001 286.375);
|
|
1495
|
-
--stripe: oklch(0.405 0 0 / 0.075);
|
|
1496
|
-
--stripe-bg: oklch(0.97 0 0);
|
|
1497
|
-
|
|
1498
|
-
--accent: oklch(0.626 0.205 254.947);
|
|
1499
|
-
--accent-ink: oklch(0.556 0.187 255.617);
|
|
1500
|
-
--accent-tint: oklch(0.96 0.019 252.878);
|
|
1501
|
-
|
|
1502
|
-
--green: oklch(0.603 0.155 150.883);
|
|
1503
|
-
--green-tint: oklch(0.958 0.017 159.118);
|
|
1504
|
-
--orange: oklch(0.689 0.179 49.902);
|
|
1505
|
-
--orange-tint: oklch(0.964 0.021 67.581);
|
|
1506
|
-
--red: oklch(0.621 0.192 23.042);
|
|
1507
|
-
--red-tint: oklch(0.956 0.017 17.462);
|
|
1508
|
-
|
|
1509
|
-
--tooltip-bg: oklch(0.272 0.008 264.435);
|
|
1510
|
-
--tooltip-fg: oklch(0.976 0.002 247.839);
|
|
1511
|
-
--tooltip-muted: oklch(0.731 0.008 260.731);
|
|
1512
|
-
--tooltip-border: oklch(0.356 0.007 264.474);
|
|
1513
|
-
|
|
1514
|
-
--shadow-hairline: 0 0 0 1px var(--line);
|
|
1515
|
-
--shadow-btn: 0 0 0 1px var(--line-strong), var(--shadow-xs);
|
|
1516
|
-
--shadow-card: 0 0 0 1px var(--line), var(--shadow-sm);
|
|
1517
|
-
--shadow-raised: 0 0 0 1px var(--line), var(--shadow-md);
|
|
1518
|
-
--shadow-overlay: 0 0 0 1px var(--line), var(--shadow-lg);
|
|
1519
|
-
--shadow-inset-field: inset 0 1px 2px oklch(0 0 0 / 0.12);--shadow-xs: 0 0 4px 0 rgba(0, 0, 0, 0.04);--shadow-sm: 0 18px 47px 0 rgba(0, 0, 0, 0.03), 0 7.5px 19px 0 rgba(0, 0, 0, 0.02),
|
|
1520
|
-
0 4px 10.5px 0 rgba(0, 0, 0, 0.02), 0 2.3px 5.8px 0 rgba(0, 0, 0, 0.01),
|
|
1521
|
-
0 1.2px 3.1px 0 rgba(0, 0, 0, 0.01), 0 0.5px 1.3px 0 rgba(0, 0, 0, 0.01);--shadow-md: 0 17.54px 23.39px 0 rgba(0, 0, 0, 0.04), 0 9.4px 12.5px 0 rgba(0, 0, 0, 0.03),
|
|
1522
|
-
0 5.25px 7px 0 rgba(0, 0, 0, 0.02), 0 2.79px 3.72px -2px rgba(0, 0, 0, 0.01),
|
|
1523
|
-
0 1.16px 1.5px 0 rgba(0, 0, 0, 0.01);--radius-control:8px;
|
|
1524
|
-
width:100%;max-width:240px;min-width:0;font-family:Inter,ui-sans-serif,system-ui,sans-serif;font-size:14px;line-height:1.5;letter-spacing:-.01em;color:var(--ink);}
|
|
1525
|
-
.mova-ai-fine-tune-card[data-theme="dark"]{
|
|
1526
|
-
--page: oklch(0.209 0.004 264.477);
|
|
1527
|
-
--canvas: oklch(0.231 0.004 264.487);
|
|
1528
|
-
--surface: oklch(0.26 0.006 271.191);
|
|
1529
|
-
--inset: oklch(0.243 0.004 264.492);
|
|
1530
|
-
--hover: oklch(0.289 0.006 271.22);
|
|
1531
|
-
--hover-2: oklch(0.318 0.007 274.747);
|
|
1532
|
-
|
|
1533
|
-
--ink: oklch(0.964 0.002 247.839);
|
|
1534
|
-
--ink-2: oklch(0.731 0.008 260.731);
|
|
1535
|
-
--ink-3: oklch(0.541 0.01 264.484);
|
|
1536
|
-
|
|
1537
|
-
--line: oklch(0.308 0.006 258.354);
|
|
1538
|
-
--line-strong: oklch(0.356 0.007 264.474);
|
|
1539
|
-
--line-soft: oklch(0.278 0.006 258.354);
|
|
1540
|
-
--field: oklch(0.293 0.006 271.223);
|
|
1541
|
-
--stripe: oklch(1 0 0 / 0.055);
|
|
1542
|
-
--stripe-bg: oklch(0.226 0.004 264.485);
|
|
1543
|
-
|
|
1544
|
-
--accent: oklch(0.68 0.173 253.301);
|
|
1545
|
-
--accent-ink: oklch(0.788 0.113 248.33);
|
|
1546
|
-
--accent-tint: oklch(0.68 0.173 253.301 / 0.16);
|
|
1547
|
-
|
|
1548
|
-
--green: oklch(0.705 0.154 153.814);
|
|
1549
|
-
--green-tint: oklch(0.705 0.154 153.814 / 0.14);
|
|
1550
|
-
--orange: oklch(0.746 0.156 55.642);
|
|
1551
|
-
--orange-tint: oklch(0.746 0.156 55.642 / 0.14);
|
|
1552
|
-
--red: oklch(0.666 0.18 21.433);
|
|
1553
|
-
--red-tint: oklch(0.666 0.18 21.433 / 0.14);
|
|
1554
|
-
|
|
1555
|
-
--tooltip-bg: oklch(0.182 0.004 264.459);
|
|
1556
|
-
--tooltip-fg: oklch(0.964 0.002 247.839);
|
|
1557
|
-
--tooltip-muted: oklch(0.731 0.008 260.731);
|
|
1558
|
-
--tooltip-border: oklch(0.308 0.006 258.354);
|
|
1559
|
-
|
|
1560
|
-
--shadow-hairline: 0 0 0 1px var(--line);
|
|
1561
|
-
--shadow-btn: 0 0 0 1px oklch(1 0 0 / 0.1), 0 1px 2px oklch(0 0 0 / 0.3);
|
|
1562
|
-
--shadow-card:
|
|
1563
|
-
0 0 0 1px oklch(1 0 0 / 0.11), 0 1px 2px oklch(0 0 0 / 0.2),
|
|
1564
|
-
0 2px 6px oklch(0 0 0 / 0.2);
|
|
1565
|
-
--shadow-raised:
|
|
1566
|
-
0 0 0 1px oklch(1 0 0 / 0.13), 0 2px 10px oklch(0 0 0 / 0.22);
|
|
1567
|
-
--shadow-overlay:
|
|
1568
|
-
0 0 0 1px oklch(1 0 0 / 0.15), 0 8px 28px oklch(0 0 0 / 0.34);
|
|
1569
|
-
--shadow-inset-field: inset 0 1px 2px oklch(0 0 0 / 0.4);}
|
|
1570
|
-
.mova-ai-fine-tune-card .primitive-card-pad{padding:12px} .mova-ai-fine-tune-card .primitive-card-bar{padding:10px 12px} .mova-ai-fine-tune-card .primitive-card-footer{padding:10px} .mova-ai-fine-tune-card .primitive-icon-button{display:inline-flex;width:28px;height:28px;align-items:center;justify-content:center;border-radius:8px}
|
|
1571
|
-
.mova-ai-fine-tune-card :is(button,input,[tabindex]):focus-visible{outline:2px solid var(--accent)!important;outline-offset:2px} .mova-ai-fine-tune-card button:not(:disabled){cursor:pointer} .mova-ai-fine-tune-card code{overflow-wrap:anywhere} .mova-ai-fine-tune-card *, .mova-ai-fine-tune-card *::before,.mova-ai-fine-tune-card *::after{box-sizing:border-box}
|
|
1367
|
+
var AI_THEME_STYLES4 = '/* Shared public tokens for the standalone AI component family. */\n.mova-ai-theme {\n color-scheme: light;\n color: var(--mova-ai-ink, #202020);\n font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;\n font-size: 13px;\n line-height: 1.45;\n letter-spacing: -0.01em;\n\n --mova-ai-page: #f7f7f7;\n --mova-ai-canvas: #f4f4f4;\n --mova-ai-surface: #ffffff;\n --mova-ai-inset: #f8f8f8;\n --mova-ai-hover: #f1f1f1;\n --mova-ai-hover-strong: #e9e9e9;\n\n --mova-ai-ink: #202020;\n --mova-ai-ink-secondary: #666666;\n --mova-ai-ink-muted: #858585;\n\n --mova-ai-border: #dedede;\n --mova-ai-border-soft: #ededed;\n --mova-ai-border-strong: #c8c8c8;\n --mova-ai-field: #f6f6f6;\n --mova-ai-grid: color-mix(in srgb, var(--mova-ai-border) 78%, transparent);\n --mova-ai-stripe: rgb(32 35 38 / 7%);\n --mova-ai-stripe-bg: #242424;\n\n --mova-ai-accent: #454545;\n --mova-ai-accent-ink: #333333;\n --mova-ai-accent-foreground: #ffffff;\n --mova-ai-accent-tint: #eeeeee;\n --mova-ai-success: #28734d;\n --mova-ai-success-tint: #e8f3ec;\n --mova-ai-warning: #986517;\n --mova-ai-warning-tint: #f8f0df;\n --mova-ai-danger: #a33c3c;\n --mova-ai-danger-tint: #f7eaea;\n --mova-ai-info: #496b89;\n --mova-ai-info-tint: #eaf0f5;\n --mova-ai-neutral-status: #69737d;\n --mova-ai-status-on: #ffffff;\n\n --mova-ai-tooltip-bg: #292929;\n --mova-ai-tooltip-fg: #f6f6f6;\n --mova-ai-tooltip-muted: #c3c3c3;\n --mova-ai-tooltip-border: #484848;\n\n --mova-ai-radius-panel: 8px;\n --mova-ai-radius-control: 8px;\n --mova-ai-shadow-xs: 0 1px 2px rgb(22 28 33 / 5%);\n --mova-ai-shadow-sm: 0 2px 8px rgb(22 28 33 / 7%);\n --mova-ai-shadow-md: 0 8px 20px rgb(22 28 33 / 11%);\n --mova-ai-shadow-lg: 0 14px 32px rgb(22 28 33 / 15%);\n --mova-ai-shadow-hairline: 0 0 0 1px var(--mova-ai-border);\n --mova-ai-shadow-btn: 0 0 0 1px var(--mova-ai-border-strong), var(--mova-ai-shadow-xs);\n --mova-ai-shadow-card: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-sm);\n --mova-ai-shadow-raised: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-md);\n --mova-ai-shadow-overlay: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-lg);\n --mova-ai-shadow-inset-field: inset 0 1px 2px rgb(22 28 33 / 12%);\n}\n\n.mova-ai-theme[data-theme="dark"] {\n color-scheme: dark;\n --mova-ai-page: #181818;\n --mova-ai-canvas: #202020;\n --mova-ai-surface: #272727;\n --mova-ai-inset: #1d1d1d;\n --mova-ai-hover: #2d2d2d;\n --mova-ai-hover-strong: #393939;\n\n --mova-ai-ink: #eeeeee;\n --mova-ai-ink-secondary: #b5b5b5;\n --mova-ai-ink-muted: #929292;\n\n --mova-ai-border: #3b3b3b;\n --mova-ai-border-soft: #303030;\n --mova-ai-border-strong: #505050;\n --mova-ai-field: #2c2c2c;\n --mova-ai-grid: color-mix(in srgb, var(--mova-ai-border) 78%, transparent);\n --mova-ai-stripe: rgb(255 255 255 / 6%);\n --mova-ai-stripe-bg: #202528;\n\n --mova-ai-accent: #c2c2c2;\n --mova-ai-accent-ink: #d5d5d5;\n --mova-ai-accent-foreground: #202020;\n --mova-ai-accent-tint: #353535;\n --mova-ai-success: #88c7a0;\n --mova-ai-success-tint: #293b30;\n --mova-ai-warning: #d7b66f;\n --mova-ai-warning-tint: #3c3525;\n --mova-ai-danger: #e5928e;\n --mova-ai-danger-tint: #3c2b2b;\n --mova-ai-info: #9bbbd6;\n --mova-ai-info-tint: #293541;\n --mova-ai-neutral-status: #a0a0a0;\n --mova-ai-status-on: #181818;\n\n --mova-ai-tooltip-bg: #121212;\n --mova-ai-tooltip-fg: #eeeeee;\n --mova-ai-tooltip-muted: #b5b5b5;\n --mova-ai-tooltip-border: #3b3b3b;\n\n --mova-ai-shadow-xs: 0 1px 2px rgb(0 0 0 / 22%);\n --mova-ai-shadow-sm: 0 2px 8px rgb(0 0 0 / 25%);\n --mova-ai-shadow-md: 0 8px 20px rgb(0 0 0 / 30%);\n --mova-ai-shadow-lg: 0 14px 32px rgb(0 0 0 / 38%);\n --mova-ai-shadow-hairline: 0 0 0 1px var(--mova-ai-border);\n --mova-ai-shadow-btn: 0 0 0 1px var(--mova-ai-border-strong), var(--mova-ai-shadow-xs);\n --mova-ai-shadow-card: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-sm);\n --mova-ai-shadow-raised: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-md);\n --mova-ai-shadow-overlay: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-lg);\n --mova-ai-shadow-inset-field: inset 0 1px 2px rgb(0 0 0 / 42%);\n}\n';
|
|
1368
|
+
var scopedStyles3 = `.mova-ai-fine-tune-card .primitive-card-pad{padding:12px} .mova-ai-fine-tune-card .primitive-card-bar{padding:10px 12px} .mova-ai-fine-tune-card .primitive-card-footer{padding:10px} .mova-ai-fine-tune-card .primitive-icon-button{display:inline-flex;width:28px;height:28px;align-items:center;justify-content:center;border-radius:8px}
|
|
1369
|
+
.mova-ai-fine-tune-card :is(button,input,[tabindex]):focus-visible{outline:2px solid var(--mova-ai-accent,#454545)!important;outline-offset:2px} .mova-ai-fine-tune-card button:not(:disabled){cursor:pointer} .mova-ai-fine-tune-card code{overflow-wrap:anywhere} .mova-ai-fine-tune-card *, .mova-ai-fine-tune-card *::before,.mova-ai-fine-tune-card *::after{box-sizing:border-box}
|
|
1572
1370
|
@keyframes mova-ai-fine-tune-card-pop-in{from{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}
|
|
1573
1371
|
@keyframes mova-ai-fine-tune-card-fade-up{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}
|
|
1574
1372
|
@keyframes mova-ai-fine-tune-card-shimmer-text{from{background-position:150% center}to{background-position:-50% center}}
|
|
1575
1373
|
@media(prefers-reduced-motion:reduce){.mova-ai-fine-tune-card *, .mova-ai-fine-tune-card *::before, .mova-ai-fine-tune-card *::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}`;
|
|
1576
1374
|
function AIFineTuneCard({ theme = "light", ...props } = {}) {
|
|
1577
|
-
return /* @__PURE__ */ jsxs4("div", { className: "mova-ai-fine-tune-card", "data-theme": theme, children: [
|
|
1578
|
-
/* @__PURE__ */
|
|
1375
|
+
return /* @__PURE__ */ jsxs4("div", { className: "mova-ai-theme mova-ai-fine-tune-card", "data-theme": theme, children: [
|
|
1376
|
+
/* @__PURE__ */ jsxs4("style", { children: [
|
|
1377
|
+
AI_THEME_STYLES4,
|
|
1378
|
+
scopedStyles3
|
|
1379
|
+
] }),
|
|
1579
1380
|
/* @__PURE__ */ jsx4(FineTuneCard, { ...props })
|
|
1580
1381
|
] });
|
|
1581
1382
|
}
|
|
1582
1383
|
|
|
1583
1384
|
// .generated/ui/ai/ai-prompt-bar.tsx
|
|
1584
|
-
import { useEffect as useEffect7, useLayoutEffect as
|
|
1385
|
+
import { useEffect as useEffect7, useLayoutEffect as useLayoutEffect3, useRef as useRef4, useState as useState8, useId } from "react";
|
|
1585
1386
|
import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
1586
|
-
var
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
0 1.16px 1.5px 0 rgba(0, 0, 0, 0.01);--shadow-lg: 0 25px 50px 0 rgba(0, 0, 0, 0.05), 0 12px 24px 0 rgba(0, 0, 0, 0.04),
|
|
1591
|
-
0 6px 12px 0 rgba(0, 0, 0, 0.03), 0 3px 6px 0 rgba(0, 0, 0, 0.02),
|
|
1592
|
-
0 1.5px 3px 0 rgba(0, 0, 0, 0.02); font-family:Inter,ui-sans-serif,system-ui,sans-serif; font-size:14px;line-height:1.5;letter-spacing:-0.01em;color:var(--ink);
|
|
1593
|
-
/* surfaces \u2014 cool, blue-tinted neutrals */
|
|
1594
|
-
--page: oklch(0.985 0.001 286.376);
|
|
1595
|
-
--canvas: oklch(0.961 0.002 247.84);
|
|
1596
|
-
--surface: oklch(1 0 0);
|
|
1597
|
-
--inset: oklch(0.979 0.002 247.839);
|
|
1598
|
-
--hover: oklch(0.97 0.002 247.839);
|
|
1599
|
-
--hover-2: oklch(0.933 0.003 247.86);
|
|
1600
|
-
|
|
1601
|
-
/* ink ramp */
|
|
1602
|
-
--ink: oklch(0.247 0.006 258.361);
|
|
1603
|
-
--ink-2: oklch(0.506 0.01 264.477);
|
|
1604
|
-
--ink-3: oklch(0.695 0.009 264.505);
|
|
1605
|
-
|
|
1606
|
-
/* borders \u2014 solid and crisp, not alpha */
|
|
1607
|
-
--line: oklch(0.946 0.003 264.542);
|
|
1608
|
-
--line-strong: oklch(0.912 0.005 258.326);
|
|
1609
|
-
--line-soft: oklch(0.966 0.002 264.542);
|
|
1610
|
-
--grid-line: color-mix(in srgb, var(--line) 78%, transparent);
|
|
1611
|
-
--field: oklch(0.961 0.001 286.375);
|
|
1612
|
-
--stripe: oklch(0.405 0 0 / 0.075);
|
|
1613
|
-
--stripe-bg: oklch(0.97 0 0);
|
|
1614
|
-
|
|
1615
|
-
/* accent */
|
|
1616
|
-
--accent: oklch(0.626 0.205 254.947);
|
|
1617
|
-
--accent-ink: oklch(0.556 0.187 255.617);
|
|
1618
|
-
--accent-tint: oklch(0.96 0.019 252.878);
|
|
1619
|
-
|
|
1620
|
-
/* semantic */
|
|
1621
|
-
--green: oklch(0.603 0.155 150.883);
|
|
1622
|
-
--green-tint: oklch(0.958 0.017 159.118);
|
|
1623
|
-
--orange: oklch(0.689 0.179 49.902);
|
|
1624
|
-
--orange-tint: oklch(0.964 0.021 67.581);
|
|
1625
|
-
--red: oklch(0.621 0.192 23.042);
|
|
1626
|
-
--red-tint: oklch(0.956 0.017 17.462);
|
|
1627
|
-
|
|
1628
|
-
/* chart overlays \u2014 neutral system colors with enough contrast on either theme */
|
|
1629
|
-
--tooltip-bg: oklch(0.272 0.008 264.435);
|
|
1630
|
-
--tooltip-fg: oklch(0.976 0.002 247.839);
|
|
1631
|
-
--tooltip-muted: oklch(0.731 0.008 260.731);
|
|
1632
|
-
--tooltip-border: oklch(0.356 0.007 264.474);
|
|
1633
|
-
|
|
1634
|
-
/* shadows \u2014 our solid hairline ring + shadow-plugin's smooth layered stacks
|
|
1635
|
-
* (--shadow-xs\u2026lg come from shadow-plugin/unprefixed) so every surface reads
|
|
1636
|
-
* consistently across the app. */
|
|
1637
|
-
--shadow-hairline: 0 0 0 1px var(--line);
|
|
1638
|
-
--shadow-btn: 0 0 0 1px var(--line-strong), var(--shadow-xs);
|
|
1639
|
-
--shadow-card: 0 0 0 1px var(--line), var(--shadow-sm);
|
|
1640
|
-
--shadow-raised: 0 0 0 1px var(--line), var(--shadow-md);
|
|
1641
|
-
--shadow-overlay: 0 0 0 1px var(--line), var(--shadow-lg);
|
|
1642
|
-
--shadow-inset-field: inset 0 1px 2px oklch(0 0 0 / 0.12);}
|
|
1643
|
-
[data-mova-prompt][data-theme="dark"] {
|
|
1644
|
-
--page: oklch(0.209 0.004 264.477);
|
|
1645
|
-
--canvas: oklch(0.231 0.004 264.487);
|
|
1646
|
-
--surface: oklch(0.26 0.006 271.191);
|
|
1647
|
-
--inset: oklch(0.243 0.004 264.492);
|
|
1648
|
-
--hover: oklch(0.289 0.006 271.22);
|
|
1649
|
-
--hover-2: oklch(0.318 0.007 274.747);
|
|
1650
|
-
|
|
1651
|
-
--ink: oklch(0.964 0.002 247.839);
|
|
1652
|
-
--ink-2: oklch(0.731 0.008 260.731);
|
|
1653
|
-
--ink-3: oklch(0.541 0.01 264.484);
|
|
1654
|
-
|
|
1655
|
-
--line: oklch(0.308 0.006 258.354);
|
|
1656
|
-
--line-strong: oklch(0.356 0.007 264.474);
|
|
1657
|
-
--line-soft: oklch(0.278 0.006 258.354);
|
|
1658
|
-
--field: oklch(0.293 0.006 271.223);
|
|
1659
|
-
--stripe: oklch(1 0 0 / 0.055);
|
|
1660
|
-
--stripe-bg: oklch(0.226 0.004 264.485);
|
|
1661
|
-
|
|
1662
|
-
--accent: oklch(0.68 0.173 253.301);
|
|
1663
|
-
--accent-ink: oklch(0.788 0.113 248.33);
|
|
1664
|
-
--accent-tint: oklch(0.68 0.173 253.301 / 0.16);
|
|
1665
|
-
|
|
1666
|
-
--green: oklch(0.705 0.154 153.814);
|
|
1667
|
-
--green-tint: oklch(0.705 0.154 153.814 / 0.14);
|
|
1668
|
-
--orange: oklch(0.746 0.156 55.642);
|
|
1669
|
-
--orange-tint: oklch(0.746 0.156 55.642 / 0.14);
|
|
1670
|
-
--red: oklch(0.666 0.18 21.433);
|
|
1671
|
-
--red-tint: oklch(0.666 0.18 21.433 / 0.14);
|
|
1672
|
-
|
|
1673
|
-
--tooltip-bg: oklch(0.182 0.004 264.459);
|
|
1674
|
-
--tooltip-fg: oklch(0.964 0.002 247.839);
|
|
1675
|
-
--tooltip-muted: oklch(0.731 0.008 260.731);
|
|
1676
|
-
--tooltip-border: oklch(0.308 0.006 258.354);
|
|
1677
|
-
|
|
1678
|
-
--shadow-hairline: 0 0 0 1px var(--line);
|
|
1679
|
-
/* Elevation rings go to a subtle *light* hairline in dark mode: the ring
|
|
1680
|
-
* paints over the surface behind the element, so a low-alpha white edge
|
|
1681
|
-
* dissolves into the shadow as one continuous stroke (per smooth-shadow-ring),
|
|
1682
|
-
* graduated by how far the surface floats. */
|
|
1683
|
-
--shadow-btn: 0 0 0 1px oklch(1 0 0 / 0.1), 0 1px 2px oklch(0 0 0 / 0.3);
|
|
1684
|
-
--shadow-card:
|
|
1685
|
-
0 0 0 1px oklch(1 0 0 / 0.11), 0 1px 2px oklch(0 0 0 / 0.2),
|
|
1686
|
-
0 2px 6px oklch(0 0 0 / 0.2);
|
|
1687
|
-
--shadow-raised:
|
|
1688
|
-
0 0 0 1px oklch(1 0 0 / 0.13), 0 2px 10px oklch(0 0 0 / 0.22);
|
|
1689
|
-
--shadow-overlay:
|
|
1690
|
-
0 0 0 1px oklch(1 0 0 / 0.15), 0 8px 28px oklch(0 0 0 / 0.34);
|
|
1691
|
-
--shadow-inset-field: inset 0 1px 2px oklch(0 0 0 / 0.4);}
|
|
1692
|
-
[data-mova-prompt] :is(button,input,textarea):focus-visible { outline:2px solid var(--accent);outline-offset:2px; }
|
|
1387
|
+
var AI_THEME_STYLES5 = '/* Shared public tokens for the standalone AI component family. */\n.mova-ai-theme {\n color-scheme: light;\n color: var(--mova-ai-ink, #202020);\n font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;\n font-size: 13px;\n line-height: 1.45;\n letter-spacing: -0.01em;\n\n --mova-ai-page: #f7f7f7;\n --mova-ai-canvas: #f4f4f4;\n --mova-ai-surface: #ffffff;\n --mova-ai-inset: #f8f8f8;\n --mova-ai-hover: #f1f1f1;\n --mova-ai-hover-strong: #e9e9e9;\n\n --mova-ai-ink: #202020;\n --mova-ai-ink-secondary: #666666;\n --mova-ai-ink-muted: #858585;\n\n --mova-ai-border: #dedede;\n --mova-ai-border-soft: #ededed;\n --mova-ai-border-strong: #c8c8c8;\n --mova-ai-field: #f6f6f6;\n --mova-ai-grid: color-mix(in srgb, var(--mova-ai-border) 78%, transparent);\n --mova-ai-stripe: rgb(32 35 38 / 7%);\n --mova-ai-stripe-bg: #242424;\n\n --mova-ai-accent: #454545;\n --mova-ai-accent-ink: #333333;\n --mova-ai-accent-foreground: #ffffff;\n --mova-ai-accent-tint: #eeeeee;\n --mova-ai-success: #28734d;\n --mova-ai-success-tint: #e8f3ec;\n --mova-ai-warning: #986517;\n --mova-ai-warning-tint: #f8f0df;\n --mova-ai-danger: #a33c3c;\n --mova-ai-danger-tint: #f7eaea;\n --mova-ai-info: #496b89;\n --mova-ai-info-tint: #eaf0f5;\n --mova-ai-neutral-status: #69737d;\n --mova-ai-status-on: #ffffff;\n\n --mova-ai-tooltip-bg: #292929;\n --mova-ai-tooltip-fg: #f6f6f6;\n --mova-ai-tooltip-muted: #c3c3c3;\n --mova-ai-tooltip-border: #484848;\n\n --mova-ai-radius-panel: 8px;\n --mova-ai-radius-control: 8px;\n --mova-ai-shadow-xs: 0 1px 2px rgb(22 28 33 / 5%);\n --mova-ai-shadow-sm: 0 2px 8px rgb(22 28 33 / 7%);\n --mova-ai-shadow-md: 0 8px 20px rgb(22 28 33 / 11%);\n --mova-ai-shadow-lg: 0 14px 32px rgb(22 28 33 / 15%);\n --mova-ai-shadow-hairline: 0 0 0 1px var(--mova-ai-border);\n --mova-ai-shadow-btn: 0 0 0 1px var(--mova-ai-border-strong), var(--mova-ai-shadow-xs);\n --mova-ai-shadow-card: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-sm);\n --mova-ai-shadow-raised: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-md);\n --mova-ai-shadow-overlay: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-lg);\n --mova-ai-shadow-inset-field: inset 0 1px 2px rgb(22 28 33 / 12%);\n}\n\n.mova-ai-theme[data-theme="dark"] {\n color-scheme: dark;\n --mova-ai-page: #181818;\n --mova-ai-canvas: #202020;\n --mova-ai-surface: #272727;\n --mova-ai-inset: #1d1d1d;\n --mova-ai-hover: #2d2d2d;\n --mova-ai-hover-strong: #393939;\n\n --mova-ai-ink: #eeeeee;\n --mova-ai-ink-secondary: #b5b5b5;\n --mova-ai-ink-muted: #929292;\n\n --mova-ai-border: #3b3b3b;\n --mova-ai-border-soft: #303030;\n --mova-ai-border-strong: #505050;\n --mova-ai-field: #2c2c2c;\n --mova-ai-grid: color-mix(in srgb, var(--mova-ai-border) 78%, transparent);\n --mova-ai-stripe: rgb(255 255 255 / 6%);\n --mova-ai-stripe-bg: #202528;\n\n --mova-ai-accent: #c2c2c2;\n --mova-ai-accent-ink: #d5d5d5;\n --mova-ai-accent-foreground: #202020;\n --mova-ai-accent-tint: #353535;\n --mova-ai-success: #88c7a0;\n --mova-ai-success-tint: #293b30;\n --mova-ai-warning: #d7b66f;\n --mova-ai-warning-tint: #3c3525;\n --mova-ai-danger: #e5928e;\n --mova-ai-danger-tint: #3c2b2b;\n --mova-ai-info: #9bbbd6;\n --mova-ai-info-tint: #293541;\n --mova-ai-neutral-status: #a0a0a0;\n --mova-ai-status-on: #181818;\n\n --mova-ai-tooltip-bg: #121212;\n --mova-ai-tooltip-fg: #eeeeee;\n --mova-ai-tooltip-muted: #b5b5b5;\n --mova-ai-tooltip-border: #3b3b3b;\n\n --mova-ai-shadow-xs: 0 1px 2px rgb(0 0 0 / 22%);\n --mova-ai-shadow-sm: 0 2px 8px rgb(0 0 0 / 25%);\n --mova-ai-shadow-md: 0 8px 20px rgb(0 0 0 / 30%);\n --mova-ai-shadow-lg: 0 14px 32px rgb(0 0 0 / 38%);\n --mova-ai-shadow-hairline: 0 0 0 1px var(--mova-ai-border);\n --mova-ai-shadow-btn: 0 0 0 1px var(--mova-ai-border-strong), var(--mova-ai-shadow-xs);\n --mova-ai-shadow-card: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-sm);\n --mova-ai-shadow-raised: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-md);\n --mova-ai-shadow-overlay: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-lg);\n --mova-ai-shadow-inset-field: inset 0 1px 2px rgb(0 0 0 / 42%);\n}\n';
|
|
1388
|
+
var COMPONENT_STYLES = `[data-mova-prompt] button:focus-visible { outline:2px solid var(--mova-ai-accent,#454545);outline-offset:2px; }
|
|
1389
|
+
[data-mova-prompt] :is(input,textarea):focus-visible { outline:none; }
|
|
1390
|
+
[data-mova-prompt] .prompt-composer:focus-within { outline:2px solid var(--mova-ai-accent,#454545);outline-offset:2px; }
|
|
1693
1391
|
[data-mova-prompt] button { cursor:pointer; } [data-mova-prompt] button:disabled { cursor:default; }
|
|
1694
1392
|
|
|
1695
1393
|
@keyframes mova-prompt-pop {from {opacity:0;transform:scale(.95)} to {opacity:1;transform:scale(1)}}
|
|
@@ -1842,17 +1540,17 @@ function AIPromptBar({
|
|
|
1842
1540
|
setActive(0);
|
|
1843
1541
|
setEngaged(false);
|
|
1844
1542
|
}, [menu, query]);
|
|
1845
|
-
|
|
1543
|
+
useLayoutEffect3(() => {
|
|
1846
1544
|
const target = rowRefs.current[active];
|
|
1847
1545
|
if (target) setRowBox({ top: target.offsetTop, height: target.offsetHeight });
|
|
1848
1546
|
}, [menu, query, active, connected, rows.length]);
|
|
1849
1547
|
const modelIndex = MODELS.findIndex((m) => m.key === model.key);
|
|
1850
|
-
|
|
1548
|
+
useLayoutEffect3(() => {
|
|
1851
1549
|
if (!modelOpen) return;
|
|
1852
1550
|
const target = modelRowRefs.current[modelHovered ?? modelIndex];
|
|
1853
1551
|
if (target) setModelBox({ top: target.offsetTop, height: target.offsetHeight });
|
|
1854
1552
|
}, [modelOpen, modelHovered, modelIndex]);
|
|
1855
|
-
|
|
1553
|
+
useLayoutEffect3(() => {
|
|
1856
1554
|
if (!modelOpen || !composerAnchorRef.current || !modelRef.current) return;
|
|
1857
1555
|
const reposition = () => {
|
|
1858
1556
|
const anchorRect = composerAnchorRef.current?.getBoundingClientRect();
|
|
@@ -2021,7 +1719,7 @@ function AIPromptBar({
|
|
|
2021
1719
|
setFeedback("Dictation is unavailable right now.");
|
|
2022
1720
|
}
|
|
2023
1721
|
};
|
|
2024
|
-
|
|
1722
|
+
useLayoutEffect3(() => {
|
|
2025
1723
|
const input = inputRef.current;
|
|
2026
1724
|
const controls = controlsRef.current;
|
|
2027
1725
|
const measure = measureRef.current;
|
|
@@ -2097,7 +1795,7 @@ function AIPromptBar({
|
|
|
2097
1795
|
"data-mova-prompt": true,
|
|
2098
1796
|
"data-theme": theme,
|
|
2099
1797
|
"data-promptbar": true,
|
|
2100
|
-
className:
|
|
1798
|
+
className: `mova-ai-theme ${demo ? "flex min-h-[384px] w-full max-w-[420px] flex-col justify-end pb-8" : "w-full"} ${className}`,
|
|
2101
1799
|
onPointerDownCapture: takeOver,
|
|
2102
1800
|
onKeyDownCapture: (event) => {
|
|
2103
1801
|
takeOver(event);
|
|
@@ -2109,7 +1807,10 @@ function AIPromptBar({
|
|
|
2109
1807
|
}
|
|
2110
1808
|
},
|
|
2111
1809
|
children: [
|
|
2112
|
-
/* @__PURE__ */
|
|
1810
|
+
/* @__PURE__ */ jsxs5("style", { children: [
|
|
1811
|
+
AI_THEME_STYLES5,
|
|
1812
|
+
COMPONENT_STYLES
|
|
1813
|
+
] }),
|
|
2113
1814
|
/* @__PURE__ */ jsx5("input", { ref: fileRef, type: "file", multiple: true, className: "hidden", "aria-label": "Attach files", onChange: (event) => {
|
|
2114
1815
|
const files = Array.from(event.target.files ?? []);
|
|
2115
1816
|
setAttachments((current) => [...current, ...files]);
|
|
@@ -2125,14 +1826,14 @@ function AIPromptBar({
|
|
|
2125
1826
|
role: "listbox",
|
|
2126
1827
|
"aria-label": "Sources and commands",
|
|
2127
1828
|
onMouseLeave: () => setEngaged(false),
|
|
2128
|
-
className: "absolute inset-x-0 bottom-full z-10 mb-2 max-h-[min(320px,60dvh)] overflow-y-auto rounded-[10px] bg-[var(--surface)] p-1 shadow-[var(--shadow-raised)]",
|
|
1829
|
+
className: "absolute inset-x-0 bottom-full z-10 mb-2 max-h-[min(320px,60dvh)] overflow-y-auto rounded-[10px] bg-[var(--mova-ai-surface,#fff)] p-1 shadow-[var(--mova-ai-shadow-raised,none)]",
|
|
2129
1830
|
style: { animation: "mova-prompt-pop 180ms cubic-bezier(0.23,1,0.32,1) both", transformOrigin: "bottom center" },
|
|
2130
1831
|
children: [
|
|
2131
1832
|
/* @__PURE__ */ jsx5(
|
|
2132
1833
|
"span",
|
|
2133
1834
|
{
|
|
2134
1835
|
"aria-hidden": true,
|
|
2135
|
-
className: "pointer-events-none absolute inset-x-1 rounded-[6px] bg-[var(--hover)]",
|
|
1836
|
+
className: "pointer-events-none absolute inset-x-1 rounded-[6px] bg-[var(--mova-ai-hover,#f1f1f1)]",
|
|
2136
1837
|
style: {
|
|
2137
1838
|
top: rowBox?.top ?? 0,
|
|
2138
1839
|
height: rowBox?.height ?? 0,
|
|
@@ -2165,13 +1866,13 @@ function AIPromptBar({
|
|
|
2165
1866
|
onClick: () => pick(row),
|
|
2166
1867
|
className: "relative z-10 flex h-9 w-full items-center gap-2.5 rounded-[6px] px-2 text-left",
|
|
2167
1868
|
children: [
|
|
2168
|
-
source && /* @__PURE__ */ jsx5("span", { className: "flex size-5.5 shrink-0 items-center justify-center text-[var(--ink-
|
|
2169
|
-
/* @__PURE__ */ jsx5("span", { className: "shrink-0 text-[12.5px] font-medium text-[var(--ink)]", children: row.name }),
|
|
2170
|
-
/* @__PURE__ */ jsx5("span", { className: "min-w-0 flex-1 truncate text-[12px] text-[var(--ink-
|
|
1869
|
+
source && /* @__PURE__ */ jsx5("span", { className: "flex size-5.5 shrink-0 items-center justify-center text-[var(--mova-ai-ink-secondary,#666)]", children: source.brand ? BRANDS[source.brand] : /* @__PURE__ */ jsx5(Icon, { size: 15, children: GLYPHS[source.glyph ?? "clip"] }) }),
|
|
1870
|
+
/* @__PURE__ */ jsx5("span", { className: "shrink-0 text-[12.5px] font-medium text-[var(--mova-ai-ink,#202020)]", children: row.name }),
|
|
1871
|
+
/* @__PURE__ */ jsx5("span", { className: "min-w-0 flex-1 truncate text-[12px] text-[var(--mova-ai-ink-muted,#858585)]", children: row.desc }),
|
|
2171
1872
|
source?.connect && /* @__PURE__ */ jsx5(
|
|
2172
1873
|
"span",
|
|
2173
1874
|
{
|
|
2174
|
-
className: `shrink-0 text-[12px] font-medium transition-colors duration-100 ${connected ? "text-[var(--
|
|
1875
|
+
className: `shrink-0 text-[12px] font-medium transition-colors duration-100 ${connected ? "text-[var(--mova-ai-success,#28734d)]" : "text-[var(--mova-ai-accent-ink,#333)] hover:underline"}`,
|
|
2175
1876
|
children: connected ? "Connected" : "Connect"
|
|
2176
1877
|
}
|
|
2177
1878
|
)
|
|
@@ -2180,12 +1881,12 @@ function AIPromptBar({
|
|
|
2180
1881
|
row.key
|
|
2181
1882
|
);
|
|
2182
1883
|
}),
|
|
2183
|
-
rows.length === 0 && /* @__PURE__ */ jsxs5("div", { className: "flex h-9 items-center px-2 text-[12px] text-[var(--ink-
|
|
1884
|
+
rows.length === 0 && /* @__PURE__ */ jsxs5("div", { className: "flex h-9 items-center px-2 text-[12px] text-[var(--mova-ai-ink-muted,#858585)]", children: [
|
|
2184
1885
|
"No matches for \u201C",
|
|
2185
1886
|
query,
|
|
2186
1887
|
"\u201D"
|
|
2187
1888
|
] }),
|
|
2188
|
-
/* @__PURE__ */ jsx5("div", { className: "mt-1 border-t border-[var(--
|
|
1889
|
+
/* @__PURE__ */ jsx5("div", { className: "mt-1 border-t border-[var(--mova-ai-border,#dedede)] px-2 pt-1.5 pb-1 text-[11px] text-[var(--mova-ai-ink-muted,#858585)]", children: menu === "at" ? "Type to search sources & files" : "Type to search commands" })
|
|
2189
1890
|
]
|
|
2190
1891
|
}
|
|
2191
1892
|
),
|
|
@@ -2204,14 +1905,14 @@ function AIPromptBar({
|
|
|
2204
1905
|
}
|
|
2205
1906
|
},
|
|
2206
1907
|
onMouseLeave: () => setModelHovered(null),
|
|
2207
|
-
className: "absolute z-10 w-52 max-w-full rounded-[10px] bg-[var(--surface)] p-1 shadow-[var(--shadow-raised)]",
|
|
1908
|
+
className: "absolute z-10 w-52 max-w-full rounded-[10px] bg-[var(--mova-ai-surface,#fff)] p-1 shadow-[var(--mova-ai-shadow-raised,none)]",
|
|
2208
1909
|
style: { left: modelMenuLeft, bottom: modelMenuBottom, animation: "mova-prompt-pop 180ms cubic-bezier(0.23,1,0.32,1) both", transformOrigin: "bottom left" },
|
|
2209
1910
|
children: [
|
|
2210
1911
|
/* @__PURE__ */ jsx5(
|
|
2211
1912
|
"span",
|
|
2212
1913
|
{
|
|
2213
1914
|
"aria-hidden": true,
|
|
2214
|
-
className: "pointer-events-none absolute inset-x-1 rounded-[6px] bg-[var(--hover)]",
|
|
1915
|
+
className: "pointer-events-none absolute inset-x-1 rounded-[6px] bg-[var(--mova-ai-hover,#f1f1f1)]",
|
|
2215
1916
|
style: {
|
|
2216
1917
|
top: modelBox?.top ?? 0,
|
|
2217
1918
|
height: modelBox?.height ?? 0,
|
|
@@ -2236,9 +1937,9 @@ function AIPromptBar({
|
|
|
2236
1937
|
},
|
|
2237
1938
|
className: "relative z-10 flex h-7.5 w-full items-center gap-2 rounded-[6px] px-2 text-left",
|
|
2238
1939
|
children: [
|
|
2239
|
-
/* @__PURE__ */ jsx5("span", { className: "min-w-0 flex-1 truncate text-[12.5px] font-medium text-[var(--ink)]", children: m.name }),
|
|
2240
|
-
/* @__PURE__ */ jsx5("span", { className: "shrink-0 text-[11px] text-[var(--ink-
|
|
2241
|
-
/* @__PURE__ */ jsx5("span", { className: `shrink-0 text-[var(--ink)] ${m.key === model.key ? "" : "invisible"}`, children: /* @__PURE__ */ jsx5(Icon, { size: 13, strokeWidth: 2.5, children: /* @__PURE__ */ jsx5("path", { d: "M20 6L9 17l-5-5" }) }) })
|
|
1940
|
+
/* @__PURE__ */ jsx5("span", { className: "min-w-0 flex-1 truncate text-[12.5px] font-medium text-[var(--mova-ai-ink,#202020)]", children: m.name }),
|
|
1941
|
+
/* @__PURE__ */ jsx5("span", { className: "shrink-0 text-[11px] text-[var(--mova-ai-ink-muted,#858585)]", children: m.tag }),
|
|
1942
|
+
/* @__PURE__ */ jsx5("span", { className: `shrink-0 text-[var(--mova-ai-ink,#202020)] ${m.key === model.key ? "" : "invisible"}`, children: /* @__PURE__ */ jsx5(Icon, { size: 13, strokeWidth: 2.5, children: /* @__PURE__ */ jsx5("path", { d: "M20 6L9 17l-5-5" }) }) })
|
|
2242
1943
|
]
|
|
2243
1944
|
},
|
|
2244
1945
|
m.key
|
|
@@ -2249,7 +1950,7 @@ function AIPromptBar({
|
|
|
2249
1950
|
/* @__PURE__ */ jsxs5(
|
|
2250
1951
|
"div",
|
|
2251
1952
|
{
|
|
2252
|
-
className: `relative isolate flex flex-col overflow-hidden border border-[var(--
|
|
1953
|
+
className: `prompt-composer relative isolate flex flex-col overflow-hidden border border-[var(--mova-ai-border,#dedede)] bg-[var(--mova-ai-surface,#fff)] shadow-[var(--mova-ai-shadow-card,none)] transition-[border-color,border-radius] duration-150 focus-within:border-[var(--mova-ai-border-strong,#c8c8c8)] ${tall ? "gap-2.5 p-3.5" : "gap-1.5 p-1.5"} ${pill ? attachments.length > 0 || wide ? "rounded-[24px]" : "rounded-full" : tall ? "rounded-[22px]" : "rounded-[14px]"}`,
|
|
2253
1954
|
children: [
|
|
2254
1955
|
/* @__PURE__ */ jsx5(
|
|
2255
1956
|
"canvas",
|
|
@@ -2272,7 +1973,7 @@ function AIPromptBar({
|
|
|
2272
1973
|
attachments.length > 0 && /* @__PURE__ */ jsx5("div", { className: `flex flex-wrap gap-1.5 pt-0.5 ${pill ? "px-1" : "px-0.5"}`, children: attachments.map((file, i) => /* @__PURE__ */ jsxs5(
|
|
2273
1974
|
"span",
|
|
2274
1975
|
{
|
|
2275
|
-
className: `flex h-6.5 items-center gap-1.5 bg-[var(--field)] py-1 pr-1 pl-1.5 text-[11.5px] text-[var(--ink-
|
|
1976
|
+
className: `flex h-6.5 items-center gap-1.5 bg-[var(--mova-ai-field,#f6f6f6)] py-1 pr-1 pl-1.5 text-[11.5px] text-[var(--mova-ai-ink-secondary,#666)] shadow-[var(--mova-ai-shadow-hairline,none)] ${pill ? "rounded-full" : "rounded-[6px]"}`,
|
|
2276
1977
|
style: { animation: "mova-prompt-pop 200ms cubic-bezier(0.23,1,0.32,1) both" },
|
|
2277
1978
|
children: [
|
|
2278
1979
|
/* @__PURE__ */ jsx5(Icon, { size: 12, children: /* @__PURE__ */ jsxs5("g", { children: [
|
|
@@ -2286,7 +1987,7 @@ function AIPromptBar({
|
|
|
2286
1987
|
type: "button",
|
|
2287
1988
|
"aria-label": `Remove ${file.name}`,
|
|
2288
1989
|
onClick: () => setAttachments((current) => current.filter((_, j) => j !== i)),
|
|
2289
|
-
className: `-my-1 flex size-6 items-center justify-center text-[var(--ink-
|
|
1990
|
+
className: `-my-1 flex size-6 items-center justify-center text-[var(--mova-ai-ink-muted,#858585)] transition-colors duration-100 hover:bg-[color-mix(in_srgb,var(--mova-ai-border,#dedede)_70%,transparent)] hover:text-[var(--mova-ai-ink,#202020)] ${pill ? "rounded-full" : "rounded-[5px]"}`,
|
|
2290
1991
|
children: /* @__PURE__ */ jsx5(Icon, { size: 10, strokeWidth: 2.5, children: /* @__PURE__ */ jsx5("path", { d: "M18 6L6 18M6 6l12 12" }) })
|
|
2291
1992
|
}
|
|
2292
1993
|
)
|
|
@@ -2311,7 +2012,7 @@ function AIPromptBar({
|
|
|
2311
2012
|
setPlusOpen((current) => !current);
|
|
2312
2013
|
inputRef.current?.focus();
|
|
2313
2014
|
},
|
|
2314
|
-
className: `flex size-7 shrink-0 items-center justify-center justify-self-start text-[var(--ink-
|
|
2015
|
+
className: `flex size-7 shrink-0 items-center justify-center justify-self-start text-[var(--mova-ai-ink-muted,#858585)] transition-[background-color,color,transform] duration-150 hover:bg-[var(--mova-ai-hover,#f1f1f1)] hover:text-[var(--mova-ai-ink,#202020)] active:scale-[0.94] ${pill ? "rounded-full" : "rounded-[8px]"} ${plusOpen ? "bg-[var(--mova-ai-hover,#f1f1f1)] text-[var(--mova-ai-ink,#202020)]" : ""} ${wide ? "col-start-1 row-start-2" : "col-start-1 row-start-1"}`,
|
|
2315
2016
|
children: /* @__PURE__ */ jsx5(Icon, { size: 16, strokeWidth: 2, children: /* @__PURE__ */ jsx5("path", { d: "M12 5v14M5 12h14" }) })
|
|
2316
2017
|
}
|
|
2317
2018
|
),
|
|
@@ -2356,7 +2057,7 @@ function AIPromptBar({
|
|
|
2356
2057
|
"aria-expanded": !!menu,
|
|
2357
2058
|
"aria-controls": menu ? sourceMenuId : void 0,
|
|
2358
2059
|
"aria-activedescendant": menu && rows[active] ? `${sourceMenuId}-${active}` : void 0,
|
|
2359
|
-
className: `${tall ? "min-h-[68px] px-2 py-2 text-[14px] leading-5" : "min-h-7 px-1 py-[5px] text-[13px] leading-[18px]"} min-w-0 w-full resize-none bg-transparent text-[var(--ink)] outline-none [overflow-wrap:anywhere] placeholder:text-[var(--ink-
|
|
2060
|
+
className: `${tall ? "min-h-[68px] px-2 py-2 text-[14px] leading-5" : "min-h-7 px-1 py-[5px] text-[13px] leading-[18px]"} min-w-0 w-full resize-none bg-transparent text-[var(--mova-ai-ink,#202020)] outline-none [overflow-wrap:anywhere] placeholder:text-[var(--mova-ai-ink-muted,#858585)] ${wide ? "col-span-full col-start-1 row-start-1" : "col-start-2 row-start-1"}`
|
|
2360
2061
|
}
|
|
2361
2062
|
),
|
|
2362
2063
|
/* @__PURE__ */ jsxs5(
|
|
@@ -2381,10 +2082,10 @@ function AIPromptBar({
|
|
|
2381
2082
|
setDismissed(true);
|
|
2382
2083
|
setModelOpen((current) => !current);
|
|
2383
2084
|
},
|
|
2384
|
-
className: `flex h-7 shrink-0 items-center gap-1 px-1.5 text-[12px] font-medium text-[var(--ink-
|
|
2085
|
+
className: `flex h-7 shrink-0 items-center gap-1 px-1.5 text-[12px] font-medium text-[var(--mova-ai-ink-secondary,#666)] transition-colors duration-150 hover:bg-[var(--mova-ai-hover,#f1f1f1)] hover:text-[var(--mova-ai-ink,#202020)] ${pill ? "rounded-full" : "rounded-[8px]"} ${wide ? "col-start-2 row-start-2 justify-self-start" : "col-start-3 row-start-1"}`,
|
|
2385
2086
|
children: [
|
|
2386
2087
|
model.name,
|
|
2387
|
-
/* @__PURE__ */ jsx5("span", { className: "text-[var(--ink-
|
|
2088
|
+
/* @__PURE__ */ jsx5("span", { className: "text-[var(--mova-ai-ink-muted,#858585)]", children: /* @__PURE__ */ jsx5(Icon, { size: 11, strokeWidth: 2.4, children: /* @__PURE__ */ jsx5("path", { d: "M6 9l6 6 6-6" }) }) })
|
|
2388
2089
|
]
|
|
2389
2090
|
}
|
|
2390
2091
|
),
|
|
@@ -2395,7 +2096,7 @@ function AIPromptBar({
|
|
|
2395
2096
|
"aria-label": listening ? "Stop dictation" : "Start dictation",
|
|
2396
2097
|
"aria-pressed": listening,
|
|
2397
2098
|
onClick: toggleDictation,
|
|
2398
|
-
className: `flex size-7 shrink-0 items-center justify-center transition-[background-color,color,transform] duration-150 active:scale-[0.94] ${pill ? "rounded-full" : "rounded-[8px]"} ${listening ? "bg-[var(--accent-tint)] text-[var(--accent-ink)]" : "text-[var(--ink-
|
|
2099
|
+
className: `flex size-7 shrink-0 items-center justify-center transition-[background-color,color,transform] duration-150 active:scale-[0.94] ${pill ? "rounded-full" : "rounded-[8px]"} ${listening ? "bg-[var(--mova-ai-accent-tint,#eee)] text-[var(--mova-ai-accent-ink,#333)]" : "text-[var(--mova-ai-ink-muted,#858585)] hover:bg-[var(--mova-ai-hover,#f1f1f1)] hover:text-[var(--mova-ai-ink,#202020)]"} ${wide ? "col-start-4 row-start-2" : "col-start-4 row-start-1"}`,
|
|
2399
2100
|
children: listening ? /* @__PURE__ */ jsx5("span", { className: "flex h-3.5 items-center gap-[2.5px]", children: [0, 1, 2].map((i) => /* @__PURE__ */ jsx5(
|
|
2400
2101
|
"span",
|
|
2401
2102
|
{
|
|
@@ -2418,8 +2119,8 @@ function AIPromptBar({
|
|
|
2418
2119
|
onClick: send,
|
|
2419
2120
|
className: `flex size-7 shrink-0 items-center justify-center transition-[background-color,color,transform] duration-200 enabled:active:scale-[0.94] ${pill ? "rounded-full" : "rounded-[8px]"} ${wide ? "col-start-5 row-start-2" : "col-start-5 row-start-1"}`,
|
|
2420
2121
|
style: {
|
|
2421
|
-
background: canSend ? "var(--ink)" : "var(--
|
|
2422
|
-
color: canSend ? "var(--surface)" : "var(--ink-
|
|
2122
|
+
background: canSend ? "var(--mova-ai-ink,#202020)" : "var(--mova-ai-border-strong,#c8c8c8)",
|
|
2123
|
+
color: canSend ? "var(--mova-ai-surface,#fff)" : "var(--mova-ai-ink-secondary,#666)"
|
|
2423
2124
|
},
|
|
2424
2125
|
children: /* @__PURE__ */ jsx5(Icon, { size: 16, strokeWidth: 2.4, children: /* @__PURE__ */ jsx5("path", { d: "M12 19V5M5 12l7-7 7 7" }) })
|
|
2425
2126
|
}
|
|
@@ -2431,124 +2132,22 @@ function AIPromptBar({
|
|
|
2431
2132
|
}
|
|
2432
2133
|
)
|
|
2433
2134
|
] }),
|
|
2434
|
-
/* @__PURE__ */ jsx5("p", { role: "status", className: "mt-2 min-h-4 break-words text-[11px] text-[var(--ink-
|
|
2135
|
+
/* @__PURE__ */ jsx5("p", { role: "status", className: "mt-2 min-h-4 break-words text-[11px] text-[var(--mova-ai-ink-muted,#858585)]", children: feedback })
|
|
2435
2136
|
]
|
|
2436
2137
|
}
|
|
2437
2138
|
);
|
|
2438
2139
|
}
|
|
2439
2140
|
|
|
2440
2141
|
// .generated/ui/ai/ai-sidebar-nav.tsx
|
|
2441
|
-
import { useEffect as useEffect8, useRef as useRef5, useState as useState9 } from "react";
|
|
2142
|
+
import { useEffect as useEffect8, useId as useId2, useRef as useRef5, useState as useState9 } from "react";
|
|
2442
2143
|
import { createPortal } from "react-dom";
|
|
2443
2144
|
import { LogOut as IconArrowBoxLeft, Check as IconCheckmark1Small, ChevronDown as IconChevronDownSmall, X as IconCrossSmall, SquarePen as IconEditBig, House as IconHome, Search as IconMagnifyingGlass, Plus as IconPlusMedium, IceCream as IconPopsicle2, Settings as IconSettingsGear1, PanelLeftClose as IconSidebarLeftArrow, UserPlus as IconUserAdd } from "lucide-react";
|
|
2444
2145
|
import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
2445
|
-
var
|
|
2446
|
-
|
|
2447
|
-
|
|
2448
|
-
|
|
2449
|
-
|
|
2450
|
-
0 6px 12px 0 rgba(0, 0, 0, 0.03), 0 3px 6px 0 rgba(0, 0, 0, 0.02),
|
|
2451
|
-
0 1.5px 3px 0 rgba(0, 0, 0, 0.02); font-family:Inter,ui-sans-serif,system-ui,sans-serif; font-size:14px;line-height:1.5;letter-spacing:-0.01em;color:var(--ink);
|
|
2452
|
-
/* surfaces \u2014 cool, blue-tinted neutrals */
|
|
2453
|
-
--page: oklch(0.985 0.001 286.376);
|
|
2454
|
-
--canvas: oklch(0.961 0.002 247.84);
|
|
2455
|
-
--surface: oklch(1 0 0);
|
|
2456
|
-
--inset: oklch(0.979 0.002 247.839);
|
|
2457
|
-
--hover: oklch(0.97 0.002 247.839);
|
|
2458
|
-
--hover-2: oklch(0.933 0.003 247.86);
|
|
2459
|
-
|
|
2460
|
-
/* ink ramp */
|
|
2461
|
-
--ink: oklch(0.247 0.006 258.361);
|
|
2462
|
-
--ink-2: oklch(0.506 0.01 264.477);
|
|
2463
|
-
--ink-3: oklch(0.695 0.009 264.505);
|
|
2464
|
-
|
|
2465
|
-
/* borders \u2014 solid and crisp, not alpha */
|
|
2466
|
-
--line: oklch(0.946 0.003 264.542);
|
|
2467
|
-
--line-strong: oklch(0.912 0.005 258.326);
|
|
2468
|
-
--line-soft: oklch(0.966 0.002 264.542);
|
|
2469
|
-
--grid-line: color-mix(in srgb, var(--line) 78%, transparent);
|
|
2470
|
-
--field: oklch(0.961 0.001 286.375);
|
|
2471
|
-
--stripe: oklch(0.405 0 0 / 0.075);
|
|
2472
|
-
--stripe-bg: oklch(0.97 0 0);
|
|
2473
|
-
|
|
2474
|
-
/* accent */
|
|
2475
|
-
--accent: oklch(0.626 0.205 254.947);
|
|
2476
|
-
--accent-ink: oklch(0.556 0.187 255.617);
|
|
2477
|
-
--accent-tint: oklch(0.96 0.019 252.878);
|
|
2478
|
-
|
|
2479
|
-
/* semantic */
|
|
2480
|
-
--green: oklch(0.603 0.155 150.883);
|
|
2481
|
-
--green-tint: oklch(0.958 0.017 159.118);
|
|
2482
|
-
--orange: oklch(0.689 0.179 49.902);
|
|
2483
|
-
--orange-tint: oklch(0.964 0.021 67.581);
|
|
2484
|
-
--red: oklch(0.621 0.192 23.042);
|
|
2485
|
-
--red-tint: oklch(0.956 0.017 17.462);
|
|
2486
|
-
|
|
2487
|
-
/* chart overlays \u2014 neutral system colors with enough contrast on either theme */
|
|
2488
|
-
--tooltip-bg: oklch(0.272 0.008 264.435);
|
|
2489
|
-
--tooltip-fg: oklch(0.976 0.002 247.839);
|
|
2490
|
-
--tooltip-muted: oklch(0.731 0.008 260.731);
|
|
2491
|
-
--tooltip-border: oklch(0.356 0.007 264.474);
|
|
2492
|
-
|
|
2493
|
-
/* shadows \u2014 our solid hairline ring + shadow-plugin's smooth layered stacks
|
|
2494
|
-
* (--shadow-xs\u2026lg come from shadow-plugin/unprefixed) so every surface reads
|
|
2495
|
-
* consistently across the app. */
|
|
2496
|
-
--shadow-hairline: 0 0 0 1px var(--line);
|
|
2497
|
-
--shadow-btn: 0 0 0 1px var(--line-strong), var(--shadow-xs);
|
|
2498
|
-
--shadow-card: 0 0 0 1px var(--line), var(--shadow-sm);
|
|
2499
|
-
--shadow-raised: 0 0 0 1px var(--line), var(--shadow-md);
|
|
2500
|
-
--shadow-overlay: 0 0 0 1px var(--line), var(--shadow-lg);
|
|
2501
|
-
--shadow-inset-field: inset 0 1px 2px oklch(0 0 0 / 0.12);}
|
|
2502
|
-
[data-mova-sidebar][data-theme="dark"] {
|
|
2503
|
-
--page: oklch(0.209 0.004 264.477);
|
|
2504
|
-
--canvas: oklch(0.231 0.004 264.487);
|
|
2505
|
-
--surface: oklch(0.26 0.006 271.191);
|
|
2506
|
-
--inset: oklch(0.243 0.004 264.492);
|
|
2507
|
-
--hover: oklch(0.289 0.006 271.22);
|
|
2508
|
-
--hover-2: oklch(0.318 0.007 274.747);
|
|
2509
|
-
|
|
2510
|
-
--ink: oklch(0.964 0.002 247.839);
|
|
2511
|
-
--ink-2: oklch(0.731 0.008 260.731);
|
|
2512
|
-
--ink-3: oklch(0.541 0.01 264.484);
|
|
2513
|
-
|
|
2514
|
-
--line: oklch(0.308 0.006 258.354);
|
|
2515
|
-
--line-strong: oklch(0.356 0.007 264.474);
|
|
2516
|
-
--line-soft: oklch(0.278 0.006 258.354);
|
|
2517
|
-
--field: oklch(0.293 0.006 271.223);
|
|
2518
|
-
--stripe: oklch(1 0 0 / 0.055);
|
|
2519
|
-
--stripe-bg: oklch(0.226 0.004 264.485);
|
|
2520
|
-
|
|
2521
|
-
--accent: oklch(0.68 0.173 253.301);
|
|
2522
|
-
--accent-ink: oklch(0.788 0.113 248.33);
|
|
2523
|
-
--accent-tint: oklch(0.68 0.173 253.301 / 0.16);
|
|
2524
|
-
|
|
2525
|
-
--green: oklch(0.705 0.154 153.814);
|
|
2526
|
-
--green-tint: oklch(0.705 0.154 153.814 / 0.14);
|
|
2527
|
-
--orange: oklch(0.746 0.156 55.642);
|
|
2528
|
-
--orange-tint: oklch(0.746 0.156 55.642 / 0.14);
|
|
2529
|
-
--red: oklch(0.666 0.18 21.433);
|
|
2530
|
-
--red-tint: oklch(0.666 0.18 21.433 / 0.14);
|
|
2531
|
-
|
|
2532
|
-
--tooltip-bg: oklch(0.182 0.004 264.459);
|
|
2533
|
-
--tooltip-fg: oklch(0.964 0.002 247.839);
|
|
2534
|
-
--tooltip-muted: oklch(0.731 0.008 260.731);
|
|
2535
|
-
--tooltip-border: oklch(0.308 0.006 258.354);
|
|
2536
|
-
|
|
2537
|
-
--shadow-hairline: 0 0 0 1px var(--line);
|
|
2538
|
-
/* Elevation rings go to a subtle *light* hairline in dark mode: the ring
|
|
2539
|
-
* paints over the surface behind the element, so a low-alpha white edge
|
|
2540
|
-
* dissolves into the shadow as one continuous stroke (per smooth-shadow-ring),
|
|
2541
|
-
* graduated by how far the surface floats. */
|
|
2542
|
-
--shadow-btn: 0 0 0 1px oklch(1 0 0 / 0.1), 0 1px 2px oklch(0 0 0 / 0.3);
|
|
2543
|
-
--shadow-card:
|
|
2544
|
-
0 0 0 1px oklch(1 0 0 / 0.11), 0 1px 2px oklch(0 0 0 / 0.2),
|
|
2545
|
-
0 2px 6px oklch(0 0 0 / 0.2);
|
|
2546
|
-
--shadow-raised:
|
|
2547
|
-
0 0 0 1px oklch(1 0 0 / 0.13), 0 2px 10px oklch(0 0 0 / 0.22);
|
|
2548
|
-
--shadow-overlay:
|
|
2549
|
-
0 0 0 1px oklch(1 0 0 / 0.15), 0 8px 28px oklch(0 0 0 / 0.34);
|
|
2550
|
-
--shadow-inset-field: inset 0 1px 2px oklch(0 0 0 / 0.4);}
|
|
2551
|
-
[data-mova-sidebar] :is(button,input,textarea):focus-visible { outline:2px solid var(--accent);outline-offset:2px; }
|
|
2146
|
+
var AI_THEME_STYLES6 = '/* Shared public tokens for the standalone AI component family. */\n.mova-ai-theme {\n color-scheme: light;\n color: var(--mova-ai-ink, #202020);\n font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;\n font-size: 13px;\n line-height: 1.45;\n letter-spacing: -0.01em;\n\n --mova-ai-page: #f7f7f7;\n --mova-ai-canvas: #f4f4f4;\n --mova-ai-surface: #ffffff;\n --mova-ai-inset: #f8f8f8;\n --mova-ai-hover: #f1f1f1;\n --mova-ai-hover-strong: #e9e9e9;\n\n --mova-ai-ink: #202020;\n --mova-ai-ink-secondary: #666666;\n --mova-ai-ink-muted: #858585;\n\n --mova-ai-border: #dedede;\n --mova-ai-border-soft: #ededed;\n --mova-ai-border-strong: #c8c8c8;\n --mova-ai-field: #f6f6f6;\n --mova-ai-grid: color-mix(in srgb, var(--mova-ai-border) 78%, transparent);\n --mova-ai-stripe: rgb(32 35 38 / 7%);\n --mova-ai-stripe-bg: #242424;\n\n --mova-ai-accent: #454545;\n --mova-ai-accent-ink: #333333;\n --mova-ai-accent-foreground: #ffffff;\n --mova-ai-accent-tint: #eeeeee;\n --mova-ai-success: #28734d;\n --mova-ai-success-tint: #e8f3ec;\n --mova-ai-warning: #986517;\n --mova-ai-warning-tint: #f8f0df;\n --mova-ai-danger: #a33c3c;\n --mova-ai-danger-tint: #f7eaea;\n --mova-ai-info: #496b89;\n --mova-ai-info-tint: #eaf0f5;\n --mova-ai-neutral-status: #69737d;\n --mova-ai-status-on: #ffffff;\n\n --mova-ai-tooltip-bg: #292929;\n --mova-ai-tooltip-fg: #f6f6f6;\n --mova-ai-tooltip-muted: #c3c3c3;\n --mova-ai-tooltip-border: #484848;\n\n --mova-ai-radius-panel: 8px;\n --mova-ai-radius-control: 8px;\n --mova-ai-shadow-xs: 0 1px 2px rgb(22 28 33 / 5%);\n --mova-ai-shadow-sm: 0 2px 8px rgb(22 28 33 / 7%);\n --mova-ai-shadow-md: 0 8px 20px rgb(22 28 33 / 11%);\n --mova-ai-shadow-lg: 0 14px 32px rgb(22 28 33 / 15%);\n --mova-ai-shadow-hairline: 0 0 0 1px var(--mova-ai-border);\n --mova-ai-shadow-btn: 0 0 0 1px var(--mova-ai-border-strong), var(--mova-ai-shadow-xs);\n --mova-ai-shadow-card: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-sm);\n --mova-ai-shadow-raised: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-md);\n --mova-ai-shadow-overlay: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-lg);\n --mova-ai-shadow-inset-field: inset 0 1px 2px rgb(22 28 33 / 12%);\n}\n\n.mova-ai-theme[data-theme="dark"] {\n color-scheme: dark;\n --mova-ai-page: #181818;\n --mova-ai-canvas: #202020;\n --mova-ai-surface: #272727;\n --mova-ai-inset: #1d1d1d;\n --mova-ai-hover: #2d2d2d;\n --mova-ai-hover-strong: #393939;\n\n --mova-ai-ink: #eeeeee;\n --mova-ai-ink-secondary: #b5b5b5;\n --mova-ai-ink-muted: #929292;\n\n --mova-ai-border: #3b3b3b;\n --mova-ai-border-soft: #303030;\n --mova-ai-border-strong: #505050;\n --mova-ai-field: #2c2c2c;\n --mova-ai-grid: color-mix(in srgb, var(--mova-ai-border) 78%, transparent);\n --mova-ai-stripe: rgb(255 255 255 / 6%);\n --mova-ai-stripe-bg: #202528;\n\n --mova-ai-accent: #c2c2c2;\n --mova-ai-accent-ink: #d5d5d5;\n --mova-ai-accent-foreground: #202020;\n --mova-ai-accent-tint: #353535;\n --mova-ai-success: #88c7a0;\n --mova-ai-success-tint: #293b30;\n --mova-ai-warning: #d7b66f;\n --mova-ai-warning-tint: #3c3525;\n --mova-ai-danger: #e5928e;\n --mova-ai-danger-tint: #3c2b2b;\n --mova-ai-info: #9bbbd6;\n --mova-ai-info-tint: #293541;\n --mova-ai-neutral-status: #a0a0a0;\n --mova-ai-status-on: #181818;\n\n --mova-ai-tooltip-bg: #121212;\n --mova-ai-tooltip-fg: #eeeeee;\n --mova-ai-tooltip-muted: #b5b5b5;\n --mova-ai-tooltip-border: #3b3b3b;\n\n --mova-ai-shadow-xs: 0 1px 2px rgb(0 0 0 / 22%);\n --mova-ai-shadow-sm: 0 2px 8px rgb(0 0 0 / 25%);\n --mova-ai-shadow-md: 0 8px 20px rgb(0 0 0 / 30%);\n --mova-ai-shadow-lg: 0 14px 32px rgb(0 0 0 / 38%);\n --mova-ai-shadow-hairline: 0 0 0 1px var(--mova-ai-border);\n --mova-ai-shadow-btn: 0 0 0 1px var(--mova-ai-border-strong), var(--mova-ai-shadow-xs);\n --mova-ai-shadow-card: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-sm);\n --mova-ai-shadow-raised: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-md);\n --mova-ai-shadow-overlay: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-lg);\n --mova-ai-shadow-inset-field: inset 0 1px 2px rgb(0 0 0 / 42%);\n}\n';
|
|
2147
|
+
var COMPONENT_STYLES2 = `[data-mova-sidebar] button:focus-visible { outline:2px solid var(--mova-ai-accent,#454545);outline-offset:2px;border-radius:8px; }
|
|
2148
|
+
[data-mova-sidebar] input:focus-visible { outline:none; }
|
|
2149
|
+
[data-mova-sidebar] .sidebar-search:focus-within { outline:2px solid var(--mova-ai-accent,#454545);outline-offset:2px;border-radius:8px; }
|
|
2150
|
+
[data-mova-sidebar] .sidebar-search button:focus-visible { outline:none; }
|
|
2552
2151
|
[data-mova-sidebar] button { cursor:pointer; } [data-mova-sidebar] button:disabled { cursor:default; }
|
|
2553
2152
|
[data-mova-sidebar] .sidebar-row{
|
|
2554
2153
|
width: 208px;
|
|
@@ -2619,7 +2218,7 @@ var COMPONENT_STYLES2 = `[data-mova-sidebar] {--shadow-xs: 0 0 4px 0 rgba(0, 0,
|
|
|
2619
2218
|
function GlideMenu3({
|
|
2620
2219
|
children,
|
|
2621
2220
|
className = "",
|
|
2622
|
-
highlightClassName = "inset-x-0 rounded-[8px] bg-[var(--hover)]",
|
|
2221
|
+
highlightClassName = "inset-x-0 rounded-[8px] bg-[var(--mova-ai-hover,#f1f1f1)]",
|
|
2623
2222
|
rowSelector = "[data-menu-row]"
|
|
2624
2223
|
}) {
|
|
2625
2224
|
const ref = useRef5(null);
|
|
@@ -2691,14 +2290,15 @@ var SIDEBAR_MOTION = {
|
|
|
2691
2290
|
var CHAT_SEARCH_MOTION = {
|
|
2692
2291
|
duration: 180,
|
|
2693
2292
|
closedWidth: 28,
|
|
2694
|
-
easing: "cubic-bezier(0.16, 1, 0.3, 1)"
|
|
2293
|
+
easing: "cubic-bezier(0.16, 1, 0.3, 1)",
|
|
2294
|
+
listDuration: 220
|
|
2695
2295
|
};
|
|
2696
2296
|
function GlideGroup({ children }) {
|
|
2697
2297
|
return /* @__PURE__ */ jsx6(
|
|
2698
2298
|
GlideMenu3,
|
|
2699
2299
|
{
|
|
2700
2300
|
rowSelector: "[data-row]",
|
|
2701
|
-
highlightClassName: "sidebar-glide-highlight rounded-[7px] bg-[var(--hover-
|
|
2301
|
+
highlightClassName: "sidebar-glide-highlight rounded-[7px] bg-[var(--mova-ai-hover-strong,#e9e9e9)]",
|
|
2702
2302
|
className: "group/glide flex flex-col gap-px",
|
|
2703
2303
|
children
|
|
2704
2304
|
}
|
|
@@ -2721,11 +2321,11 @@ function RailButton({
|
|
|
2721
2321
|
onClick,
|
|
2722
2322
|
className: `sidebar-row relative z-10 mx-2 flex h-8 items-center rounded-[8px] px-2 text-left
|
|
2723
2323
|
transition-[width,background-color,color,transform] duration-150 active:scale-[0.98]
|
|
2724
|
-
${active ? "bg-[var(--hover-
|
|
2324
|
+
${active ? "bg-[var(--mova-ai-hover-strong,#e9e9e9)] group-hover/glide:bg-transparent" : ""}`,
|
|
2725
2325
|
children: [
|
|
2726
|
-
/* @__PURE__ */ jsx6("span", { className: `flex size-5 shrink-0 items-center justify-center ${active ? "text-[var(--ink)]" : "text-[var(--ink-
|
|
2727
|
-
/* @__PURE__ */ jsx6("span", { className: `sidebar-copy ml-1.5 min-w-0 flex-1 truncate text-[14px] font-medium ${active ? "text-[var(--ink)]" : "text-[var(--ink-
|
|
2728
|
-
count && /* @__PURE__ */ jsx6("span", { className: "sidebar-copy mr-2 shrink-0 text-[12px] font-medium tabular-nums text-[var(--ink-
|
|
2326
|
+
/* @__PURE__ */ jsx6("span", { className: `flex size-5 shrink-0 items-center justify-center ${active ? "text-[var(--mova-ai-ink,#202020)]" : "text-[var(--mova-ai-ink-secondary,#666)]"}`, children: icon }),
|
|
2327
|
+
/* @__PURE__ */ jsx6("span", { className: `sidebar-copy ml-1.5 min-w-0 flex-1 truncate text-[14px] font-medium ${active ? "text-[var(--mova-ai-ink,#202020)]" : "text-[var(--mova-ai-ink-secondary,#666)]"}`, children: label }),
|
|
2328
|
+
count && /* @__PURE__ */ jsx6("span", { className: "sidebar-copy mr-2 shrink-0 text-[12px] font-medium tabular-nums text-[var(--mova-ai-ink-muted,#858585)]", children: count })
|
|
2729
2329
|
]
|
|
2730
2330
|
}
|
|
2731
2331
|
);
|
|
@@ -2762,7 +2362,7 @@ function WorkspaceMenu({
|
|
|
2762
2362
|
buttons[(index + (event.key === "ArrowDown" ? 1 : buttons.length - 1)) % buttons.length]?.focus();
|
|
2763
2363
|
}
|
|
2764
2364
|
},
|
|
2765
|
-
className: "fixed z-50 w-64 rounded-[
|
|
2365
|
+
className: "mova-ai-theme fixed z-50 w-64 rounded-lg border border-[var(--mova-ai-border,#dedede)] bg-[var(--mova-ai-surface,#fff)] p-1.5 shadow-[var(--mova-ai-shadow-overlay,none)]",
|
|
2766
2366
|
style: {
|
|
2767
2367
|
top: position.top,
|
|
2768
2368
|
left: position.left,
|
|
@@ -2773,8 +2373,11 @@ function WorkspaceMenu({
|
|
|
2773
2373
|
transformOrigin: "top left"
|
|
2774
2374
|
},
|
|
2775
2375
|
children: [
|
|
2776
|
-
/* @__PURE__ */
|
|
2777
|
-
|
|
2376
|
+
/* @__PURE__ */ jsxs6("style", { children: [
|
|
2377
|
+
AI_THEME_STYLES6,
|
|
2378
|
+
COMPONENT_STYLES2
|
|
2379
|
+
] }),
|
|
2380
|
+
/* @__PURE__ */ jsxs6(GlideMenu3, { className: "flex flex-col gap-px", highlightClassName: "inset-x-0 rounded-[8px] bg-[var(--mova-ai-hover-strong,#e9e9e9)]", children: [
|
|
2778
2381
|
/* @__PURE__ */ jsxs6(
|
|
2779
2382
|
"button",
|
|
2780
2383
|
{
|
|
@@ -2783,13 +2386,13 @@ function WorkspaceMenu({
|
|
|
2783
2386
|
onClick: onClose,
|
|
2784
2387
|
className: "relative z-10 flex h-10 w-full items-center gap-1.5 rounded-[8px] px-2 text-left",
|
|
2785
2388
|
children: [
|
|
2786
|
-
/* @__PURE__ */ jsx6("span", { className: "flex size-6 shrink-0 items-center justify-center rounded-[7px] bg-[var(--ink)] text-[11px] font-semibold text-[var(--surface)]", children: WORKSPACE.monogram }),
|
|
2787
|
-
/* @__PURE__ */ jsx6("span", { className: "min-w-0 flex-1 truncate text-[13.5px] font-medium text-[var(--ink)]", children: WORKSPACE.name }),
|
|
2788
|
-
/* @__PURE__ */ jsx6("span", { className: "shrink-0 text-[var(--ink)]", children: /* @__PURE__ */ jsx6(IconCheckmark1Small, { size: 18 }) })
|
|
2389
|
+
/* @__PURE__ */ jsx6("span", { className: "flex size-6 shrink-0 items-center justify-center rounded-[7px] bg-[var(--mova-ai-ink,#202020)] text-[11px] font-semibold text-[var(--mova-ai-surface,#fff)]", children: WORKSPACE.monogram }),
|
|
2390
|
+
/* @__PURE__ */ jsx6("span", { className: "min-w-0 flex-1 truncate text-[13.5px] font-medium text-[var(--mova-ai-ink,#202020)]", children: WORKSPACE.name }),
|
|
2391
|
+
/* @__PURE__ */ jsx6("span", { className: "shrink-0 text-[var(--mova-ai-ink,#202020)]", children: /* @__PURE__ */ jsx6(IconCheckmark1Small, { size: 18 }) })
|
|
2789
2392
|
]
|
|
2790
2393
|
}
|
|
2791
2394
|
),
|
|
2792
|
-
/* @__PURE__ */ jsx6("div", { className: "my-1 h-px bg-[var(--
|
|
2395
|
+
/* @__PURE__ */ jsx6("div", { className: "my-1 h-px bg-[var(--mova-ai-border,#dedede)]" }),
|
|
2793
2396
|
[
|
|
2794
2397
|
{ label: "New workspace", icon: /* @__PURE__ */ jsx6(IconPlusMedium, { size: 16 }) },
|
|
2795
2398
|
{ label: "Workspace settings", icon: /* @__PURE__ */ jsx6(IconSettingsGear1, { size: 16 }) },
|
|
@@ -2805,13 +2408,13 @@ function WorkspaceMenu({
|
|
|
2805
2408
|
},
|
|
2806
2409
|
className: "relative z-10 flex h-9 w-full items-center gap-1.5 rounded-[8px] px-2 text-left",
|
|
2807
2410
|
children: [
|
|
2808
|
-
/* @__PURE__ */ jsx6("span", { className: "flex size-5 shrink-0 items-center justify-center text-[var(--ink-
|
|
2809
|
-
/* @__PURE__ */ jsx6("span", { className: "min-w-0 flex-1 truncate text-[13.5px] text-[var(--ink)]", children: item.label })
|
|
2411
|
+
/* @__PURE__ */ jsx6("span", { className: "flex size-5 shrink-0 items-center justify-center text-[var(--mova-ai-ink-secondary,#666)]", children: item.icon }),
|
|
2412
|
+
/* @__PURE__ */ jsx6("span", { className: "min-w-0 flex-1 truncate text-[13.5px] text-[var(--mova-ai-ink,#202020)]", children: item.label })
|
|
2810
2413
|
]
|
|
2811
2414
|
},
|
|
2812
2415
|
item.label
|
|
2813
2416
|
)),
|
|
2814
|
-
/* @__PURE__ */ jsx6("div", { className: "my-1 h-px bg-[var(--
|
|
2417
|
+
/* @__PURE__ */ jsx6("div", { className: "my-1 h-px bg-[var(--mova-ai-border,#dedede)]" }),
|
|
2815
2418
|
/* @__PURE__ */ jsxs6(
|
|
2816
2419
|
"button",
|
|
2817
2420
|
{
|
|
@@ -2823,8 +2426,8 @@ function WorkspaceMenu({
|
|
|
2823
2426
|
},
|
|
2824
2427
|
className: "relative z-10 flex h-9 w-full items-center gap-1.5 rounded-[8px] px-2 text-left",
|
|
2825
2428
|
children: [
|
|
2826
|
-
/* @__PURE__ */ jsx6("span", { className: "flex size-5 shrink-0 items-center justify-center text-[var(--ink-
|
|
2827
|
-
/* @__PURE__ */ jsx6("span", { className: "min-w-0 flex-1 truncate text-[13.5px] text-[var(--ink)]", children: "Sign out" })
|
|
2429
|
+
/* @__PURE__ */ jsx6("span", { className: "flex size-5 shrink-0 items-center justify-center text-[var(--mova-ai-ink-secondary,#666)]", children: /* @__PURE__ */ jsx6(IconArrowBoxLeft, { size: 16 }) }),
|
|
2430
|
+
/* @__PURE__ */ jsx6("span", { className: "min-w-0 flex-1 truncate text-[13.5px] text-[var(--mova-ai-ink,#202020)]", children: "Sign out" })
|
|
2828
2431
|
]
|
|
2829
2432
|
}
|
|
2830
2433
|
)
|
|
@@ -2860,7 +2463,7 @@ function AISidebarNav({
|
|
|
2860
2463
|
const currentNav = activeNav ?? internalNav;
|
|
2861
2464
|
const selectNav = (key) => {
|
|
2862
2465
|
setInternalNav(key);
|
|
2863
|
-
|
|
2466
|
+
if (key === "home" || key === "invite") setFeedback(key === "home" ? "Home selected" : "Invite users selected");
|
|
2864
2467
|
onNavigate?.(key);
|
|
2865
2468
|
};
|
|
2866
2469
|
const [demoActiveTitle, setDemoActiveTitle] = useState9(null);
|
|
@@ -2868,6 +2471,9 @@ function AISidebarNav({
|
|
|
2868
2471
|
const [workspacePosition, setWorkspacePosition] = useState9({ top: 0, left: 0 });
|
|
2869
2472
|
const [searchOpen, setSearchOpen] = useState9(false);
|
|
2870
2473
|
const [query, setQuery] = useState9("");
|
|
2474
|
+
const [chatsExpanded, setChatsExpanded] = useState9(true);
|
|
2475
|
+
const historyId = useId2();
|
|
2476
|
+
const searchId = useId2();
|
|
2871
2477
|
const workspaceButtonRef = useRef5(null);
|
|
2872
2478
|
const searchRef = useRef5(null);
|
|
2873
2479
|
const selectedTitle = activeTitle === void 0 ? demoActiveTitle : activeTitle;
|
|
@@ -2904,6 +2510,13 @@ function AISidebarNav({
|
|
|
2904
2510
|
setSearchOpen(false);
|
|
2905
2511
|
setQuery("");
|
|
2906
2512
|
};
|
|
2513
|
+
const toggleChats = () => {
|
|
2514
|
+
if (chatsExpanded) {
|
|
2515
|
+
setSearchOpen(false);
|
|
2516
|
+
setQuery("");
|
|
2517
|
+
}
|
|
2518
|
+
setChatsExpanded(!chatsExpanded);
|
|
2519
|
+
};
|
|
2907
2520
|
return /* @__PURE__ */ jsxs6(
|
|
2908
2521
|
"aside",
|
|
2909
2522
|
{
|
|
@@ -2912,7 +2525,7 @@ function AISidebarNav({
|
|
|
2912
2525
|
"data-theme": theme,
|
|
2913
2526
|
"data-sidebar-collapsed": collapsed,
|
|
2914
2527
|
"aria-label": "Workspace navigation",
|
|
2915
|
-
className: `relative flex shrink-0 overflow-hidden transition-[width] ${fill ? "h-full" : "h-[600px]"} ${className}`,
|
|
2528
|
+
className: `mova-ai-theme relative flex shrink-0 overflow-hidden rounded-lg border border-[var(--mova-ai-border,#dedede)] bg-[var(--mova-ai-surface,#fff)] text-[color:var(--mova-ai-ink,#202020)] transition-[width] ${fill ? "h-full" : "h-[600px]"} ${className}`,
|
|
2916
2529
|
style: {
|
|
2917
2530
|
width: collapsed ? SIDEBAR_MOTION.collapsedWidth : SIDEBAR_MOTION.expandedWidth,
|
|
2918
2531
|
transitionDuration: `${SIDEBAR_MOTION.duration}ms`,
|
|
@@ -2922,7 +2535,10 @@ function AISidebarNav({
|
|
|
2922
2535
|
"--sidebar-easing": SIDEBAR_MOTION.easing
|
|
2923
2536
|
},
|
|
2924
2537
|
children: [
|
|
2925
|
-
/* @__PURE__ */
|
|
2538
|
+
/* @__PURE__ */ jsxs6("style", { children: [
|
|
2539
|
+
AI_THEME_STYLES6,
|
|
2540
|
+
COMPONENT_STYLES2
|
|
2541
|
+
] }),
|
|
2926
2542
|
/* @__PURE__ */ jsxs6("div", { className: "flex min-h-0 w-[224px] shrink-0 flex-col", children: [
|
|
2927
2543
|
/* @__PURE__ */ jsxs6("div", { className: "relative mb-2.5 h-10 shrink-0", children: [
|
|
2928
2544
|
/* @__PURE__ */ jsxs6(
|
|
@@ -2941,11 +2557,11 @@ function AISidebarNav({
|
|
|
2941
2557
|
}
|
|
2942
2558
|
setWorkspaceOpen((open) => !open);
|
|
2943
2559
|
},
|
|
2944
|
-
className: "sidebar-workspace-control absolute left-2 top-1 flex h-8 w-[164px] items-center rounded-[8px] px-2 text-left transition-[background-color,transform] duration-100 hover:bg-[var(--hover-
|
|
2560
|
+
className: "sidebar-workspace-control absolute left-2 top-1 flex h-8 w-[164px] items-center rounded-[8px] px-2 text-left transition-[background-color,transform] duration-100 hover:bg-[var(--mova-ai-hover-strong,#e9e9e9)] active:scale-[0.99]",
|
|
2945
2561
|
children: [
|
|
2946
|
-
/* @__PURE__ */ jsx6("span", { className: "sidebar-logo flex size-5 shrink-0 items-center justify-center text-[var(--ink)]", children: /* @__PURE__ */ jsx6(IconPopsicle2, { size: 18 }) }),
|
|
2947
|
-
/* @__PURE__ */ jsx6("span", { className: "sidebar-copy ml-1.5 min-w-0 flex-1 truncate text-[14px] font-medium text-[var(--ink-
|
|
2948
|
-
/* @__PURE__ */ jsx6("span", { className: "sidebar-copy ml-1 flex shrink-0 text-[var(--ink-
|
|
2562
|
+
/* @__PURE__ */ jsx6("span", { className: "sidebar-logo flex size-5 shrink-0 items-center justify-center text-[var(--mova-ai-ink,#202020)]", children: /* @__PURE__ */ jsx6(IconPopsicle2, { size: 18 }) }),
|
|
2563
|
+
/* @__PURE__ */ jsx6("span", { className: "sidebar-copy ml-1.5 min-w-0 flex-1 truncate text-[14px] font-medium text-[var(--mova-ai-ink-secondary,#666)]", children: WORKSPACE.name }),
|
|
2564
|
+
/* @__PURE__ */ jsx6("span", { className: "sidebar-copy ml-1 flex shrink-0 text-[var(--mova-ai-ink-muted,#858585)]", children: /* @__PURE__ */ jsx6(IconChevronDownSmall, { size: 16 }) })
|
|
2949
2565
|
]
|
|
2950
2566
|
}
|
|
2951
2567
|
),
|
|
@@ -2965,7 +2581,7 @@ function AISidebarNav({
|
|
|
2965
2581
|
"aria-hidden": collapsed,
|
|
2966
2582
|
tabIndex: collapsed ? -1 : 0,
|
|
2967
2583
|
onClick: collapse,
|
|
2968
|
-
className: "sidebar-collapse-control absolute right-2 top-1 flex size-8 items-center justify-center rounded-[8px] text-[var(--ink-
|
|
2584
|
+
className: "sidebar-collapse-control absolute right-2 top-1 flex size-8 items-center justify-center rounded-[8px] text-[var(--mova-ai-ink-muted,#858585)] transition-[opacity,background-color,color] duration-150 hover:bg-[var(--mova-ai-hover-strong,#e9e9e9)] hover:text-[var(--mova-ai-ink,#202020)]",
|
|
2969
2585
|
children: /* @__PURE__ */ jsx6(IconSidebarLeftArrow, { size: 18 })
|
|
2970
2586
|
}
|
|
2971
2587
|
),
|
|
@@ -2981,7 +2597,7 @@ function AISidebarNav({
|
|
|
2981
2597
|
setCollapsed(false);
|
|
2982
2598
|
requestAnimationFrame(() => collapseRef.current?.focus());
|
|
2983
2599
|
},
|
|
2984
|
-
className: "sidebar-expand-control absolute left-2 top-0.5 flex size-9 items-center justify-center rounded-[8px] text-[var(--ink-
|
|
2600
|
+
className: "sidebar-expand-control absolute left-2 top-0.5 flex size-9 items-center justify-center rounded-[8px] text-[var(--mova-ai-ink-muted,#858585)] transition-[opacity,background-color,color] duration-150 hover:bg-[var(--mova-ai-hover-strong,#e9e9e9)] hover:text-[var(--mova-ai-ink,#202020)]",
|
|
2985
2601
|
children: /* @__PURE__ */ jsx6(IconSidebarLeftArrow, { size: 18, className: "rotate-180" })
|
|
2986
2602
|
}
|
|
2987
2603
|
)
|
|
@@ -3012,16 +2628,22 @@ function AISidebarNav({
|
|
|
3012
2628
|
item.key
|
|
3013
2629
|
))
|
|
3014
2630
|
] }),
|
|
3015
|
-
/* @__PURE__ */ jsxs6("div", { className: "mt-3 min-h-0 flex-1
|
|
3016
|
-
/* @__PURE__ */ jsxs6("div", { className: "sidebar-copy relative mx-2 mb-1 h-8", children: [
|
|
2631
|
+
/* @__PURE__ */ jsxs6("div", { className: "mt-3 flex min-h-0 flex-1 flex-col", inert: collapsed, children: [
|
|
2632
|
+
/* @__PURE__ */ jsxs6("div", { className: "sidebar-copy relative mx-2 mb-1 h-8 shrink-0", children: [
|
|
3017
2633
|
/* @__PURE__ */ jsxs6(
|
|
3018
|
-
"
|
|
2634
|
+
"button",
|
|
3019
2635
|
{
|
|
2636
|
+
type: "button",
|
|
2637
|
+
"aria-label": "Chats",
|
|
2638
|
+
"aria-expanded": chatsExpanded,
|
|
2639
|
+
"aria-controls": historyId,
|
|
3020
2640
|
"aria-hidden": searchOpen,
|
|
3021
|
-
|
|
2641
|
+
tabIndex: searchOpen ? -1 : 0,
|
|
2642
|
+
onClick: toggleChats,
|
|
2643
|
+
className: `absolute inset-0 flex items-center gap-1.5 rounded-[8px] px-2 text-left text-[12.5px] font-medium text-[var(--mova-ai-ink-muted,#858585)] transition-[opacity,transform,color] hover:text-[var(--mova-ai-ink,#202020)] ${searchOpen ? "pointer-events-none -translate-x-1 opacity-0" : "translate-x-0 opacity-100"}`,
|
|
3022
2644
|
style: { transitionDuration: `${CHAT_SEARCH_MOTION.duration}ms`, transitionTimingFunction: CHAT_SEARCH_MOTION.easing },
|
|
3023
2645
|
children: [
|
|
3024
|
-
/* @__PURE__ */ jsx6(IconChevronDownSmall, { size: 16 }),
|
|
2646
|
+
/* @__PURE__ */ jsx6(IconChevronDownSmall, { size: 16, className: `transition-transform duration-200 ${chatsExpanded ? "rotate-0" : "-rotate-90"}` }),
|
|
3025
2647
|
/* @__PURE__ */ jsx6("span", { children: "Chats" })
|
|
3026
2648
|
]
|
|
3027
2649
|
}
|
|
@@ -3034,8 +2656,13 @@ function AISidebarNav({
|
|
|
3034
2656
|
"aria-label": "Search chats",
|
|
3035
2657
|
tabIndex: searchOpen ? -1 : 0,
|
|
3036
2658
|
"aria-expanded": searchOpen,
|
|
3037
|
-
|
|
3038
|
-
|
|
2659
|
+
"aria-controls": searchId,
|
|
2660
|
+
"aria-hidden": searchOpen,
|
|
2661
|
+
onClick: () => {
|
|
2662
|
+
setChatsExpanded(true);
|
|
2663
|
+
setSearchOpen(true);
|
|
2664
|
+
},
|
|
2665
|
+
className: `absolute right-0 top-0 z-10 flex size-8 items-center justify-center rounded-[8px] text-[var(--mova-ai-ink-muted,#858585)] transition-[opacity,background-color,color,transform] hover:bg-[var(--mova-ai-hover-strong,#e9e9e9)] hover:text-[var(--mova-ai-ink,#202020)] active:scale-[0.96] ${searchOpen ? "pointer-events-none opacity-0" : "opacity-100"}`,
|
|
3039
2666
|
style: { transitionDuration: `${CHAT_SEARCH_MOTION.duration}ms` },
|
|
3040
2667
|
children: /* @__PURE__ */ jsx6(IconMagnifyingGlass, { size: 16 })
|
|
3041
2668
|
}
|
|
@@ -3043,7 +2670,11 @@ function AISidebarNav({
|
|
|
3043
2670
|
/* @__PURE__ */ jsxs6(
|
|
3044
2671
|
"div",
|
|
3045
2672
|
{
|
|
3046
|
-
|
|
2673
|
+
id: searchId,
|
|
2674
|
+
role: "search",
|
|
2675
|
+
"aria-hidden": !searchOpen,
|
|
2676
|
+
inert: !searchOpen,
|
|
2677
|
+
className: `sidebar-search absolute right-0 top-0 z-20 flex h-8 items-center overflow-hidden rounded-[8px] bg-[var(--mova-ai-field,#f6f6f6)] text-[var(--mova-ai-ink-muted,#858585)] shadow-[var(--mova-ai-shadow-hairline,none)] transition-[width,opacity] focus-within:text-[var(--mova-ai-ink-secondary,#666)] ${searchOpen ? "pointer-events-auto opacity-100" : "pointer-events-none opacity-0"}`,
|
|
3047
2678
|
style: {
|
|
3048
2679
|
width: searchOpen ? "100%" : CHAT_SEARCH_MOTION.closedWidth,
|
|
3049
2680
|
transitionDuration: `${CHAT_SEARCH_MOTION.duration}ms`,
|
|
@@ -3067,7 +2698,7 @@ function AISidebarNav({
|
|
|
3067
2698
|
},
|
|
3068
2699
|
placeholder: "Search chats",
|
|
3069
2700
|
"aria-label": "Search chat history",
|
|
3070
|
-
className: "ml-1.5 min-w-0 flex-1 bg-transparent text-[13px] font-medium text-[var(--ink)] outline-none placeholder:text-[var(--ink-
|
|
2701
|
+
className: "ml-1.5 min-w-0 flex-1 bg-transparent text-[13px] font-medium text-[var(--mova-ai-ink,#202020)] outline-none placeholder:text-[var(--mova-ai-ink-muted,#858585)]"
|
|
3071
2702
|
}
|
|
3072
2703
|
),
|
|
3073
2704
|
/* @__PURE__ */ jsx6(
|
|
@@ -3081,7 +2712,7 @@ function AISidebarNav({
|
|
|
3081
2712
|
setQuery("");
|
|
3082
2713
|
searchButtonRef.current?.focus();
|
|
3083
2714
|
},
|
|
3084
|
-
className: "flex size-8 shrink-0 items-center justify-center rounded-[8px] text-[var(--ink-
|
|
2715
|
+
className: "flex size-8 shrink-0 items-center justify-center rounded-[8px] text-[var(--mova-ai-ink-muted,#858585)] transition-[background-color,color,transform] duration-150 hover:bg-[var(--mova-ai-hover-strong,#e9e9e9)] hover:text-[var(--mova-ai-ink,#202020)] active:scale-[0.96]",
|
|
3085
2716
|
children: /* @__PURE__ */ jsx6(IconCrossSmall, { size: 16 })
|
|
3086
2717
|
}
|
|
3087
2718
|
)
|
|
@@ -3089,47 +2720,62 @@ function AISidebarNav({
|
|
|
3089
2720
|
}
|
|
3090
2721
|
)
|
|
3091
2722
|
] }),
|
|
3092
|
-
/* @__PURE__ */
|
|
3093
|
-
|
|
3094
|
-
|
|
3095
|
-
|
|
3096
|
-
|
|
3097
|
-
|
|
3098
|
-
|
|
3099
|
-
|
|
3100
|
-
|
|
3101
|
-
|
|
3102
|
-
|
|
3103
|
-
|
|
3104
|
-
|
|
3105
|
-
|
|
3106
|
-
|
|
3107
|
-
|
|
3108
|
-
|
|
3109
|
-
|
|
3110
|
-
|
|
3111
|
-
|
|
3112
|
-
|
|
3113
|
-
|
|
3114
|
-
|
|
2723
|
+
/* @__PURE__ */ jsx6(
|
|
2724
|
+
"div",
|
|
2725
|
+
{
|
|
2726
|
+
id: historyId,
|
|
2727
|
+
"aria-hidden": !chatsExpanded,
|
|
2728
|
+
inert: !chatsExpanded,
|
|
2729
|
+
className: "grid min-h-0 flex-1 transition-[grid-template-rows,opacity]",
|
|
2730
|
+
style: {
|
|
2731
|
+
gridTemplateRows: chatsExpanded ? "minmax(0, 1fr)" : "minmax(0, 0fr)",
|
|
2732
|
+
opacity: chatsExpanded ? 1 : 0,
|
|
2733
|
+
transitionDuration: `${CHAT_SEARCH_MOTION.listDuration}ms`,
|
|
2734
|
+
transitionTimingFunction: CHAT_SEARCH_MOTION.easing
|
|
2735
|
+
},
|
|
2736
|
+
children: /* @__PURE__ */ jsx6("div", { className: "min-h-0 overflow-hidden", children: /* @__PURE__ */ jsx6("div", { className: "h-full overflow-y-auto", children: /* @__PURE__ */ jsxs6(GlideGroup, { children: [
|
|
2737
|
+
visibleRecents.map((item) => {
|
|
2738
|
+
const active = item.label === selectedTitle;
|
|
2739
|
+
return /* @__PURE__ */ jsx6(
|
|
2740
|
+
"button",
|
|
2741
|
+
{
|
|
2742
|
+
"data-row": true,
|
|
2743
|
+
type: "button",
|
|
2744
|
+
title: item.label,
|
|
2745
|
+
"aria-current": active ? "page" : void 0,
|
|
2746
|
+
onClick: () => {
|
|
2747
|
+
setInternalNav("chats");
|
|
2748
|
+
onNavigate?.("chats");
|
|
2749
|
+
if (activeTitle === void 0) setDemoActiveTitle(item.label);
|
|
2750
|
+
onPick?.(item.id, item.label, item.prompt);
|
|
2751
|
+
},
|
|
2752
|
+
className: `sidebar-row relative z-10 mx-2 flex h-8 items-center rounded-[8px] px-2 text-left transition-[width,background-color,color,transform] duration-150 active:scale-[0.98] ${active ? "bg-[var(--mova-ai-hover-strong,#e9e9e9)] group-hover/glide:bg-transparent" : ""}`,
|
|
2753
|
+
children: /* @__PURE__ */ jsx6("span", { className: `sidebar-copy min-w-0 flex-1 truncate text-[14px] font-medium ${active ? "text-[var(--mova-ai-ink,#202020)]" : "text-[var(--mova-ai-ink-secondary,#666)]"}`, children: item.label })
|
|
2754
|
+
},
|
|
2755
|
+
item.id
|
|
2756
|
+
);
|
|
2757
|
+
}),
|
|
2758
|
+
query && visibleRecents.length === 0 && /* @__PURE__ */ jsx6("div", { className: "sidebar-copy mx-2 px-2 py-2 text-[12.5px] text-[var(--mova-ai-ink-muted,#858585)]", children: "No chats found" })
|
|
2759
|
+
] }) }) })
|
|
2760
|
+
}
|
|
2761
|
+
)
|
|
3115
2762
|
] }),
|
|
3116
|
-
/* @__PURE__ */ jsxs6("div", { inert: collapsed, className: "sidebar-copy mx-2 mt-3 w-[208px] border-t border-[var(--
|
|
2763
|
+
/* @__PURE__ */ jsxs6("div", { inert: collapsed, className: "sidebar-copy mx-2 mt-3 w-[208px] border-t border-[var(--mova-ai-border,#dedede)] pt-3", children: [
|
|
3117
2764
|
/* @__PURE__ */ jsxs6(
|
|
3118
2765
|
"button",
|
|
3119
2766
|
{
|
|
3120
2767
|
type: "button",
|
|
3121
2768
|
onClick: () => {
|
|
3122
|
-
setFeedback(`${footerLabel} selected`);
|
|
3123
2769
|
(onFooterClick ?? onNewChat)?.();
|
|
3124
2770
|
},
|
|
3125
|
-
className: "flex h-8 w-full items-center justify-center gap-1.5 rounded-[8px] bg-[var(--hover-
|
|
2771
|
+
className: "flex h-8 w-full items-center justify-center gap-1.5 rounded-[8px] bg-[var(--mova-ai-hover-strong,#e9e9e9)] text-[12.5px] font-medium text-[var(--mova-ai-ink,#202020)] transition-[background-color,transform] duration-150 hover:bg-[var(--mova-ai-border-strong,#c8c8c8)] active:scale-[0.98]",
|
|
3126
2772
|
children: [
|
|
3127
2773
|
footerIcon,
|
|
3128
2774
|
footerLabel
|
|
3129
2775
|
]
|
|
3130
2776
|
}
|
|
3131
2777
|
),
|
|
3132
|
-
/* @__PURE__ */ jsx6("p", { role: "status", className: "
|
|
2778
|
+
/* @__PURE__ */ jsx6("p", { role: "status", className: "sr-only", children: feedback })
|
|
3133
2779
|
] })
|
|
3134
2780
|
] })
|
|
3135
2781
|
]
|
|
@@ -3140,7 +2786,7 @@ function AISidebarNav({
|
|
|
3140
2786
|
// .generated/ui/ai/ai-sources.tsx
|
|
3141
2787
|
import { ChevronRight, Globe } from "lucide-react";
|
|
3142
2788
|
import { AnimatePresence as AnimatePresence2, motion as motion2, useReducedMotion as useReducedMotion3 } from "framer-motion";
|
|
3143
|
-
import { useId as
|
|
2789
|
+
import { useId as useId3, useState as useState10 } from "react";
|
|
3144
2790
|
import { jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
3145
2791
|
var SPRING_DEFAULT2 = { bounce: 0.1, duration: 0.25, type: "spring" };
|
|
3146
2792
|
var EASE_OUT2 = [0.23, 1, 0.32, 1];
|
|
@@ -3148,6 +2794,7 @@ var STACK_LIMIT = 3;
|
|
|
3148
2794
|
var STACK_OVERLAP_PX = 8;
|
|
3149
2795
|
var FAN_GAP_PX = 3;
|
|
3150
2796
|
var ROW_STAGGER = 0.035;
|
|
2797
|
+
var AI_THEME_STYLES7 = '/* Shared public tokens for the standalone AI component family. */\n.mova-ai-theme {\n color-scheme: light;\n color: var(--mova-ai-ink, #202020);\n font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;\n font-size: 13px;\n line-height: 1.45;\n letter-spacing: -0.01em;\n\n --mova-ai-page: #f7f7f7;\n --mova-ai-canvas: #f4f4f4;\n --mova-ai-surface: #ffffff;\n --mova-ai-inset: #f8f8f8;\n --mova-ai-hover: #f1f1f1;\n --mova-ai-hover-strong: #e9e9e9;\n\n --mova-ai-ink: #202020;\n --mova-ai-ink-secondary: #666666;\n --mova-ai-ink-muted: #858585;\n\n --mova-ai-border: #dedede;\n --mova-ai-border-soft: #ededed;\n --mova-ai-border-strong: #c8c8c8;\n --mova-ai-field: #f6f6f6;\n --mova-ai-grid: color-mix(in srgb, var(--mova-ai-border) 78%, transparent);\n --mova-ai-stripe: rgb(32 35 38 / 7%);\n --mova-ai-stripe-bg: #242424;\n\n --mova-ai-accent: #454545;\n --mova-ai-accent-ink: #333333;\n --mova-ai-accent-foreground: #ffffff;\n --mova-ai-accent-tint: #eeeeee;\n --mova-ai-success: #28734d;\n --mova-ai-success-tint: #e8f3ec;\n --mova-ai-warning: #986517;\n --mova-ai-warning-tint: #f8f0df;\n --mova-ai-danger: #a33c3c;\n --mova-ai-danger-tint: #f7eaea;\n --mova-ai-info: #496b89;\n --mova-ai-info-tint: #eaf0f5;\n --mova-ai-neutral-status: #69737d;\n --mova-ai-status-on: #ffffff;\n\n --mova-ai-tooltip-bg: #292929;\n --mova-ai-tooltip-fg: #f6f6f6;\n --mova-ai-tooltip-muted: #c3c3c3;\n --mova-ai-tooltip-border: #484848;\n\n --mova-ai-radius-panel: 8px;\n --mova-ai-radius-control: 8px;\n --mova-ai-shadow-xs: 0 1px 2px rgb(22 28 33 / 5%);\n --mova-ai-shadow-sm: 0 2px 8px rgb(22 28 33 / 7%);\n --mova-ai-shadow-md: 0 8px 20px rgb(22 28 33 / 11%);\n --mova-ai-shadow-lg: 0 14px 32px rgb(22 28 33 / 15%);\n --mova-ai-shadow-hairline: 0 0 0 1px var(--mova-ai-border);\n --mova-ai-shadow-btn: 0 0 0 1px var(--mova-ai-border-strong), var(--mova-ai-shadow-xs);\n --mova-ai-shadow-card: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-sm);\n --mova-ai-shadow-raised: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-md);\n --mova-ai-shadow-overlay: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-lg);\n --mova-ai-shadow-inset-field: inset 0 1px 2px rgb(22 28 33 / 12%);\n}\n\n.mova-ai-theme[data-theme="dark"] {\n color-scheme: dark;\n --mova-ai-page: #181818;\n --mova-ai-canvas: #202020;\n --mova-ai-surface: #272727;\n --mova-ai-inset: #1d1d1d;\n --mova-ai-hover: #2d2d2d;\n --mova-ai-hover-strong: #393939;\n\n --mova-ai-ink: #eeeeee;\n --mova-ai-ink-secondary: #b5b5b5;\n --mova-ai-ink-muted: #929292;\n\n --mova-ai-border: #3b3b3b;\n --mova-ai-border-soft: #303030;\n --mova-ai-border-strong: #505050;\n --mova-ai-field: #2c2c2c;\n --mova-ai-grid: color-mix(in srgb, var(--mova-ai-border) 78%, transparent);\n --mova-ai-stripe: rgb(255 255 255 / 6%);\n --mova-ai-stripe-bg: #202528;\n\n --mova-ai-accent: #c2c2c2;\n --mova-ai-accent-ink: #d5d5d5;\n --mova-ai-accent-foreground: #202020;\n --mova-ai-accent-tint: #353535;\n --mova-ai-success: #88c7a0;\n --mova-ai-success-tint: #293b30;\n --mova-ai-warning: #d7b66f;\n --mova-ai-warning-tint: #3c3525;\n --mova-ai-danger: #e5928e;\n --mova-ai-danger-tint: #3c2b2b;\n --mova-ai-info: #9bbbd6;\n --mova-ai-info-tint: #293541;\n --mova-ai-neutral-status: #a0a0a0;\n --mova-ai-status-on: #181818;\n\n --mova-ai-tooltip-bg: #121212;\n --mova-ai-tooltip-fg: #eeeeee;\n --mova-ai-tooltip-muted: #b5b5b5;\n --mova-ai-tooltip-border: #3b3b3b;\n\n --mova-ai-shadow-xs: 0 1px 2px rgb(0 0 0 / 22%);\n --mova-ai-shadow-sm: 0 2px 8px rgb(0 0 0 / 25%);\n --mova-ai-shadow-md: 0 8px 20px rgb(0 0 0 / 30%);\n --mova-ai-shadow-lg: 0 14px 32px rgb(0 0 0 / 38%);\n --mova-ai-shadow-hairline: 0 0 0 1px var(--mova-ai-border);\n --mova-ai-shadow-btn: 0 0 0 1px var(--mova-ai-border-strong), var(--mova-ai-shadow-xs);\n --mova-ai-shadow-card: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-sm);\n --mova-ai-shadow-raised: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-md);\n --mova-ai-shadow-overlay: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-lg);\n --mova-ai-shadow-inset-field: inset 0 1px 2px rgb(0 0 0 / 42%);\n}\n';
|
|
3151
2798
|
var hostOf = (url) => {
|
|
3152
2799
|
try {
|
|
3153
2800
|
return new URL(url).hostname.replace(/^www\./, "");
|
|
@@ -3155,25 +2802,26 @@ var hostOf = (url) => {
|
|
|
3155
2802
|
return url;
|
|
3156
2803
|
}
|
|
3157
2804
|
};
|
|
3158
|
-
var Favicon = ({ size, source }) => /* @__PURE__ */ jsxs7("span", { className: "relative flex shrink-0 items-center justify-center overflow-hidden rounded-full border border-border bg-
|
|
2805
|
+
var Favicon = ({ size, source }) => /* @__PURE__ */ jsxs7("span", { className: "relative flex shrink-0 items-center justify-center overflow-hidden rounded-full border border-[var(--mova-ai-border,#dedede)] bg-[var(--mova-ai-surface,#fff)] text-[color:var(--mova-ai-ink-secondary,#666)]", style: { height: size, width: size }, children: [
|
|
3159
2806
|
/* @__PURE__ */ jsx7(Globe, { "aria-hidden": "true", size: size * 0.6 }),
|
|
3160
2807
|
source.favicon ? /* @__PURE__ */ jsx7("span", { className: "absolute inset-0 flex size-full items-center justify-center *:size-full *:object-cover", children: source.favicon }) : null
|
|
3161
2808
|
] });
|
|
3162
|
-
function AISources({ className = "", defaultOpen = false, label = "Sources", sources }) {
|
|
2809
|
+
function AISources({ className = "", defaultOpen = false, label = "Sources", sources, theme = "light" }) {
|
|
3163
2810
|
const shouldReduceMotion = useReducedMotion3();
|
|
3164
2811
|
const [isOpen, setIsOpen] = useState10(defaultOpen);
|
|
3165
2812
|
const [isHovered, setIsHovered] = useState10(false);
|
|
3166
|
-
const listId =
|
|
2813
|
+
const listId = useId3();
|
|
3167
2814
|
const stacked = sources.slice(0, STACK_LIMIT);
|
|
3168
2815
|
const overflow = sources.length - stacked.length;
|
|
3169
2816
|
const fanned = isHovered && !isOpen && !shouldReduceMotion;
|
|
3170
|
-
return /* @__PURE__ */ jsxs7("div", { className: `w-full ${className}`, children: [
|
|
2817
|
+
return /* @__PURE__ */ jsxs7("div", { className: `mova-ai-theme w-full ${className}`, "data-theme": theme, children: [
|
|
2818
|
+
/* @__PURE__ */ jsx7("style", { children: AI_THEME_STYLES7 }),
|
|
3171
2819
|
/* @__PURE__ */ jsxs7(
|
|
3172
2820
|
"button",
|
|
3173
2821
|
{
|
|
3174
2822
|
"aria-expanded": isOpen,
|
|
3175
2823
|
"aria-controls": listId,
|
|
3176
|
-
className: "flex cursor-pointer items-center gap-2 rounded-lg py-1 text-
|
|
2824
|
+
className: "flex cursor-pointer items-center gap-2 rounded-lg py-1 text-[color:var(--mova-ai-ink-secondary,#666)] text-sm transition-colors hover:text-[color:var(--mova-ai-ink,#202020)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--mova-ai-accent,#454545)]",
|
|
3177
2825
|
onBlur: () => setIsHovered(false),
|
|
3178
2826
|
onClick: () => setIsOpen((current) => !current),
|
|
3179
2827
|
onFocus: () => setIsHovered(true),
|
|
@@ -3212,11 +2860,11 @@ function AISources({ className = "", defaultOpen = false, label = "Sources", sou
|
|
|
3212
2860
|
exit: shouldReduceMotion ? { opacity: 0, transition: { duration: 0 } } : { height: 0, opacity: 0 },
|
|
3213
2861
|
initial: shouldReduceMotion ? { height: "auto", opacity: 1 } : { height: 0, opacity: 0 },
|
|
3214
2862
|
transition: shouldReduceMotion ? { duration: 0 } : { height: SPRING_DEFAULT2, opacity: { duration: 0.18, ease: EASE_OUT2 } },
|
|
3215
|
-
children: sources.map((source, index) => /* @__PURE__ */ jsx7(motion2.li, { animate: { opacity: 1, y: 0 }, initial: shouldReduceMotion ? { opacity: 1, y: 0 } : { opacity: 0, y: 4 }, transition: shouldReduceMotion ? { duration: 0 } : { ...SPRING_DEFAULT2, delay: index * ROW_STAGGER }, children: /* @__PURE__ */ jsxs7("a", { className: "flex items-start gap-2.5 rounded-lg px-1 py-1.5 no-underline transition-colors hover:bg-
|
|
2863
|
+
children: sources.map((source, index) => /* @__PURE__ */ jsx7(motion2.li, { animate: { opacity: 1, y: 0 }, initial: shouldReduceMotion ? { opacity: 1, y: 0 } : { opacity: 0, y: 4 }, transition: shouldReduceMotion ? { duration: 0 } : { ...SPRING_DEFAULT2, delay: index * ROW_STAGGER }, children: /* @__PURE__ */ jsxs7("a", { className: "flex items-start gap-2.5 rounded-lg px-1 py-1.5 no-underline transition-colors hover:bg-[var(--mova-ai-hover,#f1f1f1)]", href: source.url, rel: "noopener noreferrer", target: "_blank", children: [
|
|
3216
2864
|
/* @__PURE__ */ jsx7(motion2.span, { className: "mt-0.5 block shrink-0", transition: shouldReduceMotion ? { duration: 0 } : SPRING_DEFAULT2, children: /* @__PURE__ */ jsx7(Favicon, { size: 18, source }) }),
|
|
3217
2865
|
/* @__PURE__ */ jsxs7("span", { className: "min-w-0", children: [
|
|
3218
|
-
/* @__PURE__ */ jsx7("span", { className: "block truncate font-medium text-
|
|
3219
|
-
/* @__PURE__ */ jsx7("span", { className: "block truncate text-
|
|
2866
|
+
/* @__PURE__ */ jsx7("span", { className: "block truncate font-medium text-[color:var(--mova-ai-ink,#202020)] text-sm", children: source.title }),
|
|
2867
|
+
/* @__PURE__ */ jsx7("span", { className: "block truncate text-[color:var(--mova-ai-ink-secondary,#666)] text-xs", children: source.snippet ?? hostOf(source.url) })
|
|
3220
2868
|
] })
|
|
3221
2869
|
] }) }, source.id))
|
|
3222
2870
|
}
|
|
@@ -3272,11 +2920,12 @@ import { Fragment as Fragment3 } from "react";
|
|
|
3272
2920
|
import { jsx as jsx9, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
3273
2921
|
var SPRING_DEFAULT4 = { bounce: 0.1, duration: 0.25, type: "spring" };
|
|
3274
2922
|
var EASE_IN_OUT = [0.645, 0.045, 0.355, 1];
|
|
2923
|
+
var AI_THEME_STYLES8 = '/* Shared public tokens for the standalone AI component family. */\n.mova-ai-theme {\n color-scheme: light;\n color: var(--mova-ai-ink, #202020);\n font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;\n font-size: 13px;\n line-height: 1.45;\n letter-spacing: -0.01em;\n\n --mova-ai-page: #f7f7f7;\n --mova-ai-canvas: #f4f4f4;\n --mova-ai-surface: #ffffff;\n --mova-ai-inset: #f8f8f8;\n --mova-ai-hover: #f1f1f1;\n --mova-ai-hover-strong: #e9e9e9;\n\n --mova-ai-ink: #202020;\n --mova-ai-ink-secondary: #666666;\n --mova-ai-ink-muted: #858585;\n\n --mova-ai-border: #dedede;\n --mova-ai-border-soft: #ededed;\n --mova-ai-border-strong: #c8c8c8;\n --mova-ai-field: #f6f6f6;\n --mova-ai-grid: color-mix(in srgb, var(--mova-ai-border) 78%, transparent);\n --mova-ai-stripe: rgb(32 35 38 / 7%);\n --mova-ai-stripe-bg: #242424;\n\n --mova-ai-accent: #454545;\n --mova-ai-accent-ink: #333333;\n --mova-ai-accent-foreground: #ffffff;\n --mova-ai-accent-tint: #eeeeee;\n --mova-ai-success: #28734d;\n --mova-ai-success-tint: #e8f3ec;\n --mova-ai-warning: #986517;\n --mova-ai-warning-tint: #f8f0df;\n --mova-ai-danger: #a33c3c;\n --mova-ai-danger-tint: #f7eaea;\n --mova-ai-info: #496b89;\n --mova-ai-info-tint: #eaf0f5;\n --mova-ai-neutral-status: #69737d;\n --mova-ai-status-on: #ffffff;\n\n --mova-ai-tooltip-bg: #292929;\n --mova-ai-tooltip-fg: #f6f6f6;\n --mova-ai-tooltip-muted: #c3c3c3;\n --mova-ai-tooltip-border: #484848;\n\n --mova-ai-radius-panel: 8px;\n --mova-ai-radius-control: 8px;\n --mova-ai-shadow-xs: 0 1px 2px rgb(22 28 33 / 5%);\n --mova-ai-shadow-sm: 0 2px 8px rgb(22 28 33 / 7%);\n --mova-ai-shadow-md: 0 8px 20px rgb(22 28 33 / 11%);\n --mova-ai-shadow-lg: 0 14px 32px rgb(22 28 33 / 15%);\n --mova-ai-shadow-hairline: 0 0 0 1px var(--mova-ai-border);\n --mova-ai-shadow-btn: 0 0 0 1px var(--mova-ai-border-strong), var(--mova-ai-shadow-xs);\n --mova-ai-shadow-card: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-sm);\n --mova-ai-shadow-raised: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-md);\n --mova-ai-shadow-overlay: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-lg);\n --mova-ai-shadow-inset-field: inset 0 1px 2px rgb(22 28 33 / 12%);\n}\n\n.mova-ai-theme[data-theme="dark"] {\n color-scheme: dark;\n --mova-ai-page: #181818;\n --mova-ai-canvas: #202020;\n --mova-ai-surface: #272727;\n --mova-ai-inset: #1d1d1d;\n --mova-ai-hover: #2d2d2d;\n --mova-ai-hover-strong: #393939;\n\n --mova-ai-ink: #eeeeee;\n --mova-ai-ink-secondary: #b5b5b5;\n --mova-ai-ink-muted: #929292;\n\n --mova-ai-border: #3b3b3b;\n --mova-ai-border-soft: #303030;\n --mova-ai-border-strong: #505050;\n --mova-ai-field: #2c2c2c;\n --mova-ai-grid: color-mix(in srgb, var(--mova-ai-border) 78%, transparent);\n --mova-ai-stripe: rgb(255 255 255 / 6%);\n --mova-ai-stripe-bg: #202528;\n\n --mova-ai-accent: #c2c2c2;\n --mova-ai-accent-ink: #d5d5d5;\n --mova-ai-accent-foreground: #202020;\n --mova-ai-accent-tint: #353535;\n --mova-ai-success: #88c7a0;\n --mova-ai-success-tint: #293b30;\n --mova-ai-warning: #d7b66f;\n --mova-ai-warning-tint: #3c3525;\n --mova-ai-danger: #e5928e;\n --mova-ai-danger-tint: #3c2b2b;\n --mova-ai-info: #9bbbd6;\n --mova-ai-info-tint: #293541;\n --mova-ai-neutral-status: #a0a0a0;\n --mova-ai-status-on: #181818;\n\n --mova-ai-tooltip-bg: #121212;\n --mova-ai-tooltip-fg: #eeeeee;\n --mova-ai-tooltip-muted: #b5b5b5;\n --mova-ai-tooltip-border: #3b3b3b;\n\n --mova-ai-shadow-xs: 0 1px 2px rgb(0 0 0 / 22%);\n --mova-ai-shadow-sm: 0 2px 8px rgb(0 0 0 / 25%);\n --mova-ai-shadow-md: 0 8px 20px rgb(0 0 0 / 30%);\n --mova-ai-shadow-lg: 0 14px 32px rgb(0 0 0 / 38%);\n --mova-ai-shadow-hairline: 0 0 0 1px var(--mova-ai-border);\n --mova-ai-shadow-btn: 0 0 0 1px var(--mova-ai-border-strong), var(--mova-ai-shadow-xs);\n --mova-ai-shadow-card: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-sm);\n --mova-ai-shadow-raised: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-md);\n --mova-ai-shadow-overlay: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-lg);\n --mova-ai-shadow-inset-field: inset 0 1px 2px rgb(0 0 0 / 42%);\n}\n';
|
|
3275
2924
|
var CHECK_PATH = "M 3.5 7.5 L 6 10 L 10.5 4.5";
|
|
3276
2925
|
var BOX_SIZE = 14;
|
|
3277
2926
|
var UNDERLINE_SECONDS = 1.4;
|
|
3278
|
-
var SUCCESS_COLOR = "
|
|
3279
|
-
var DANGER_COLOR2 = "
|
|
2927
|
+
var SUCCESS_COLOR = "var(--mova-ai-success,#28734d)";
|
|
2928
|
+
var DANGER_COLOR2 = "var(--mova-ai-danger,#a33c3c)";
|
|
3280
2929
|
var flatten = (tasks) => tasks.flatMap((task) => [task, ...flatten(task.children ?? [])]);
|
|
3281
2930
|
var boxStroke = (status) => status === "failed" ? DANGER_COLOR2 : status === "done" ? SUCCESS_COLOR : "currentColor";
|
|
3282
2931
|
function TaskBox({ status, shouldReduceMotion }) {
|
|
@@ -3317,8 +2966,8 @@ function TaskRow({ depth, shouldReduceMotion, task }) {
|
|
|
3317
2966
|
": "
|
|
3318
2967
|
] }),
|
|
3319
2968
|
/* @__PURE__ */ jsx9(TaskBox, { shouldReduceMotion, status: task.status }),
|
|
3320
|
-
/* @__PURE__ */ jsx9("span", { className: "min-w-0 flex-1 break-words text-
|
|
3321
|
-
task.note ? /* @__PURE__ */ jsx9("span", { className: "max-w-[35%] truncate text-
|
|
2969
|
+
/* @__PURE__ */ jsx9("span", { className: "min-w-0 flex-1 break-words text-[color:var(--mova-ai-ink,#202020)] text-xs leading-snug", children: task.label }),
|
|
2970
|
+
task.note ? /* @__PURE__ */ jsx9("span", { className: "max-w-[35%] truncate text-[color:var(--mova-ai-ink-secondary,#666)] text-xs tabular-nums", children: task.note }) : null,
|
|
3322
2971
|
isRunning && !shouldReduceMotion ? /* @__PURE__ */ jsx9(
|
|
3323
2972
|
motion4.span,
|
|
3324
2973
|
{
|
|
@@ -3332,26 +2981,30 @@ function TaskRow({ depth, shouldReduceMotion, task }) {
|
|
|
3332
2981
|
}
|
|
3333
2982
|
);
|
|
3334
2983
|
}
|
|
3335
|
-
function AITaskList({ className = "", label = "Plan", tasks }) {
|
|
2984
|
+
function AITaskList({ className = "", label = "Plan", tasks, theme = "light" }) {
|
|
3336
2985
|
const shouldReduceMotion = Boolean(useReducedMotion5());
|
|
3337
2986
|
const all = flatten(tasks);
|
|
3338
2987
|
const done = all.filter((task) => task.status === "done").length;
|
|
3339
|
-
return /* @__PURE__ */ jsxs9("div", { className: `w-full rounded-lg border border-border bg-
|
|
2988
|
+
return /* @__PURE__ */ jsxs9("div", { className: `mova-ai-theme w-full rounded-lg border border-[var(--mova-ai-border,#dedede)] bg-[var(--mova-ai-surface,#fff)] p-3 ${className}`, "data-theme": theme, children: [
|
|
2989
|
+
/* @__PURE__ */ jsx9("style", { children: AI_THEME_STYLES8 }),
|
|
3340
2990
|
/* @__PURE__ */ jsxs9("div", { className: "mb-1.5 flex items-baseline justify-between", children: [
|
|
3341
|
-
/* @__PURE__ */ jsx9("p", { className: "font-medium text-
|
|
3342
|
-
/* @__PURE__ */ jsxs9("p", { className: "text-
|
|
2991
|
+
/* @__PURE__ */ jsx9("p", { className: "font-medium text-[color:var(--mova-ai-ink,#202020)] text-sm", children: label }),
|
|
2992
|
+
/* @__PURE__ */ jsxs9("p", { className: "text-[color:var(--mova-ai-ink-secondary,#666)] text-xs tabular-nums", children: [
|
|
3343
2993
|
done,
|
|
3344
2994
|
"/",
|
|
3345
2995
|
all.length
|
|
3346
2996
|
] })
|
|
3347
2997
|
] }),
|
|
3348
|
-
/* @__PURE__ */
|
|
2998
|
+
/* @__PURE__ */ jsxs9("style", { children: [
|
|
2999
|
+
AI_THEME_STYLES8,
|
|
3000
|
+
`
|
|
3349
3001
|
.ai-task-draw { stroke-dashoffset: 0; }
|
|
3350
3002
|
@media (prefers-reduced-motion: no-preference) {
|
|
3351
3003
|
.ai-task-draw { animation: ai-task-draw 200ms cubic-bezier(0.23, 1, 0.32, 1) both; }
|
|
3352
3004
|
}
|
|
3353
3005
|
@keyframes ai-task-draw { from { stroke-dashoffset: 1; } to { stroke-dashoffset: 0; } }
|
|
3354
|
-
`
|
|
3006
|
+
`
|
|
3007
|
+
] }),
|
|
3355
3008
|
/* @__PURE__ */ jsx9("ul", { className: "list-none", children: (() => {
|
|
3356
3009
|
const renderTasks = (items2, depth) => items2.map((task) => /* @__PURE__ */ jsxs9(Fragment3, { children: [
|
|
3357
3010
|
/* @__PURE__ */ jsx9(TaskRow, { depth, shouldReduceMotion, task }),
|
|
@@ -3377,6 +3030,7 @@ var CHECK_PATH2 = "M 8.5 12.2 L 11 14.8 L 15.8 9.6";
|
|
|
3377
3030
|
var CROSS_PATHS = ["M 9 9 L 15 15", "M 15 9 L 9 15"];
|
|
3378
3031
|
var SPIN_SECONDS = 0.9;
|
|
3379
3032
|
var PENDING_PULSE_SECONDS = 1.6;
|
|
3033
|
+
var AI_THEME_STYLES9 = '/* Shared public tokens for the standalone AI component family. */\n.mova-ai-theme {\n color-scheme: light;\n color: var(--mova-ai-ink, #202020);\n font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;\n font-size: 13px;\n line-height: 1.45;\n letter-spacing: -0.01em;\n\n --mova-ai-page: #f7f7f7;\n --mova-ai-canvas: #f4f4f4;\n --mova-ai-surface: #ffffff;\n --mova-ai-inset: #f8f8f8;\n --mova-ai-hover: #f1f1f1;\n --mova-ai-hover-strong: #e9e9e9;\n\n --mova-ai-ink: #202020;\n --mova-ai-ink-secondary: #666666;\n --mova-ai-ink-muted: #858585;\n\n --mova-ai-border: #dedede;\n --mova-ai-border-soft: #ededed;\n --mova-ai-border-strong: #c8c8c8;\n --mova-ai-field: #f6f6f6;\n --mova-ai-grid: color-mix(in srgb, var(--mova-ai-border) 78%, transparent);\n --mova-ai-stripe: rgb(32 35 38 / 7%);\n --mova-ai-stripe-bg: #242424;\n\n --mova-ai-accent: #454545;\n --mova-ai-accent-ink: #333333;\n --mova-ai-accent-foreground: #ffffff;\n --mova-ai-accent-tint: #eeeeee;\n --mova-ai-success: #28734d;\n --mova-ai-success-tint: #e8f3ec;\n --mova-ai-warning: #986517;\n --mova-ai-warning-tint: #f8f0df;\n --mova-ai-danger: #a33c3c;\n --mova-ai-danger-tint: #f7eaea;\n --mova-ai-info: #496b89;\n --mova-ai-info-tint: #eaf0f5;\n --mova-ai-neutral-status: #69737d;\n --mova-ai-status-on: #ffffff;\n\n --mova-ai-tooltip-bg: #292929;\n --mova-ai-tooltip-fg: #f6f6f6;\n --mova-ai-tooltip-muted: #c3c3c3;\n --mova-ai-tooltip-border: #484848;\n\n --mova-ai-radius-panel: 8px;\n --mova-ai-radius-control: 8px;\n --mova-ai-shadow-xs: 0 1px 2px rgb(22 28 33 / 5%);\n --mova-ai-shadow-sm: 0 2px 8px rgb(22 28 33 / 7%);\n --mova-ai-shadow-md: 0 8px 20px rgb(22 28 33 / 11%);\n --mova-ai-shadow-lg: 0 14px 32px rgb(22 28 33 / 15%);\n --mova-ai-shadow-hairline: 0 0 0 1px var(--mova-ai-border);\n --mova-ai-shadow-btn: 0 0 0 1px var(--mova-ai-border-strong), var(--mova-ai-shadow-xs);\n --mova-ai-shadow-card: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-sm);\n --mova-ai-shadow-raised: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-md);\n --mova-ai-shadow-overlay: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-lg);\n --mova-ai-shadow-inset-field: inset 0 1px 2px rgb(22 28 33 / 12%);\n}\n\n.mova-ai-theme[data-theme="dark"] {\n color-scheme: dark;\n --mova-ai-page: #181818;\n --mova-ai-canvas: #202020;\n --mova-ai-surface: #272727;\n --mova-ai-inset: #1d1d1d;\n --mova-ai-hover: #2d2d2d;\n --mova-ai-hover-strong: #393939;\n\n --mova-ai-ink: #eeeeee;\n --mova-ai-ink-secondary: #b5b5b5;\n --mova-ai-ink-muted: #929292;\n\n --mova-ai-border: #3b3b3b;\n --mova-ai-border-soft: #303030;\n --mova-ai-border-strong: #505050;\n --mova-ai-field: #2c2c2c;\n --mova-ai-grid: color-mix(in srgb, var(--mova-ai-border) 78%, transparent);\n --mova-ai-stripe: rgb(255 255 255 / 6%);\n --mova-ai-stripe-bg: #202528;\n\n --mova-ai-accent: #c2c2c2;\n --mova-ai-accent-ink: #d5d5d5;\n --mova-ai-accent-foreground: #202020;\n --mova-ai-accent-tint: #353535;\n --mova-ai-success: #88c7a0;\n --mova-ai-success-tint: #293b30;\n --mova-ai-warning: #d7b66f;\n --mova-ai-warning-tint: #3c3525;\n --mova-ai-danger: #e5928e;\n --mova-ai-danger-tint: #3c2b2b;\n --mova-ai-info: #9bbbd6;\n --mova-ai-info-tint: #293541;\n --mova-ai-neutral-status: #a0a0a0;\n --mova-ai-status-on: #181818;\n\n --mova-ai-tooltip-bg: #121212;\n --mova-ai-tooltip-fg: #eeeeee;\n --mova-ai-tooltip-muted: #b5b5b5;\n --mova-ai-tooltip-border: #3b3b3b;\n\n --mova-ai-shadow-xs: 0 1px 2px rgb(0 0 0 / 22%);\n --mova-ai-shadow-sm: 0 2px 8px rgb(0 0 0 / 25%);\n --mova-ai-shadow-md: 0 8px 20px rgb(0 0 0 / 30%);\n --mova-ai-shadow-lg: 0 14px 32px rgb(0 0 0 / 38%);\n --mova-ai-shadow-hairline: 0 0 0 1px var(--mova-ai-border);\n --mova-ai-shadow-btn: 0 0 0 1px var(--mova-ai-border-strong), var(--mova-ai-shadow-xs);\n --mova-ai-shadow-card: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-sm);\n --mova-ai-shadow-raised: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-md);\n --mova-ai-shadow-overlay: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-lg);\n --mova-ai-shadow-inset-field: inset 0 1px 2px rgb(0 0 0 / 42%);\n}\n';
|
|
3380
3034
|
var STATUS_LABEL = {
|
|
3381
3035
|
error: "Failed",
|
|
3382
3036
|
pending: "Queued",
|
|
@@ -3386,7 +3040,7 @@ var STATUS_LABEL = {
|
|
|
3386
3040
|
function AIToolCallBadge({ status, shouldReduceMotion }) {
|
|
3387
3041
|
const isRunning = status === "running";
|
|
3388
3042
|
const isPending = status === "pending";
|
|
3389
|
-
const ringColor = status === "success" ? "
|
|
3043
|
+
const ringColor = status === "success" ? "var(--mova-ai-success,#28734d)" : status === "error" ? "var(--mova-ai-danger,#a33c3c)" : "currentColor";
|
|
3390
3044
|
return /* @__PURE__ */ jsx10("span", { className: "relative flex size-5 shrink-0 items-center justify-center text-muted-foreground", children: /* @__PURE__ */ jsxs10("svg", { "aria-hidden": "true", className: "size-5 overflow-visible", viewBox: `0 0 ${BADGE_VIEWBOX} ${BADGE_VIEWBOX}`, children: [
|
|
3391
3045
|
/* @__PURE__ */ jsx10(
|
|
3392
3046
|
motion5.g,
|
|
@@ -3453,25 +3107,26 @@ function AIToolCallBadge({ status, shouldReduceMotion }) {
|
|
|
3453
3107
|
] })
|
|
3454
3108
|
] }) });
|
|
3455
3109
|
}
|
|
3456
|
-
function AIToolCall({ args, className = "", defaultOpen = false, name, result, status = "pending", summary }) {
|
|
3110
|
+
function AIToolCall({ args, className = "", defaultOpen = false, name, result, status = "pending", summary, theme = "light" }) {
|
|
3457
3111
|
const shouldReduceMotion = useReducedMotion6();
|
|
3458
3112
|
const [isOpen, setIsOpen] = useState11(defaultOpen);
|
|
3459
3113
|
const hasDetail = Boolean(args || result);
|
|
3460
|
-
return /* @__PURE__ */ jsxs10("div", { className: `w-full overflow-hidden rounded-lg border border-border bg-
|
|
3114
|
+
return /* @__PURE__ */ jsxs10("div", { className: `mova-ai-theme w-full overflow-hidden rounded-lg border border-[var(--mova-ai-border,#dedede)] bg-[var(--mova-ai-surface,#fff)] text-[color:var(--mova-ai-ink,#202020)] ${className}`, "data-theme": theme, children: [
|
|
3115
|
+
/* @__PURE__ */ jsx10("style", { children: AI_THEME_STYLES9 }),
|
|
3461
3116
|
/* @__PURE__ */ jsxs10(
|
|
3462
3117
|
"button",
|
|
3463
3118
|
{
|
|
3464
3119
|
"aria-expanded": hasDetail ? isOpen : void 0,
|
|
3465
|
-
className: "flex w-full cursor-pointer items-center gap-2.5 px-3 py-2 text-left disabled:cursor-default focus-visible:outline-2 focus-visible:outline-offset-[-2px] hover:bg-
|
|
3120
|
+
className: "flex w-full cursor-pointer items-center gap-2.5 px-3 py-2 text-left disabled:cursor-default focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--mova-ai-accent,#454545)] hover:bg-[color-mix(in_srgb,var(--mova-ai-hover,#f1f1f1)_70%,transparent)]",
|
|
3466
3121
|
disabled: !hasDetail,
|
|
3467
3122
|
onClick: () => setIsOpen((current) => !current),
|
|
3468
3123
|
type: "button",
|
|
3469
3124
|
children: [
|
|
3470
3125
|
/* @__PURE__ */ jsx10(AIToolCallBadge, { shouldReduceMotion: Boolean(shouldReduceMotion), status }),
|
|
3471
|
-
/* @__PURE__ */ jsx10("span", { className: "min-w-0 flex-1", children: /* @__PURE__ */ jsx10("span", { className: "block truncate font-medium font-mono text-
|
|
3472
|
-
summary ? /* @__PURE__ */ jsx10("span", { className: "max-w-[40%] truncate text-
|
|
3126
|
+
/* @__PURE__ */ jsx10("span", { className: "min-w-0 flex-1", children: /* @__PURE__ */ jsx10("span", { className: "block truncate font-medium font-mono text-[color:var(--mova-ai-ink,#202020)] text-xs", children: name }) }),
|
|
3127
|
+
summary ? /* @__PURE__ */ jsx10("span", { className: "max-w-[40%] truncate text-[color:var(--mova-ai-ink-secondary,#666)] text-xs", children: summary }) : null,
|
|
3473
3128
|
/* @__PURE__ */ jsx10("span", { className: "sr-only", children: STATUS_LABEL[status] }),
|
|
3474
|
-
hasDetail ? /* @__PURE__ */ jsx10(motion5.span, { animate: { rotate: isOpen ? 90 : 0 }, className: "flex size-4 shrink-0 items-center justify-center text-
|
|
3129
|
+
hasDetail ? /* @__PURE__ */ jsx10(motion5.span, { animate: { rotate: isOpen ? 90 : 0 }, className: "flex size-4 shrink-0 items-center justify-center text-[color:var(--mova-ai-ink-secondary,#666666)]", transition: shouldReduceMotion ? { duration: 0 } : SPRING_DEFAULT5, children: /* @__PURE__ */ jsx10(ChevronRight2, { "aria-hidden": "true", size: 14 }) }) : null
|
|
3475
3130
|
]
|
|
3476
3131
|
}
|
|
3477
3132
|
),
|
|
@@ -3483,14 +3138,14 @@ function AIToolCall({ args, className = "", defaultOpen = false, name, result, s
|
|
|
3483
3138
|
exit: shouldReduceMotion ? { opacity: 0, transition: { duration: 0 } } : { height: 0, opacity: 0 },
|
|
3484
3139
|
initial: shouldReduceMotion ? { height: "auto", opacity: 1 } : { height: 0, opacity: 0 },
|
|
3485
3140
|
transition: shouldReduceMotion ? { duration: 0 } : { height: SPRING_DEFAULT5, opacity: { duration: 0.18, ease: EASE_OUT3 } },
|
|
3486
|
-
children: /* @__PURE__ */ jsxs10("div", { className: "space-y-2 border-border border-t px-3 py-2.5 text-xs", children: [
|
|
3141
|
+
children: /* @__PURE__ */ jsxs10("div", { className: "space-y-2 border-[var(--mova-ai-border,#dedede)] border-t px-3 py-2.5 text-xs", children: [
|
|
3487
3142
|
args ? /* @__PURE__ */ jsxs10("div", { children: [
|
|
3488
|
-
/* @__PURE__ */ jsx10("p", { className: "mb-1 text-[10px] text-
|
|
3489
|
-
/* @__PURE__ */ jsx10("div", { className: "overflow-x-auto font-mono text-
|
|
3143
|
+
/* @__PURE__ */ jsx10("p", { className: "mb-1 text-[10px] text-[color:var(--mova-ai-ink-secondary,#666666)] uppercase tracking-wide", children: "Arguments" }),
|
|
3144
|
+
/* @__PURE__ */ jsx10("div", { className: "overflow-x-auto font-mono text-[color:var(--mova-ai-ink,#202020)]", children: args })
|
|
3490
3145
|
] }) : null,
|
|
3491
3146
|
result ? /* @__PURE__ */ jsxs10("div", { children: [
|
|
3492
|
-
/* @__PURE__ */ jsx10("p", { className: "mb-1 text-[10px] text-
|
|
3493
|
-
/* @__PURE__ */ jsx10("div", { className: "overflow-x-auto text-
|
|
3147
|
+
/* @__PURE__ */ jsx10("p", { className: "mb-1 text-[10px] text-[color:var(--mova-ai-ink-secondary,#666666)] uppercase tracking-wide", children: "Result" }),
|
|
3148
|
+
/* @__PURE__ */ jsx10("div", { className: "overflow-x-auto text-[color:var(--mova-ai-ink,#202020)]", children: result })
|
|
3494
3149
|
] }) : null
|
|
3495
3150
|
] })
|
|
3496
3151
|
}
|
|
@@ -3515,9 +3170,10 @@ import { SortableContext, sortableKeyboardCoordinates, useSortable, verticalList
|
|
|
3515
3170
|
import { CSS } from "@dnd-kit/utilities";
|
|
3516
3171
|
import { CalendarClock, FolderKanban, Plus, Tags, UserCheck, Filter, List, Columns3, SlidersHorizontal, ArrowUpDown, ChevronDown, Check } from "lucide-react";
|
|
3517
3172
|
import { AnimatePresence as AnimatePresence5, motion as motion6, useReducedMotion as useReducedMotion7 } from "framer-motion";
|
|
3518
|
-
import { Fragment as Fragment4, createContext, useContext, useEffect as useEffect9, useLayoutEffect as
|
|
3173
|
+
import { Fragment as Fragment4, createContext, useContext, useEffect as useEffect9, useLayoutEffect as useLayoutEffect4, useMemo as useMemo3, useRef as useRef6, useState as useState12, useId as useId4 } from "react";
|
|
3519
3174
|
import { Fragment as Fragment5, jsx as jsx11, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
3520
3175
|
var BOARD_STATUSES = ["backlog", "todo", "in_progress", "in_review", "blocked", "done", "cancelled"];
|
|
3176
|
+
var AI_THEME_STYLES10 = '/* Shared public tokens for the standalone AI component family. */\n.mova-ai-theme {\n color-scheme: light;\n color: var(--mova-ai-ink, #202020);\n font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;\n font-size: 13px;\n line-height: 1.45;\n letter-spacing: -0.01em;\n\n --mova-ai-page: #f7f7f7;\n --mova-ai-canvas: #f4f4f4;\n --mova-ai-surface: #ffffff;\n --mova-ai-inset: #f8f8f8;\n --mova-ai-hover: #f1f1f1;\n --mova-ai-hover-strong: #e9e9e9;\n\n --mova-ai-ink: #202020;\n --mova-ai-ink-secondary: #666666;\n --mova-ai-ink-muted: #858585;\n\n --mova-ai-border: #dedede;\n --mova-ai-border-soft: #ededed;\n --mova-ai-border-strong: #c8c8c8;\n --mova-ai-field: #f6f6f6;\n --mova-ai-grid: color-mix(in srgb, var(--mova-ai-border) 78%, transparent);\n --mova-ai-stripe: rgb(32 35 38 / 7%);\n --mova-ai-stripe-bg: #242424;\n\n --mova-ai-accent: #454545;\n --mova-ai-accent-ink: #333333;\n --mova-ai-accent-foreground: #ffffff;\n --mova-ai-accent-tint: #eeeeee;\n --mova-ai-success: #28734d;\n --mova-ai-success-tint: #e8f3ec;\n --mova-ai-warning: #986517;\n --mova-ai-warning-tint: #f8f0df;\n --mova-ai-danger: #a33c3c;\n --mova-ai-danger-tint: #f7eaea;\n --mova-ai-info: #496b89;\n --mova-ai-info-tint: #eaf0f5;\n --mova-ai-neutral-status: #69737d;\n --mova-ai-status-on: #ffffff;\n\n --mova-ai-tooltip-bg: #292929;\n --mova-ai-tooltip-fg: #f6f6f6;\n --mova-ai-tooltip-muted: #c3c3c3;\n --mova-ai-tooltip-border: #484848;\n\n --mova-ai-radius-panel: 8px;\n --mova-ai-radius-control: 8px;\n --mova-ai-shadow-xs: 0 1px 2px rgb(22 28 33 / 5%);\n --mova-ai-shadow-sm: 0 2px 8px rgb(22 28 33 / 7%);\n --mova-ai-shadow-md: 0 8px 20px rgb(22 28 33 / 11%);\n --mova-ai-shadow-lg: 0 14px 32px rgb(22 28 33 / 15%);\n --mova-ai-shadow-hairline: 0 0 0 1px var(--mova-ai-border);\n --mova-ai-shadow-btn: 0 0 0 1px var(--mova-ai-border-strong), var(--mova-ai-shadow-xs);\n --mova-ai-shadow-card: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-sm);\n --mova-ai-shadow-raised: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-md);\n --mova-ai-shadow-overlay: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-lg);\n --mova-ai-shadow-inset-field: inset 0 1px 2px rgb(22 28 33 / 12%);\n}\n\n.mova-ai-theme[data-theme="dark"] {\n color-scheme: dark;\n --mova-ai-page: #181818;\n --mova-ai-canvas: #202020;\n --mova-ai-surface: #272727;\n --mova-ai-inset: #1d1d1d;\n --mova-ai-hover: #2d2d2d;\n --mova-ai-hover-strong: #393939;\n\n --mova-ai-ink: #eeeeee;\n --mova-ai-ink-secondary: #b5b5b5;\n --mova-ai-ink-muted: #929292;\n\n --mova-ai-border: #3b3b3b;\n --mova-ai-border-soft: #303030;\n --mova-ai-border-strong: #505050;\n --mova-ai-field: #2c2c2c;\n --mova-ai-grid: color-mix(in srgb, var(--mova-ai-border) 78%, transparent);\n --mova-ai-stripe: rgb(255 255 255 / 6%);\n --mova-ai-stripe-bg: #202528;\n\n --mova-ai-accent: #c2c2c2;\n --mova-ai-accent-ink: #d5d5d5;\n --mova-ai-accent-foreground: #202020;\n --mova-ai-accent-tint: #353535;\n --mova-ai-success: #88c7a0;\n --mova-ai-success-tint: #293b30;\n --mova-ai-warning: #d7b66f;\n --mova-ai-warning-tint: #3c3525;\n --mova-ai-danger: #e5928e;\n --mova-ai-danger-tint: #3c2b2b;\n --mova-ai-info: #9bbbd6;\n --mova-ai-info-tint: #293541;\n --mova-ai-neutral-status: #a0a0a0;\n --mova-ai-status-on: #181818;\n\n --mova-ai-tooltip-bg: #121212;\n --mova-ai-tooltip-fg: #eeeeee;\n --mova-ai-tooltip-muted: #b5b5b5;\n --mova-ai-tooltip-border: #3b3b3b;\n\n --mova-ai-shadow-xs: 0 1px 2px rgb(0 0 0 / 22%);\n --mova-ai-shadow-sm: 0 2px 8px rgb(0 0 0 / 25%);\n --mova-ai-shadow-md: 0 8px 20px rgb(0 0 0 / 30%);\n --mova-ai-shadow-lg: 0 14px 32px rgb(0 0 0 / 38%);\n --mova-ai-shadow-hairline: 0 0 0 1px var(--mova-ai-border);\n --mova-ai-shadow-btn: 0 0 0 1px var(--mova-ai-border-strong), var(--mova-ai-shadow-xs);\n --mova-ai-shadow-card: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-sm);\n --mova-ai-shadow-raised: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-md);\n --mova-ai-shadow-overlay: 0 0 0 1px var(--mova-ai-border), var(--mova-ai-shadow-lg);\n --mova-ai-shadow-inset-field: inset 0 1px 2px rgb(0 0 0 / 42%);\n}\n';
|
|
3521
3177
|
var createBoardKeyboardCoordinates = (getHorizontalTarget, onHorizontalTarget) => (event, args) => {
|
|
3522
3178
|
if (event.code !== "ArrowLeft" && event.code !== "ArrowRight") {
|
|
3523
3179
|
onHorizontalTarget(null);
|
|
@@ -3565,13 +3221,13 @@ var createBoardKeyboardCoordinates = (getHorizontalTarget, onHorizontalTarget) =
|
|
|
3565
3221
|
};
|
|
3566
3222
|
};
|
|
3567
3223
|
var STATUS_META = {
|
|
3568
|
-
backlog: { color: "
|
|
3569
|
-
todo: { color: "
|
|
3570
|
-
in_progress: { color: "
|
|
3571
|
-
in_review: { color: "
|
|
3572
|
-
blocked: { color: "
|
|
3573
|
-
done: { color: "
|
|
3574
|
-
cancelled: { color: "
|
|
3224
|
+
backlog: { color: "var(--mova-ai-neutral-status)", label: "Backlog", lane: "border-[var(--mova-ai-border,#3b3b3b)] bg-[var(--mova-ai-canvas,#202020)]", laneOver: "border-[var(--mova-ai-border-strong,#505050)] bg-[var(--mova-ai-hover,#2d2d2d)]" },
|
|
3225
|
+
todo: { color: "var(--mova-ai-neutral-status)", label: "To do", lane: "border-[var(--mova-ai-border,#3b3b3b)] bg-[var(--mova-ai-canvas,#202020)]", laneOver: "border-[var(--mova-ai-border-strong,#505050)] bg-[var(--mova-ai-hover,#2d2d2d)]" },
|
|
3226
|
+
in_progress: { color: "var(--mova-ai-info)", label: "In progress", lane: "border-[var(--mova-ai-border,#3b3b3b)] bg-[var(--mova-ai-canvas,#202020)]", laneOver: "border-[var(--mova-ai-border-strong,#505050)] bg-[var(--mova-ai-hover,#2d2d2d)]" },
|
|
3227
|
+
in_review: { color: "var(--mova-ai-warning)", label: "In review", lane: "border-[var(--mova-ai-border,#3b3b3b)] bg-[var(--mova-ai-canvas,#202020)]", laneOver: "border-[var(--mova-ai-border-strong,#505050)] bg-[var(--mova-ai-hover,#2d2d2d)]" },
|
|
3228
|
+
blocked: { color: "var(--mova-ai-danger)", label: "Blocked", lane: "border-[var(--mova-ai-border,#3b3b3b)] bg-[var(--mova-ai-canvas,#202020)]", laneOver: "border-[var(--mova-ai-border-strong,#505050)] bg-[var(--mova-ai-hover,#2d2d2d)]" },
|
|
3229
|
+
done: { color: "var(--mova-ai-success)", label: "Done", lane: "border-[var(--mova-ai-border,#3b3b3b)] bg-[var(--mova-ai-canvas,#202020)]", laneOver: "border-[var(--mova-ai-border-strong,#505050)] bg-[var(--mova-ai-hover,#2d2d2d)]" },
|
|
3230
|
+
cancelled: { color: "var(--mova-ai-neutral-status)", label: "Cancelled", lane: "border-[var(--mova-ai-border,#3b3b3b)] bg-[var(--mova-ai-canvas,#202020)]", laneOver: "border-[var(--mova-ai-border-strong,#505050)] bg-[var(--mova-ai-hover,#2d2d2d)]" }
|
|
3575
3231
|
};
|
|
3576
3232
|
var DEFAULT_ISSUES = [
|
|
3577
3233
|
{ id: "R6Z-141", title: "Retire legacy Node backend, CLI, and MCP authorities", status: "backlog", priority: "high", assignee: "Noah", project: "Rudder-dev", labels: ["Feature"], created: "Aug 20" },
|
|
@@ -3598,7 +3254,7 @@ function StatusIcon({ status }) {
|
|
|
3598
3254
|
] }) : null,
|
|
3599
3255
|
status === "done" ? /* @__PURE__ */ jsxs11(Fragment5, { children: [
|
|
3600
3256
|
/* @__PURE__ */ jsx11("circle", { cx: "8", cy: "8", r: "6.5", fill: "currentColor" }),
|
|
3601
|
-
/* @__PURE__ */ jsx11("path", { d: "M4.75 8.25 7 10.5l4.25-5", stroke: "
|
|
3257
|
+
/* @__PURE__ */ jsx11("path", { d: "M4.75 8.25 7 10.5l4.25-5", stroke: "var(--mova-ai-status-on,#fff)", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" })
|
|
3602
3258
|
] }) : null,
|
|
3603
3259
|
status === "cancelled" ? /* @__PURE__ */ jsxs11(Fragment5, { children: [
|
|
3604
3260
|
/* @__PURE__ */ jsx11("circle", { cx: "8", cy: "8", r: "6", fill: "currentColor", opacity: "0.16" }),
|
|
@@ -3613,29 +3269,27 @@ function StatusIcon({ status }) {
|
|
|
3613
3269
|
}
|
|
3614
3270
|
function PriorityIcon({ priority }) {
|
|
3615
3271
|
const active = priority === "critical" ? 4 : priority === "high" ? 3 : priority === "medium" ? 2 : 1;
|
|
3616
|
-
const tone = priority === "critical"
|
|
3272
|
+
const tone = priority === "critical" ? "var(--mova-ai-danger)" : priority === "high" ? "var(--mova-ai-warning)" : priority === "medium" ? "var(--mova-ai-info)" : "var(--mova-ai-neutral-status)";
|
|
3617
3273
|
const heights = [4, 6, 10, 14];
|
|
3618
|
-
return /* @__PURE__ */ jsx11("span", { className:
|
|
3274
|
+
return /* @__PURE__ */ jsx11("span", { className: "inline-flex h-3.5 w-4 items-end gap-[2px]", style: { color: tone }, "aria-hidden": "true", children: heights.map((height, index) => /* @__PURE__ */ jsx11("span", { className: "w-[3px] rounded-[1px] bg-current", style: { height: `${height}px`, opacity: index < active ? 1 : 0.25 } }, height)) });
|
|
3619
3275
|
}
|
|
3620
3276
|
var DISPLAY_FIELDS = ["Identifier", "Priority", "Assignee", "Reviewer", "Labels", "Project", "Updated", "Created"];
|
|
3621
3277
|
var DisplayContext = createContext(DISPLAY_FIELDS.filter((field) => field !== "Updated"));
|
|
3622
3278
|
function MemberAvatar({ name }) {
|
|
3623
|
-
|
|
3624
|
-
const color = palette[Array.from(name).reduce((sum, letter) => sum + letter.charCodeAt(0), 0) % palette.length];
|
|
3625
|
-
return /* @__PURE__ */ jsx11("span", { "aria-hidden": "true", className: "inline-flex h-4 w-4 shrink-0 items-center justify-center rounded-full text-[9px] font-semibold text-[#17201e]", style: { backgroundColor: color }, children: name.slice(0, 1) });
|
|
3279
|
+
return /* @__PURE__ */ jsx11("span", { "aria-hidden": "true", className: "inline-flex h-4 w-4 shrink-0 items-center justify-center rounded-full bg-[var(--mova-ai-hover-strong,#e9e9e9)] text-[9px] font-semibold text-[color:var(--mova-ai-ink,#202020)]", children: name.slice(0, 1) });
|
|
3626
3280
|
}
|
|
3627
3281
|
function IssueListRow({ issue }) {
|
|
3628
3282
|
const display = useContext(DisplayContext);
|
|
3629
|
-
return /* @__PURE__ */ jsxs11("article", { className: "rudder-list-row border-b border-
|
|
3283
|
+
return /* @__PURE__ */ jsxs11("article", { className: "rudder-list-row border-b border-[var(--mova-ai-border-soft,#ededed)] px-4 py-3", "data-testid": `issue-row-${issue.id}`, children: [
|
|
3630
3284
|
/* @__PURE__ */ jsxs11("div", { className: "flex min-w-0 items-start gap-2.5", children: [
|
|
3631
3285
|
/* @__PURE__ */ jsxs11("span", { className: "mt-0.5", title: STATUS_META[issue.status].label, children: [
|
|
3632
3286
|
/* @__PURE__ */ jsx11("span", { className: "sr-only", children: STATUS_META[issue.status].label }),
|
|
3633
3287
|
/* @__PURE__ */ jsx11(StatusIcon, { status: issue.status })
|
|
3634
3288
|
] }),
|
|
3635
|
-
display.includes("Identifier") ? /* @__PURE__ */ jsx11("span", { className: "shrink-0 pt-0.5 font-mono text-xs text-[
|
|
3636
|
-
/* @__PURE__ */ jsx11("h3", { className: "min-w-0 flex-1 break-words text-sm font-medium leading-relaxed text-[
|
|
3289
|
+
display.includes("Identifier") ? /* @__PURE__ */ jsx11("span", { className: "shrink-0 pt-0.5 font-mono text-xs text-[color:var(--mova-ai-ink-muted,#858585)]", children: issue.id }) : null,
|
|
3290
|
+
/* @__PURE__ */ jsx11("h3", { className: "min-w-0 flex-1 break-words text-sm font-medium leading-relaxed text-[color:var(--mova-ai-ink,#202020)]", children: issue.title })
|
|
3637
3291
|
] }),
|
|
3638
|
-
/* @__PURE__ */ jsxs11("div", { className: "rudder-list-meta flex min-w-0 flex-wrap items-center gap-x-3 gap-y-2 text-xs text-[
|
|
3292
|
+
/* @__PURE__ */ jsxs11("div", { className: "rudder-list-meta flex min-w-0 flex-wrap items-center gap-x-3 gap-y-2 text-xs text-[color:var(--mova-ai-ink-secondary,#666)]", children: [
|
|
3639
3293
|
display.includes("Priority") ? /* @__PURE__ */ jsxs11("span", { title: `${issue.priority} priority`, children: [
|
|
3640
3294
|
/* @__PURE__ */ jsxs11("span", { className: "sr-only", children: [
|
|
3641
3295
|
issue.priority,
|
|
@@ -3643,8 +3297,8 @@ function IssueListRow({ issue }) {
|
|
|
3643
3297
|
] }),
|
|
3644
3298
|
/* @__PURE__ */ jsx11(PriorityIcon, { priority: issue.priority })
|
|
3645
3299
|
] }) : null,
|
|
3646
|
-
display.includes("Labels") ? issue.labels.map((label) => /* @__PURE__ */ jsxs11("span", { className: "inline-flex max-w-full items-center gap-1.5 rounded-full border border-
|
|
3647
|
-
/* @__PURE__ */ jsx11("span", { className: "h-1.5 w-1.5 shrink-0 rounded-full bg-
|
|
3300
|
+
display.includes("Labels") ? issue.labels.map((label) => /* @__PURE__ */ jsxs11("span", { className: "inline-flex max-w-full items-center gap-1.5 rounded-full border border-[var(--mova-ai-border,#dedede)] px-2 py-0.5", children: [
|
|
3301
|
+
/* @__PURE__ */ jsx11("span", { className: "h-1.5 w-1.5 shrink-0 rounded-full bg-[var(--mova-ai-neutral-status,#69737d)]" }),
|
|
3648
3302
|
/* @__PURE__ */ jsx11("span", { className: "break-words", children: label })
|
|
3649
3303
|
] }, label)) : null,
|
|
3650
3304
|
display.includes("Assignee") ? /* @__PURE__ */ jsxs11("span", { className: "inline-flex min-w-0 items-center gap-1.5", children: [
|
|
@@ -3668,18 +3322,18 @@ function IssueCardBody({ issue }) {
|
|
|
3668
3322
|
const display = useContext(DisplayContext);
|
|
3669
3323
|
return /* @__PURE__ */ jsxs11("div", { className: "min-w-0", children: [
|
|
3670
3324
|
/* @__PURE__ */ jsxs11("div", { className: "flex min-w-0 items-start gap-2", children: [
|
|
3671
|
-
/* @__PURE__ */ jsx11("span", { className: "min-w-0 flex-1 font-mono text-xs text-[
|
|
3672
|
-
display.includes("Assignee") ? /* @__PURE__ */ jsxs11("span", { className: "inline-flex min-w-0 max-w-[8.5rem] shrink items-center gap-1 overflow-hidden text-xs text-[
|
|
3325
|
+
/* @__PURE__ */ jsx11("span", { className: "min-w-0 flex-1 font-mono text-xs text-[color:var(--mova-ai-ink-muted,#858585)]", children: display.includes("Identifier") ? issue.id : "" }),
|
|
3326
|
+
display.includes("Assignee") ? /* @__PURE__ */ jsxs11("span", { className: "inline-flex min-w-0 max-w-[8.5rem] shrink items-center gap-1 overflow-hidden text-xs text-[color:var(--mova-ai-ink-secondary,#666)]", children: [
|
|
3673
3327
|
/* @__PURE__ */ jsx11(MemberAvatar, { name: issue.assignee }),
|
|
3674
3328
|
/* @__PURE__ */ jsx11("span", { className: "truncate", children: issue.assignee })
|
|
3675
3329
|
] }) : null
|
|
3676
3330
|
] }),
|
|
3677
|
-
/* @__PURE__ */ jsx11("p", { className: "mt-2 break-words text-sm leading-snug text-[
|
|
3678
|
-
display.includes("Priority") ? /* @__PURE__ */ jsxs11("div", { className: "mt-2 flex min-w-0 items-center gap-1.5 overflow-hidden text-xs text-[
|
|
3331
|
+
/* @__PURE__ */ jsx11("p", { className: "mt-2 break-words text-sm leading-snug text-[color:var(--mova-ai-ink,#202020)]", children: issue.title }),
|
|
3332
|
+
display.includes("Priority") ? /* @__PURE__ */ jsxs11("div", { className: "mt-2 flex min-w-0 items-center gap-1.5 overflow-hidden text-xs text-[color:var(--mova-ai-ink-muted,#858585)]", children: [
|
|
3679
3333
|
/* @__PURE__ */ jsx11(PriorityIcon, { priority: issue.priority }),
|
|
3680
3334
|
/* @__PURE__ */ jsx11("span", { className: "capitalize", children: issue.priority })
|
|
3681
3335
|
] }) : null,
|
|
3682
|
-
/* @__PURE__ */ jsxs11("div", { className: "mt-2 space-y-1.5 border-t border-
|
|
3336
|
+
/* @__PURE__ */ jsxs11("div", { className: "mt-2 space-y-1.5 border-t border-[var(--mova-ai-border-soft,#ededed)] pt-2 text-xs text-[color:var(--mova-ai-ink-muted,#858585)]", children: [
|
|
3683
3337
|
display.includes("Project") ? /* @__PURE__ */ jsxs11("div", { className: "grid min-w-0 grid-cols-[4.5rem_minmax(0,1fr)] items-center gap-2", children: [
|
|
3684
3338
|
/* @__PURE__ */ jsxs11("span", { className: "inline-flex items-center gap-1.5", children: [
|
|
3685
3339
|
/* @__PURE__ */ jsx11(FolderKanban, { className: "h-3 w-3" }),
|
|
@@ -3699,8 +3353,8 @@ function IssueCardBody({ issue }) {
|
|
|
3699
3353
|
/* @__PURE__ */ jsx11(Tags, { className: "h-3 w-3" }),
|
|
3700
3354
|
"Labels"
|
|
3701
3355
|
] }),
|
|
3702
|
-
/* @__PURE__ */ jsx11("span", { className: "truncate text-right", children: /* @__PURE__ */ jsxs11("span", { className: "inline-flex items-center gap-1 rounded-full border border-
|
|
3703
|
-
/* @__PURE__ */ jsx11("span", { className: "h-1.5 w-1.5 rounded-full bg-
|
|
3356
|
+
/* @__PURE__ */ jsx11("span", { className: "truncate text-right", children: /* @__PURE__ */ jsxs11("span", { className: "inline-flex items-center gap-1 rounded-full border border-[var(--mova-ai-border,#dedede)] px-1.5 py-0.5 text-[10px]", children: [
|
|
3357
|
+
/* @__PURE__ */ jsx11("span", { className: "h-1.5 w-1.5 rounded-full bg-[var(--mova-ai-neutral-status,#69737d)]" }),
|
|
3704
3358
|
issue.labels[0] ?? "None"
|
|
3705
3359
|
] }) })
|
|
3706
3360
|
] }) : null,
|
|
@@ -3727,7 +3381,7 @@ function SortableIssueCard({ issue }) {
|
|
|
3727
3381
|
style: { transform: CSS.Transform.toString(transform), transition: transition2 },
|
|
3728
3382
|
...attributes,
|
|
3729
3383
|
...listeners,
|
|
3730
|
-
className: `motion-kanban-card cursor-grab touch-pan-x overflow-hidden rounded-[9px] border border-
|
|
3384
|
+
className: `motion-kanban-card cursor-grab touch-pan-x overflow-hidden rounded-[9px] border border-[var(--mova-ai-border,#dedede)] bg-[var(--mova-ai-surface,#fff)] p-2.5 outline-none transition-[box-shadow,opacity,border-color] motion-reduce:transition-none focus-visible:border-[var(--mova-ai-border-strong,#c8c8c8)] focus-visible:ring-2 focus-visible:ring-[var(--mova-ai-border-strong,#c8c8c8)] active:cursor-grabbing ${isDragging ? "opacity-25" : "hover:border-[var(--mova-ai-border-strong,#c8c8c8)] hover:shadow-sm"}`,
|
|
3731
3385
|
"data-dragging": isDragging ? "true" : "false",
|
|
3732
3386
|
"data-issue-id": issue.id,
|
|
3733
3387
|
"data-testid": `kanban-card-${issue.id}`,
|
|
@@ -3741,9 +3395,9 @@ function BoardColumn({ issues, status, onCreate }) {
|
|
|
3741
3395
|
return /* @__PURE__ */ jsxs11("div", { className: "flex min-h-0 w-[260px] min-w-[260px] shrink-0 flex-col", children: [
|
|
3742
3396
|
/* @__PURE__ */ jsxs11("div", { className: "mb-1 flex items-center gap-2 px-2 py-2", children: [
|
|
3743
3397
|
/* @__PURE__ */ jsx11(StatusIcon, { status }),
|
|
3744
|
-
/* @__PURE__ */ jsx11("span", { className: "text-xs font-semibold uppercase tracking-wide text-[
|
|
3745
|
-
/* @__PURE__ */ jsx11("span", { className: "ml-auto text-xs tabular-nums text-[
|
|
3746
|
-
/* @__PURE__ */ jsx11("button", { type: "button", onClick: (event) => onCreate(status, event.currentTarget), "aria-label": `Create issue in ${meta.label}`, className: "rounded p-1 hover:bg-
|
|
3398
|
+
/* @__PURE__ */ jsx11("span", { className: "text-xs font-semibold uppercase tracking-wide text-[color:var(--mova-ai-ink-secondary,#666)]", children: meta.label }),
|
|
3399
|
+
/* @__PURE__ */ jsx11("span", { className: "ml-auto text-xs tabular-nums text-[color:var(--mova-ai-ink-muted,#858585)]", children: issues.length }),
|
|
3400
|
+
/* @__PURE__ */ jsx11("button", { type: "button", onClick: (event) => onCreate(status, event.currentTarget), "aria-label": `Create issue in ${meta.label}`, className: "rounded p-1 hover:bg-[var(--mova-ai-hover-strong,#e9e9e9)] focus-visible:ring-2 focus-visible:ring-[var(--mova-ai-border-strong,#c8c8c8)]", children: /* @__PURE__ */ jsx11(Plus, { className: "h-3.5 w-3.5 text-[color:var(--mova-ai-ink-muted,#858585)]", "aria-hidden": "true" }) })
|
|
3747
3401
|
] }),
|
|
3748
3402
|
/* @__PURE__ */ jsx11(
|
|
3749
3403
|
"div",
|
|
@@ -3762,9 +3416,9 @@ function HiddenStatus({ status, onCreate }) {
|
|
|
3762
3416
|
const meta = STATUS_META[status];
|
|
3763
3417
|
return /* @__PURE__ */ jsxs11("div", { ref: setNodeRef, className: `motion-kanban-lane flex items-center gap-2 rounded-[9px] border px-2 py-2 transition-colors motion-reduce:transition-none ${isOver ? meta.laneOver : meta.lane}`, "data-over": isOver ? "true" : "false", "data-testid": `kanban-hidden-column-${status}`, children: [
|
|
3764
3418
|
/* @__PURE__ */ jsx11(StatusIcon, { status }),
|
|
3765
|
-
/* @__PURE__ */ jsx11("span", { className: "min-w-0 flex-1 text-xs font-semibold uppercase tracking-wide text-[
|
|
3766
|
-
/* @__PURE__ */ jsx11("span", { className: "text-xs tabular-nums text-[
|
|
3767
|
-
/* @__PURE__ */ jsx11("button", { type: "button", onClick: (event) => onCreate(status, event.currentTarget), "aria-label": `Create issue in ${meta.label}`, className: "rounded p-1 hover:bg-
|
|
3419
|
+
/* @__PURE__ */ jsx11("span", { className: "min-w-0 flex-1 text-xs font-semibold uppercase tracking-wide text-[color:var(--mova-ai-ink-secondary,#666)]", children: meta.label }),
|
|
3420
|
+
/* @__PURE__ */ jsx11("span", { className: "text-xs tabular-nums text-[color:var(--mova-ai-ink-muted,#858585)]", children: "0" }),
|
|
3421
|
+
/* @__PURE__ */ jsx11("button", { type: "button", onClick: (event) => onCreate(status, event.currentTarget), "aria-label": `Create issue in ${meta.label}`, className: "rounded p-1 hover:bg-[var(--mova-ai-hover-strong,#e9e9e9)] focus-visible:ring-2 focus-visible:ring-[var(--mova-ai-border-strong,#c8c8c8)]", children: /* @__PURE__ */ jsx11(Plus, { className: "h-3.5 w-3.5 text-[color:var(--mova-ai-ink-muted,#858585)]", "aria-hidden": "true" }) })
|
|
3768
3422
|
] });
|
|
3769
3423
|
}
|
|
3770
3424
|
function ToolbarPopover({ label, icon, children, triggerRef }) {
|
|
@@ -3773,8 +3427,8 @@ function ToolbarPopover({ label, icon, children, triggerRef }) {
|
|
|
3773
3427
|
const root = useRef6(null);
|
|
3774
3428
|
const trigger = useRef6(null);
|
|
3775
3429
|
const panel = useRef6(null);
|
|
3776
|
-
const id =
|
|
3777
|
-
|
|
3430
|
+
const id = useId4();
|
|
3431
|
+
useLayoutEffect4(() => {
|
|
3778
3432
|
if (!open) return;
|
|
3779
3433
|
const container = root.current;
|
|
3780
3434
|
const popup = panel.current;
|
|
@@ -3827,12 +3481,12 @@ function ToolbarPopover({ label, icon, children, triggerRef }) {
|
|
|
3827
3481
|
/* @__PURE__ */ jsxs11("button", { ref: (node) => {
|
|
3828
3482
|
trigger.current = node;
|
|
3829
3483
|
if (triggerRef) triggerRef.current = node;
|
|
3830
|
-
}, type: "button", "aria-label": label === "Sort" ? "Sort issues" : label === "Filter" ? "Filter issues by status" : "Display fields", "aria-expanded": open, "aria-controls": id, onClick: () => setOpen((value) => !value), className: `flex items-center gap-1.5 rounded-md px-2 py-1.5 transition-colors hover:bg-
|
|
3484
|
+
}, type: "button", "aria-label": label === "Sort" ? "Sort issues" : label === "Filter" ? "Filter issues by status" : "Display fields", "aria-expanded": open, "aria-controls": id, onClick: () => setOpen((value) => !value), className: `flex items-center gap-1.5 rounded-md px-2 py-1.5 transition-colors hover:bg-[var(--mova-ai-hover,#f1f1f1)] ${open ? "bg-[var(--mova-ai-hover-strong,#e9e9e9)] text-[color:var(--mova-ai-ink,#202020)]" : ""}`, children: [
|
|
3831
3485
|
icon,
|
|
3832
3486
|
label,
|
|
3833
3487
|
/* @__PURE__ */ jsx11(ChevronDown, { className: "h-3 w-3" })
|
|
3834
3488
|
] }),
|
|
3835
|
-
/* @__PURE__ */ jsx11(AnimatePresence5, { initial: false, children: open ? /* @__PURE__ */ jsx11(motion6.div, { ref: panel, id, role: "group", "aria-label": `${label} options`, initial: { opacity: 0, y: reducedMotion ? 0 : -4 }, animate: { opacity: 1, y: 0 }, exit: { opacity: 0, y: reducedMotion ? 0 : -3 }, transition: { duration: reducedMotion ? 0 : 0.16, ease: [0.22, 1, 0.36, 1] }, className: "absolute right-0 z-30 mt-2 w-48 space-y-1 rounded-lg border border-
|
|
3489
|
+
/* @__PURE__ */ jsx11(AnimatePresence5, { initial: false, children: open ? /* @__PURE__ */ jsx11(motion6.div, { ref: panel, id, role: "group", "aria-label": `${label} options`, initial: { opacity: 0, y: reducedMotion ? 0 : -4 }, animate: { opacity: 1, y: 0 }, exit: { opacity: 0, y: reducedMotion ? 0 : -3 }, transition: { duration: reducedMotion ? 0 : 0.16, ease: [0.22, 1, 0.36, 1] }, className: "absolute right-0 z-30 mt-2 w-48 space-y-1 rounded-lg border border-[var(--mova-ai-border,#dedede)] bg-[var(--mova-ai-surface,#fff)] p-2 text-xs shadow-xl", children }, "panel") : null })
|
|
3836
3490
|
] });
|
|
3837
3491
|
}
|
|
3838
3492
|
function resolveTargetStatus(overId, issues) {
|
|
@@ -3841,7 +3495,7 @@ function resolveTargetStatus(overId, issues) {
|
|
|
3841
3495
|
}
|
|
3842
3496
|
function RudderIssueBoard({ theme = "dark", className = "", initialIssues = DEFAULT_ISSUES, onIssuesChange }) {
|
|
3843
3497
|
const rootRef = useRef6(null);
|
|
3844
|
-
const sortGroupId =
|
|
3498
|
+
const sortGroupId = useId4();
|
|
3845
3499
|
const keyboardTargetRef = useRef6(null);
|
|
3846
3500
|
const [issues, setIssues] = useState12(() => [...initialIssues]);
|
|
3847
3501
|
const [statusFilter, setStatusFilter] = useState12("all");
|
|
@@ -3993,9 +3647,11 @@ function RudderIssueBoard({ theme = "dark", className = "", initialIssues = DEFA
|
|
|
3993
3647
|
setAnnouncement(`${movingIssue.id} stayed in ${STATUS_META[targetStatus].label}.`);
|
|
3994
3648
|
}
|
|
3995
3649
|
};
|
|
3996
|
-
return /* @__PURE__ */ jsxs11("section", { ref: rootRef, "data-theme": theme, className: `rudder-board w-full min-w-0 min-h-[620px] bg-[
|
|
3997
|
-
/* @__PURE__ */
|
|
3998
|
-
|
|
3650
|
+
return /* @__PURE__ */ jsxs11("section", { ref: rootRef, "data-theme": theme, className: `mova-ai-theme rudder-board w-full min-w-0 min-h-[620px] bg-[var(--mova-ai-canvas,#202020)] text-[color:var(--mova-ai-ink,#eeeeee)] ${className}`, "aria-label": "Rudder issue board", children: [
|
|
3651
|
+
/* @__PURE__ */ jsxs11("style", { children: [
|
|
3652
|
+
AI_THEME_STYLES10,
|
|
3653
|
+
`
|
|
3654
|
+
.rudder-board :is(button,input,select,summary):focus-visible { outline: 2px solid var(--mova-ai-accent,#c2c2c2); outline-offset: 2px; }
|
|
3999
3655
|
.rudder-board { container-type: inline-size; }
|
|
4000
3656
|
.rudder-list-row { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 40%); align-items: start; gap: 16px; }
|
|
4001
3657
|
.rudder-list-meta { justify-content: flex-end; padding-top: 2px; }
|
|
@@ -4003,15 +3659,6 @@ function RudderIssueBoard({ theme = "dark", className = "", initialIssues = DEFA
|
|
|
4003
3659
|
.rudder-list-row { grid-template-columns: minmax(0, 1fr); gap: 8px; }
|
|
4004
3660
|
.rudder-list-meta { justify-content: flex-start; padding-left: 26px; }
|
|
4005
3661
|
}
|
|
4006
|
-
.rudder-board[data-theme="light"] { background: #f7f7f5; color: #252523; }
|
|
4007
|
-
.rudder-board[data-theme="light"] [class*="border-white"] { border-color: #deded9; }
|
|
4008
|
-
.rudder-board[data-theme="light"] [class*="text-[#ececea]"],
|
|
4009
|
-
.rudder-board[data-theme="light"] [class*="text-white"] { color: #252523; }
|
|
4010
|
-
.rudder-board[data-theme="light"] :is([class*="text-[#a"], [class*="text-[#8"]) { color: #64645e; }
|
|
4011
|
-
.rudder-board[data-theme="light"] :is([class*="bg-[#242423]"], [class*="bg-[#2c2c29]"], [class*="bg-[#22221f]"]) { background-color: #fff; }
|
|
4012
|
-
.rudder-board[data-theme="light"] .motion-kanban-lane { background-color: #efefeb; }
|
|
4013
|
-
.rudder-board[data-theme="light"] [data-over="true"] { background-color: #e1e9de; }
|
|
4014
|
-
.rudder-board[data-theme="light"] [aria-pressed="true"] { background-color: #e6e6e0; color: #252523; }
|
|
4015
3662
|
@media (prefers-reduced-motion: reduce) {
|
|
4016
3663
|
.motion-kanban-card,
|
|
4017
3664
|
.motion-kanban-lane {
|
|
@@ -4019,36 +3666,37 @@ function RudderIssueBoard({ theme = "dark", className = "", initialIssues = DEFA
|
|
|
4019
3666
|
transition: none !important;
|
|
4020
3667
|
}
|
|
4021
3668
|
}
|
|
4022
|
-
`
|
|
3669
|
+
`
|
|
3670
|
+
] }),
|
|
4023
3671
|
/* @__PURE__ */ jsx11("p", { className: "sr-only", "aria-live": "assertive", children: announcement }),
|
|
4024
|
-
/* @__PURE__ */ jsxs11("div", { className: "flex flex-wrap items-center gap-2 border-b border-
|
|
4025
|
-
/* @__PURE__ */ jsx11("h2", { className: "mr-auto text-xs font-medium uppercase tracking-[0.16em] text-[
|
|
3672
|
+
/* @__PURE__ */ jsxs11("div", { className: "flex flex-wrap items-center gap-2 border-b border-[var(--mova-ai-border,#dedede)] px-4 py-3 text-xs text-[color:var(--mova-ai-ink-secondary,#666)]", children: [
|
|
3673
|
+
/* @__PURE__ */ jsx11("h2", { className: "mr-auto text-xs font-medium uppercase tracking-[0.16em] text-[color:var(--mova-ai-ink-secondary,#666)]", children: "Issues" }),
|
|
4026
3674
|
/* @__PURE__ */ jsxs11("div", { className: "flex flex-wrap items-center justify-end gap-1", children: [
|
|
4027
|
-
/* @__PURE__ */ jsxs11("button", { type: "button", "aria-label": "Show working issues", "aria-pressed": statusFilter === "in_progress", onClick: () => setStatusFilter((value) => value === "in_progress" ? "all" : "in_progress"), className: `mr-1 rounded-md border border-
|
|
3675
|
+
/* @__PURE__ */ jsxs11("button", { type: "button", "aria-label": "Show working issues", "aria-pressed": statusFilter === "in_progress", onClick: () => setStatusFilter((value) => value === "in_progress" ? "all" : "in_progress"), className: `mr-1 rounded-md border border-[var(--mova-ai-border,#dedede)] px-2.5 py-1.5 tabular-nums transition-colors hover:bg-[var(--mova-ai-hover,#f1f1f1)] ${statusFilter === "in_progress" ? "bg-[var(--mova-ai-hover-strong,#e9e9e9)] text-[color:var(--mova-ai-ink,#202020)]" : ""}`, children: [
|
|
4028
3676
|
issues.filter((issue) => issue.status === "in_progress").length,
|
|
4029
3677
|
" working"
|
|
4030
3678
|
] }),
|
|
4031
|
-
/* @__PURE__ */ jsxs11("div", { className: "mr-1 flex rounded-md border border-
|
|
4032
|
-
/* @__PURE__ */ jsx11("button", { type: "button", "aria-label": "List view", "aria-pressed": view === "list", onClick: () => setView("list"), className: `rounded p-1 transition-colors ${view === "list" ? "bg-
|
|
4033
|
-
/* @__PURE__ */ jsx11("button", { type: "button", "aria-label": "Board view", "aria-pressed": view === "board", onClick: () => setView("board"), className: `rounded p-1 transition-colors ${view === "board" ? "bg-
|
|
3679
|
+
/* @__PURE__ */ jsxs11("div", { className: "mr-1 flex rounded-md border border-[var(--mova-ai-border,#dedede)] p-0.5", children: [
|
|
3680
|
+
/* @__PURE__ */ jsx11("button", { type: "button", "aria-label": "List view", "aria-pressed": view === "list", onClick: () => setView("list"), className: `rounded p-1 transition-colors ${view === "list" ? "bg-[var(--mova-ai-hover-strong,#e9e9e9)] text-[color:var(--mova-ai-ink,#202020)]" : ""}`, children: /* @__PURE__ */ jsx11(List, { className: "h-3.5 w-3.5" }) }),
|
|
3681
|
+
/* @__PURE__ */ jsx11("button", { type: "button", "aria-label": "Board view", "aria-pressed": view === "board", onClick: () => setView("board"), className: `rounded p-1 transition-colors ${view === "board" ? "bg-[var(--mova-ai-hover-strong,#e9e9e9)] text-[color:var(--mova-ai-ink,#202020)]" : ""}`, children: /* @__PURE__ */ jsx11(Columns3, { className: "h-3.5 w-3.5" }) })
|
|
4034
3682
|
] }),
|
|
4035
|
-
/* @__PURE__ */ jsx11(ToolbarPopover, { label: "Filter", triggerRef: statusFilterRef, icon: /* @__PURE__ */ jsx11(Filter, { className: "h-3 w-3" }), children: /* @__PURE__ */ jsx11("div", { role: "radiogroup", "aria-label": "Issue status", children: ["all", ...BOARD_STATUSES].map((status) => /* @__PURE__ */ jsxs11("label", { className: "flex cursor-pointer items-center gap-2 rounded px-2 py-1.5 hover:bg-
|
|
4036
|
-
/* @__PURE__ */ jsx11("input", { type: "radio", className: "accent-[
|
|
3683
|
+
/* @__PURE__ */ jsx11(ToolbarPopover, { label: "Filter", triggerRef: statusFilterRef, icon: /* @__PURE__ */ jsx11(Filter, { className: "h-3 w-3" }), children: /* @__PURE__ */ jsx11("div", { role: "radiogroup", "aria-label": "Issue status", children: ["all", ...BOARD_STATUSES].map((status) => /* @__PURE__ */ jsxs11("label", { className: "flex cursor-pointer items-center gap-2 rounded px-2 py-1.5 hover:bg-[var(--mova-ai-hover,#f1f1f1)]", children: [
|
|
3684
|
+
/* @__PURE__ */ jsx11("input", { type: "radio", className: "accent-[var(--mova-ai-accent,#454545)]", name: `${sortGroupId}-status`, checked: statusFilter === status, onChange: () => setStatusFilter(status) }),
|
|
4037
3685
|
status === "all" ? "All statuses" : STATUS_META[status].label
|
|
4038
3686
|
] }, status)) }) }),
|
|
4039
3687
|
/* @__PURE__ */ jsxs11(ToolbarPopover, { label: "Sort", icon: /* @__PURE__ */ jsx11(ArrowUpDown, { className: "h-3 w-3" }), children: [
|
|
4040
|
-
/* @__PURE__ */ jsx11("div", { role: "radiogroup", "aria-label": "Sort field", children: ["Manual", "Status", "Priority", "Title", "Created", "Updated"].map((value) => /* @__PURE__ */ jsxs11("label", { className: `flex cursor-pointer items-center gap-2 rounded px-2 py-1.5 hover:bg-
|
|
4041
|
-
/* @__PURE__ */ jsx11("input", { className: "accent-[
|
|
3688
|
+
/* @__PURE__ */ jsx11("div", { role: "radiogroup", "aria-label": "Sort field", children: ["Manual", "Status", "Priority", "Title", "Created", "Updated"].map((value) => /* @__PURE__ */ jsxs11("label", { className: `flex cursor-pointer items-center gap-2 rounded px-2 py-1.5 hover:bg-[var(--mova-ai-hover,#f1f1f1)] ${sort === value ? "bg-[var(--mova-ai-hover,#f1f1f1)] text-[color:var(--mova-ai-ink,#202020)]" : ""}`, children: [
|
|
3689
|
+
/* @__PURE__ */ jsx11("input", { className: "accent-[var(--mova-ai-accent,#454545)]", type: "radio", name: sortGroupId, checked: sort === value, onChange: () => setSort(value) }),
|
|
4042
3690
|
value,
|
|
4043
3691
|
sort === value ? /* @__PURE__ */ jsx11(Check, { className: "ml-auto h-3 w-3" }) : null
|
|
4044
3692
|
] }, value)) }),
|
|
4045
|
-
/* @__PURE__ */ jsxs11("button", { type: "button", disabled: sort === "Manual", onClick: () => setDescending((value) => !value), "aria-label": "Toggle sort direction", className: "flex w-full items-center gap-2 border-t border-
|
|
3693
|
+
/* @__PURE__ */ jsxs11("button", { type: "button", disabled: sort === "Manual", onClick: () => setDescending((value) => !value), "aria-label": "Toggle sort direction", className: "flex w-full items-center gap-2 border-t border-[var(--mova-ai-border,#dedede)] px-2 py-2 text-left disabled:opacity-40", children: [
|
|
4046
3694
|
/* @__PURE__ */ jsx11(ArrowUpDown, { className: "h-3 w-3" }),
|
|
4047
3695
|
descending ? "Descending" : "Ascending"
|
|
4048
3696
|
] })
|
|
4049
3697
|
] }),
|
|
4050
|
-
/* @__PURE__ */ jsx11(ToolbarPopover, { label: "Display", icon: /* @__PURE__ */ jsx11(SlidersHorizontal, { className: "h-3 w-3" }), children: DISPLAY_FIELDS.map((field) => /* @__PURE__ */ jsxs11("label", { className: "flex cursor-pointer items-center gap-2 rounded px-2 py-1.5 hover:bg-
|
|
4051
|
-
/* @__PURE__ */ jsx11("input", { className: "accent-[
|
|
3698
|
+
/* @__PURE__ */ jsx11(ToolbarPopover, { label: "Display", icon: /* @__PURE__ */ jsx11(SlidersHorizontal, { className: "h-3 w-3" }), children: DISPLAY_FIELDS.map((field) => /* @__PURE__ */ jsxs11("label", { className: "flex cursor-pointer items-center gap-2 rounded px-2 py-1.5 hover:bg-[var(--mova-ai-hover,#f1f1f1)]", children: [
|
|
3699
|
+
/* @__PURE__ */ jsx11("input", { className: "accent-[var(--mova-ai-accent,#454545)]", type: "checkbox", checked: display.includes(field), onChange: () => setDisplay((fields) => fields.includes(field) ? fields.filter((value) => value !== field) : [...fields, field]) }),
|
|
4052
3700
|
field
|
|
4053
3701
|
] }, field)) })
|
|
4054
3702
|
] })
|
|
@@ -4058,7 +3706,7 @@ function RudderIssueBoard({ theme = "dark", className = "", initialIssues = DEFA
|
|
|
4058
3706
|
event.preventDefault();
|
|
4059
3707
|
closeCreate();
|
|
4060
3708
|
}
|
|
4061
|
-
}, className: "flex flex-wrap items-center gap-2 border-b border-
|
|
3709
|
+
}, className: "flex flex-wrap items-center gap-2 border-b border-[var(--mova-ai-border,#dedede)] bg-[var(--mova-ai-hover,#f1f1f1)] p-3", onSubmit: (event) => {
|
|
4062
3710
|
event.preventDefault();
|
|
4063
3711
|
if (!draft.trim()) return;
|
|
4064
3712
|
let sequence = issues.length + 1;
|
|
@@ -4070,15 +3718,15 @@ function RudderIssueBoard({ theme = "dark", className = "", initialIssues = DEFA
|
|
|
4070
3718
|
closeCreate();
|
|
4071
3719
|
setAnnouncement("Issue created.");
|
|
4072
3720
|
}, children: [
|
|
4073
|
-
/* @__PURE__ */ jsx11("input", { ref: createInputRef, required: true, "aria-label": "New issue title", placeholder: "Issue title", value: draft, onChange: (event) => setDraft(event.target.value), className: "min-w-0 flex-1 rounded border border-
|
|
4074
|
-
/* @__PURE__ */ jsx11("select", { "aria-label": "New issue status", value: creating, onChange: (event) => setCreating(event.target.value), className: "rounded bg-[
|
|
4075
|
-
/* @__PURE__ */ jsx11("button", { type: "submit", className: "rounded bg-[
|
|
3721
|
+
/* @__PURE__ */ jsx11("input", { ref: createInputRef, required: true, "aria-label": "New issue title", placeholder: "Issue title", value: draft, onChange: (event) => setDraft(event.target.value), className: "min-w-0 flex-1 rounded border border-[var(--mova-ai-border,#dedede)] bg-[var(--mova-ai-field,#f6f6f6)] px-2 py-1.5 text-sm" }),
|
|
3722
|
+
/* @__PURE__ */ jsx11("select", { "aria-label": "New issue status", value: creating, onChange: (event) => setCreating(event.target.value), className: "rounded bg-[var(--mova-ai-canvas,#f4f4f4)] p-1 text-xs", children: BOARD_STATUSES.map((status) => /* @__PURE__ */ jsx11("option", { value: status, children: STATUS_META[status].label }, status)) }),
|
|
3723
|
+
/* @__PURE__ */ jsx11("button", { type: "submit", className: "rounded bg-[var(--mova-ai-accent,#454545)] px-3 py-1.5 text-xs text-[color:var(--mova-ai-accent-foreground,#fff)]", children: "Create" }),
|
|
4076
3724
|
/* @__PURE__ */ jsx11("button", { type: "button", onClick: closeCreate, className: "px-2 text-xs", children: "Cancel" })
|
|
4077
3725
|
] }) : null,
|
|
4078
3726
|
/* @__PURE__ */ jsx11(DisplayContext.Provider, { value: display, children: /* @__PURE__ */ jsx11(AnimatePresence5, { mode: "wait", initial: false, children: /* @__PURE__ */ jsx11(motion6.div, { initial: { opacity: 0, y: reduceMotion ? 0 : 5 }, animate: { opacity: 1, y: 0 }, exit: { opacity: 0, y: reduceMotion ? 0 : -3 }, transition: { duration: reduceMotion ? 0 : 0.15, ease: [0.22, 1, 0.36, 1] }, children: view === "list" ? /* @__PURE__ */ jsxs11("div", { className: "max-h-[580px] overflow-y-auto", children: [
|
|
4079
3727
|
filtered.map((issue) => /* @__PURE__ */ jsx11(IssueListRow, { issue }, issue.id)),
|
|
4080
|
-
filtered.length === 0 ? /* @__PURE__ */ jsx11("p", { className: "py-10 text-center text-sm text-[
|
|
4081
|
-
/* @__PURE__ */ jsxs11("button", { ref: listCreateRef, type: "button", onClick: (event) => openCreate(statusFilter === "all" ? "backlog" : statusFilter, event.currentTarget), className: "flex items-center gap-2 px-4 py-3 text-xs text-[
|
|
3728
|
+
filtered.length === 0 ? /* @__PURE__ */ jsx11("p", { className: "py-10 text-center text-sm text-[color:var(--mova-ai-ink-secondary,#666)]", children: "No issues match this filter." }) : null,
|
|
3729
|
+
/* @__PURE__ */ jsxs11("button", { ref: listCreateRef, type: "button", onClick: (event) => openCreate(statusFilter === "all" ? "backlog" : statusFilter, event.currentTarget), className: "flex items-center gap-2 px-4 py-3 text-xs text-[color:var(--mova-ai-ink-secondary,#666)] transition-colors hover:text-[color:var(--mova-ai-ink,#202020)]", children: [
|
|
4082
3730
|
/* @__PURE__ */ jsx11(Plus, { className: "h-3.5 w-3.5" }),
|
|
4083
3731
|
"Add issue"
|
|
4084
3732
|
] })
|
|
@@ -4095,15 +3743,15 @@ function RudderIssueBoard({ theme = "dark", className = "", initialIssues = DEFA
|
|
|
4095
3743
|
children: [
|
|
4096
3744
|
/* @__PURE__ */ jsx11("div", { className: "overflow-x-auto overscroll-x-contain p-3 sm:p-4", children: /* @__PURE__ */ jsxs11("div", { className: "flex min-h-[520px] min-w-max items-stretch gap-3", children: [
|
|
4097
3745
|
visibleStatuses.map((status) => /* @__PURE__ */ jsx11(Fragment4, { children: /* @__PURE__ */ jsx11(BoardColumn, { issues: grouped[status], status, onCreate: openCreate }) }, status)),
|
|
4098
|
-
hiddenStatuses.length > 0 ? /* @__PURE__ */ jsxs11("div", { className: `motion-kanban-lane flex min-h-0 w-[228px] min-w-[228px] shrink-0 flex-col rounded-[10px] border p-2 transition-colors motion-reduce:transition-none ${overStatus && hiddenStatuses.includes(overStatus) ? "border-
|
|
3746
|
+
hiddenStatuses.length > 0 ? /* @__PURE__ */ jsxs11("div", { className: `motion-kanban-lane flex min-h-0 w-[228px] min-w-[228px] shrink-0 flex-col rounded-[10px] border p-2 transition-colors motion-reduce:transition-none ${overStatus && hiddenStatuses.includes(overStatus) ? "border-[var(--mova-ai-border-strong,#c8c8c8)] bg-[var(--mova-ai-hover,#f1f1f1)]" : "border-[var(--mova-ai-border,#dedede)] bg-[var(--mova-ai-canvas,#f4f4f4)]"}`, "data-testid": "kanban-hidden-columns", children: [
|
|
4099
3747
|
/* @__PURE__ */ jsxs11("div", { className: "mb-2 flex items-center gap-2 px-1", children: [
|
|
4100
|
-
/* @__PURE__ */ jsx11("span", { className: "text-xs font-semibold uppercase tracking-wide text-[
|
|
4101
|
-
/* @__PURE__ */ jsx11("span", { className: "ml-auto text-xs tabular-nums text-[
|
|
3748
|
+
/* @__PURE__ */ jsx11("span", { className: "text-xs font-semibold uppercase tracking-wide text-[color:var(--mova-ai-ink-muted,#858585)]", children: "Hidden columns" }),
|
|
3749
|
+
/* @__PURE__ */ jsx11("span", { className: "ml-auto text-xs tabular-nums text-[color:var(--mova-ai-ink-muted,#858585)]", children: hiddenStatuses.length })
|
|
4102
3750
|
] }),
|
|
4103
3751
|
/* @__PURE__ */ jsx11("div", { className: "space-y-2", children: hiddenStatuses.map((status) => /* @__PURE__ */ jsx11(Fragment4, { children: /* @__PURE__ */ jsx11(HiddenStatus, { status, onCreate: openCreate }) }, status)) })
|
|
4104
3752
|
] }) : null
|
|
4105
3753
|
] }) }),
|
|
4106
|
-
/* @__PURE__ */ jsx11(DragOverlay, { dropAnimation: reduceMotion ? null : { duration: 180, easing: "cubic-bezier(0.22, 1, 0.36, 1)" }, children: activeIssue ? /* @__PURE__ */ jsx11("article", { className: "w-[247px] rotate-[0.4deg] scale-[1.015] overflow-hidden rounded-[9px] border border-
|
|
3754
|
+
/* @__PURE__ */ jsx11(DragOverlay, { dropAnimation: reduceMotion ? null : { duration: 180, easing: "cubic-bezier(0.22, 1, 0.36, 1)" }, children: activeIssue ? /* @__PURE__ */ jsx11("article", { className: "w-[247px] rotate-[0.4deg] scale-[1.015] overflow-hidden rounded-[9px] border border-[var(--mova-ai-border-strong,#c8c8c8)] bg-[var(--mova-ai-surface,#fff)] p-2.5 shadow-[0_18px_48px_rgba(0,0,0,.48)]", children: /* @__PURE__ */ jsx11(IssueCardBody, { issue: activeIssue }) }) : null })
|
|
4107
3755
|
]
|
|
4108
3756
|
}
|
|
4109
3757
|
) }, view) }) })
|
|
@@ -4113,7 +3761,7 @@ var rudder_issue_board_default = RudderIssueBoard;
|
|
|
4113
3761
|
|
|
4114
3762
|
// .generated/ui/animated-sidebar.tsx
|
|
4115
3763
|
import { Activity, Bookmark, ChevronDown as ChevronDown2, LayoutGrid } from "lucide-react";
|
|
4116
|
-
import { useId as
|
|
3764
|
+
import { useId as useId5, useState as useState13 } from "react";
|
|
4117
3765
|
import { Fragment as Fragment6, jsx as jsx12, jsxs as jsxs12 } from "react/jsx-runtime";
|
|
4118
3766
|
var SIDEBAR_ITEMS = [
|
|
4119
3767
|
{ id: "send", label: "Work queue", meta: "Current cycle", icon: LayoutGrid },
|
|
@@ -4439,7 +4087,7 @@ function AnimatedSidebar({
|
|
|
4439
4087
|
} = {}) {
|
|
4440
4088
|
const [activeItem, setActiveItem] = useState13(initialActiveItem);
|
|
4441
4089
|
const [isSectionOpen, setIsSectionOpen] = useState13(true);
|
|
4442
|
-
const sectionId = `mova-sidebar-section-${
|
|
4090
|
+
const sectionId = `mova-sidebar-section-${useId5().replace(/:/g, "")}`;
|
|
4443
4091
|
const rootClassName = ["mova-sidebar", className].filter(Boolean).join(" ");
|
|
4444
4092
|
const selectItem = (id) => {
|
|
4445
4093
|
setActiveItem(id);
|
|
@@ -8317,7 +7965,7 @@ function ExpandingIconTabs() {
|
|
|
8317
7965
|
|
|
8318
7966
|
// .generated/ui/patterns/gooey-popover.tsx
|
|
8319
7967
|
import gsap from "gsap";
|
|
8320
|
-
import { useCallback as useCallback3, useEffect as useEffect13, useId as
|
|
7968
|
+
import { useCallback as useCallback3, useEffect as useEffect13, useId as useId6, useRef as useRef12, useState as useState23 } from "react";
|
|
8321
7969
|
import { jsx as jsx167, jsxs as jsxs77 } from "react/jsx-runtime";
|
|
8322
7970
|
function cn2(...classes) {
|
|
8323
7971
|
return classes.filter(Boolean).join(" ");
|
|
@@ -8358,7 +8006,7 @@ function GooeyPopover({
|
|
|
8358
8006
|
contentClassName,
|
|
8359
8007
|
className
|
|
8360
8008
|
}) {
|
|
8361
|
-
const filterId =
|
|
8009
|
+
const filterId = useId6();
|
|
8362
8010
|
const isControlled = controlledIsOpen !== void 0;
|
|
8363
8011
|
const [internalIsOpen, setInternalIsOpen] = useState23(false);
|
|
8364
8012
|
const isOpen = isControlled ? controlledIsOpen : internalIsOpen;
|