From 34a2da5077aa0d056dee89106e5ce37413a69933 Mon Sep 17 00:00:00 2001 From: Bowei Liu Date: Tue, 28 Apr 2026 15:58:16 -0700 Subject: [PATCH 1/6] Add PositionOffsetField component Co-authored-by: Sculptor --- .../PositionOffsetField.stories.tsx | 68 ++++++++++ .../src/PositionOffsetField/index.tsx | 121 ++++++++++++++++++ packages/ui-solid/src/index.tsx | 1 + position-offset-plan.md | 75 +++++++++++ 4 files changed, 265 insertions(+) create mode 100644 packages/ui-solid/src/PositionOffsetField/PositionOffsetField.stories.tsx create mode 100644 packages/ui-solid/src/PositionOffsetField/index.tsx create mode 100644 position-offset-plan.md diff --git a/packages/ui-solid/src/PositionOffsetField/PositionOffsetField.stories.tsx b/packages/ui-solid/src/PositionOffsetField/PositionOffsetField.stories.tsx new file mode 100644 index 00000000000..72e13d14605 --- /dev/null +++ b/packages/ui-solid/src/PositionOffsetField/PositionOffsetField.stories.tsx @@ -0,0 +1,68 @@ +import { createSignal } from "solid-js"; +import type { Meta, StoryObj } from "storybook-solidjs"; +import { + PositionOffsetField, + type PositionOffset, +} from "./index"; + +const meta: Meta = { + title: "Editor/PositionOffsetField", + component: PositionOffsetField, +}; +export default meta; + +type Story = StoryObj; + +function Harness(props: { + initial?: PositionOffset; + min?: number; + max?: number; + step?: number; + disabled?: boolean; +}) { + const [value, setValue] = createSignal( + props.initial ?? { x: 0, y: 0 }, + ); + const [lastEnd, setLastEnd] = createSignal(null); + + return ( +
+ +
+
+ value: x={value().x.toFixed(2)} y={value().y.toFixed(2)} +
+
+ lastEnd:{" "} + {lastEnd() + ? `x=${lastEnd()!.x.toFixed(2)} y=${lastEnd()!.y.toFixed(2)}` + : "(none)"} +
+
+
+ ); +} + +export const Default: Story = { + render: () => , +}; + +export const InitialOffset: Story = { + render: () => , +}; + +export const NarrowRange: Story = { + render: () => , +}; + +export const Disabled: Story = { + render: () => , +}; diff --git a/packages/ui-solid/src/PositionOffsetField/index.tsx b/packages/ui-solid/src/PositionOffsetField/index.tsx new file mode 100644 index 00000000000..ead46612f64 --- /dev/null +++ b/packages/ui-solid/src/PositionOffsetField/index.tsx @@ -0,0 +1,121 @@ +import { Slider as KSlider } from "@kobalte/core/slider"; +import { cx } from "cva"; +import { type JSX, splitProps } from "solid-js"; + +export type PositionOffset = { x: number; y: number }; + +export type PositionOffsetFieldProps = { + value: PositionOffset; + onChange: (value: PositionOffset) => void; + onChangeEnd?: (value: PositionOffset) => void; + min?: number; + max?: number; + step?: number; + disabled?: boolean; + class?: string; + label?: JSX.Element; + icon?: JSX.Element; +}; + +const DEFAULT_MIN = -50; +const DEFAULT_MAX = 50; +const DEFAULT_STEP = 0.1; + +export function PositionOffsetField(props: PositionOffsetFieldProps) { + const [, rest] = splitProps(props, ["value", "onChange", "onChangeEnd"]); + + const min = () => rest.min ?? DEFAULT_MIN; + const max = () => rest.max ?? DEFAULT_MAX; + const step = () => rest.step ?? DEFAULT_STEP; + + return ( +
+ + {rest.icon} + {rest.label ?? "Position Offset"} + + props.onChange({ x: v, y: props.value.y })} + onChangeEnd={(v) => props.onChangeEnd?.({ x: v, y: props.value.y })} + /> + props.onChange({ x: props.value.x, y: v })} + onChangeEnd={(v) => props.onChangeEnd?.({ x: props.value.x, y: v })} + /> +
+ ); +} + +type PositionAxisRowProps = { + axisLabel: string; + value: number; + min: number; + max: number; + step: number; + disabled?: boolean; + onChange: (value: number) => void; + onChangeEnd?: (value: number) => void; +}; + +function PositionAxisRow(props: PositionAxisRowProps) { + return ( +
+ + {props.axisLabel} + + props.onChange(v[0])} + onChangeEnd={(v) => props.onChangeEnd?.(v[0])} + > + +
+ + + + + + {formatPercent(props.value)} + +
+ ); +} + +function zeroPercent(min: number, max: number) { + if (max === min) return 0; + const clamped = Math.max(min, Math.min(0, max)); + return ((clamped - min) / (max - min)) * 100; +} + +function formatPercent(v: number) { + return `${v.toFixed(1)}%`; +} diff --git a/packages/ui-solid/src/index.tsx b/packages/ui-solid/src/index.tsx index 79a1fadf7e7..c60005c70c7 100644 --- a/packages/ui-solid/src/index.tsx +++ b/packages/ui-solid/src/index.tsx @@ -1,3 +1,4 @@ export * from "./Button"; +export * from "./PositionOffsetField"; export * from "./ProgressCircle"; export * from "./SwitchTab"; diff --git a/position-offset-plan.md b/position-offset-plan.md new file mode 100644 index 00000000000..8badfa76b73 --- /dev/null +++ b/position-offset-plan.md @@ -0,0 +1,75 @@ +# Position Offset Sliders — Plan & Decision Notes + +## What I'm trying to do + +Add a slider (or pair of sliders) to the Cap desktop editor sidebar to control video positioning — horizontal and vertical offset of the recorded video within its rendered background frame. Sliders go directly under the existing **Padding** slider in the right-hand config panel of the editor screen (see screenshot). + +Why: padding shrinks the video uniformly; there's no way to bias the framed video off-center (e.g., shift it down to leave headroom for captions, or right to leave space for a side panel). Position offset closes that gap. + +Target file for UI insertion: `apps/desktop/src/routes/editor/ConfigSidebar.tsx:2015-2024` (the `Field name="Padding"` block). + +## Why we explored testing first + +`ConfigSidebar.tsx` is 2000+ lines, deeply coupled to the project store and auto-generated Tauri IPC bindings (`tauri.ts`, `queries.ts`). Iterating by booting `pnpm dev:desktop`, navigating into the editor with a real recording, then eyeballing the slider is slow and brittle — every tweak costs a full app reload. I wanted a tighter visual loop and a way to assert the rendering math is right *before* sinking time into the change, so I'd actually finish today. + +Two domains needed test paths: +1. **UI** — does the slider render and behave correctly in isolation? +2. **Rendering math** — does the offset value actually shift the video in the output frame, with sane clamping? + +## Findings + +### Rendering math (Rust) +- Offset/padding math lives at `crates/rendering/src/lib.rs:2085-2120` (`ProjectUniforms::display_offset`). +- Schema: `crates/project/src/configuration.rs:234` (`BackgroundConfiguration` — add `position_offset_x/y` here). +- Existing unit tests at `crates/rendering/src/lib.rs:2948+` already exercise `display_offset` with default `ProjectConfiguration`. Drop new tests next to them. +- Run cost: `cargo test -p cap-rendering offset` — sub-second, no Tauri, no UI. + +### UI component (Solid) +- No existing isolated harness for editor components. Vitest is installed (`apps/desktop/package.json:89`) but `@solidjs/testing-library` is not; no `*.test.tsx` files in the editor route. +- **However:** `apps/storybook` is already wired with `storybook-solidjs-vite` and depends on `@cap/ui-solid` (workspace). Config glob: `packages/ui-solid/src/**/*.stories.tsx`. Zero stories exist today, but the pipe is ready and currently unused. +- Storybook gives hot-reload visual rendering at `localhost:6006` without booting Tauri or needing a recording fixture. + +### Options considered for visual UI verification +| Option | Setup cost | Iteration speed | Verdict | +|---|---|---|---| +| `pnpm dev:desktop` only | 0 | Slow (full reload, needs recording) | Fallback only | +| Storybook (existing infra) | ~15 min | Fast (HMR) | **Chosen** | +| Playwright screenshot | Hours (install browsers, scaffold, baselines) | Medium | Skip — overkill today | +| Dev-only Solid route in desktop | Medium (stub Tauri imports) | Medium | Skip — Storybook is cleaner | +| Vitest + `@solidjs/testing-library` | Small (one dep) | Fast, but headless (no visual) | Optional add-on later | + +## Decision + +**Approach:** +1. Build the new sliders as a **pure component** in `packages/ui-solid/src/PositionOffsetField/index.tsx` — props `value: { x: number; y: number }`, `onChange`, range bounds. No store, no IPC. +2. Add `PositionOffsetField.stories.tsx` next to it; existing Storybook glob picks it up automatically. +3. Run `pnpm --filter @cap/storybook dev:storybook` → visual loop at http://localhost:6006. +4. Import the component into `ConfigSidebar.tsx` from `@cap/ui-solid`, wire to `setProject("background", "positionOffsetX/Y", ...)`. +5. Add `position_offset_x/y` fields to `BackgroundConfiguration` (`crates/project/src/configuration.rs:234`); thread through `display_offset` math (`crates/rendering/src/lib.rs:2115`). +6. Add Rust unit tests next to existing padding tests (`crates/rendering/src/lib.rs:2948+`) covering: zero offset matches existing centered behavior; positive x shifts right within bounds; offset is clamped so video stays visible. +7. Final manual check: `pnpm dev:desktop`, open editor, drag sliders, confirm rendered output matches. + +### Decision factors + +- **Time-to-first-pixel.** Storybook = ~15 min from zero to a live, visually-verified slider. Playwright = hours. Desktop boot = slow loop. +- **Existing infrastructure.** Storybook is already configured for Solid; using it costs only writing a story file. Adding Playwright would mean introducing a whole new tool and screenshot baselines. +- **Decoupling.** Putting the component in `@cap/ui-solid` as a pure props-in/callback-out component makes it trivially storybook-able *and* unit-testable later, without dragging in Tauri context. +- **Math correctness ≠ UI correctness.** Splitting visual verification (Storybook) from numeric verification (Rust unit tests) means each loop is fast and focused. No need for Playwright screenshots of the full editor when math is provable in isolation. +- **End-of-day shipping pressure.** Skip anything that requires more setup than the change itself. + +## Open questions before coding + +- Single 2D pad vs. two 1D sliders? Two sliders matches existing visual style (Padding, Blur, Rounded Corners) and is simpler to spec. +- Range units: percentage of available frame area (matches padding's `%` convention) or absolute pixels? Leaning %: stays meaningful across resolutions. +- Default: `{ x: 0, y: 0 }`. Bounds: `[-50, 50]` (% of available offset room). +- Does positive Y mean "down" (screen coords) or "up" (math coords)? Pick screen coords to match Padding semantics. + +## Files I'll touch + +- `packages/ui-solid/src/PositionOffsetField/index.tsx` (new) +- `packages/ui-solid/src/PositionOffsetField/PositionOffsetField.stories.tsx` (new) +- `packages/ui-solid/src/index.ts` (export) +- `apps/desktop/src/routes/editor/ConfigSidebar.tsx` (insert under Padding Field) +- `crates/project/src/configuration.rs` (`BackgroundConfiguration` fields) +- `crates/rendering/src/lib.rs` (`display_offset` math + unit tests) +- Auto-regenerated: `apps/src/utils/tauri.ts` (do not edit by hand) From bcabb2cbbba336f08460c462f6518e212b9f3c40 Mon Sep 17 00:00:00 2001 From: Bowei Liu Date: Tue, 28 Apr 2026 16:06:30 -0700 Subject: [PATCH 2/6] Add PaddingField component and rendering updates Co-authored-by: Sculptor --- crates/project/src/configuration.rs | 4 + crates/rendering/src/coord.rs | 8 +- crates/rendering/src/lib.rs | 219 +++-- package.json | 5 + .../src/PaddingField/PaddingField.stories.tsx | 58 ++ packages/ui-solid/src/PaddingField/index.tsx | 63 ++ packages/ui-solid/src/index.tsx | 1 + pnpm-lock.yaml | 808 +++++------------- 8 files changed, 498 insertions(+), 668 deletions(-) create mode 100644 packages/ui-solid/src/PaddingField/PaddingField.stories.tsx create mode 100644 packages/ui-solid/src/PaddingField/index.tsx diff --git a/crates/project/src/configuration.rs b/crates/project/src/configuration.rs index 59b26b6b3a7..4ab4bd6075a 100644 --- a/crates/project/src/configuration.rs +++ b/crates/project/src/configuration.rs @@ -235,6 +235,8 @@ pub struct BackgroundConfiguration { pub source: BackgroundSource, pub blur: f64, pub padding: f64, + pub position_offset_x: f64, + pub position_offset_y: f64, pub rounding: f64, pub rounding_type: CornerStyle, pub inset: u32, @@ -261,6 +263,8 @@ impl Default for BackgroundConfiguration { source: BackgroundSource::default(), blur: 0.0, padding: 0.0, + position_offset_x: 0.0, + position_offset_y: 0.0, rounding: 0.0, rounding_type: CornerStyle::default(), inset: 0, diff --git a/crates/rendering/src/coord.rs b/crates/rendering/src/coord.rs index 2f067f11be6..e5ce71d850d 100644 --- a/crates/rendering/src/coord.rs +++ b/crates/rendering/src/coord.rs @@ -108,16 +108,12 @@ impl Coord { resolution_base: XY, ) -> Coord { let crop = ProjectUniforms::get_crop(options, project); - let output_size = ProjectUniforms::get_output_size(options, project, resolution_base); let padding_offset = ProjectUniforms::display_offset(options, project, resolution_base); - - let output_size = XY::new(output_size.0, output_size.1).map(|v| v as f64); + let display_size = ProjectUniforms::display_size(options, project, resolution_base); let position_ratio = self.coord / crop.size.map(|v| v as f64); - Coord::new( - padding_offset.coord + (output_size - padding_offset.coord * 2.0) * position_ratio, - ) + Coord::new(padding_offset.coord + display_size.coord * position_ratio) } } diff --git a/crates/rendering/src/lib.rs b/crates/rendering/src/lib.rs index 1335c6a293c..21acc10711c 100644 --- a/crates/rendering/src/lib.rs +++ b/crates/rendering/src/lib.rs @@ -2046,16 +2046,16 @@ impl ProjectUniforms { (scaled_width, scaled_height) } - pub fn display_offset( + fn display_layout( options: &RenderOptions, project: &ProjectConfiguration, resolution_base: XY, - ) -> Coord { - let output_size = Self::get_output_size(options, project, resolution_base); - let output_size = XY::new(output_size.0 as f64, output_size.1 as f64); + ) -> (Coord, Coord) { + let output_size_u = Self::get_output_size(options, project, resolution_base); + let output_size = XY::new(output_size_u.0 as f64, output_size_u.1 as f64); let crop = Self::get_crop(options, project); - if project.aspect_ratio.is_none() { + let (centered_offset, target_size) = if project.aspect_ratio.is_none() { let (base_w, base_h) = Self::get_base_size(options, project); let output_scale = f64::min( output_size.x / f64::max(base_w as f64, 1.0), @@ -2063,86 +2063,89 @@ impl ProjectUniforms { ); let padding_factor = Self::auto_padding_factor(project); - return Coord::new(XY::new( + let centered = XY::new( crop.size.x as f64 * padding_factor * output_scale, crop.size.y as f64 * padding_factor * output_scale, - )); - } + ); + let size = output_size - centered * 2.0; + (centered, size) + } else { + let output_aspect = output_size.x / output_size.y; - let output_aspect = output_size.x / output_size.y; + let cropped_size = XY::new(crop.size.x as f64, crop.size.y as f64); - let crop_start = - Coord::::new(XY::new(crop.position.x as f64, crop.position.y as f64)); - let crop_end = Coord::::new(XY::new( - (crop.position.x + crop.size.x) as f64, - (crop.position.y + crop.size.y) as f64, - )); + let cropped_aspect = cropped_size.x / cropped_size.y; - let cropped_size = crop_end.coord - crop_start.coord; + let padding = { + let padding_factor = project.background.padding / 100.0 * SCREEN_MAX_PADDING; + let crop_basis = f64::max(cropped_size.x, cropped_size.y); + let base_padding = crop_basis * padding_factor; - let cropped_aspect = cropped_size.x / cropped_size.y; + let (base_w, base_h) = Self::get_base_size(options, project); + let output_scale = f64::min( + output_size.x / f64::max(base_w as f64, 1.0), + output_size.y / f64::max(base_h as f64, 1.0), + ); + let max_padding = f64::max( + f64::min((output_size.x - 1.0) / 2.0, (output_size.y - 1.0) / 2.0), + 0.0, + ); + (base_padding * output_scale).min(max_padding) + }; - let padding = { - let padding_factor = project.background.padding / 100.0 * SCREEN_MAX_PADDING; - let crop_basis = f64::max(cropped_size.x, cropped_size.y); - let base_padding = crop_basis * padding_factor; + let is_height_constrained = cropped_aspect <= output_aspect; - let (base_w, base_h) = Self::get_base_size(options, project); - let output_scale = f64::min( - output_size.x / f64::max(base_w as f64, 1.0), - output_size.y / f64::max(base_h as f64, 1.0), + let available_size = XY::new( + (output_size.x - 2.0 * padding).max(1.0), + (output_size.y - 2.0 * padding).max(1.0), ); - let max_padding = f64::max( - f64::min((output_size.x - 1.0) / 2.0, (output_size.y - 1.0) / 2.0), - 0.0, - ); - (base_padding * output_scale).min(max_padding) - }; - - let is_height_constrained = cropped_aspect <= output_aspect; - let available_size = XY::new( - (output_size.x - 2.0 * padding).max(1.0), - (output_size.y - 2.0 * padding).max(1.0), - ); + let target_size = if is_height_constrained { + XY::new(available_size.y * cropped_aspect, available_size.y) + } else { + XY::new(available_size.x, available_size.x / cropped_aspect) + }; - let target_size = if is_height_constrained { - XY::new(available_size.y * cropped_aspect, available_size.y) - } else { - XY::new(available_size.x, available_size.x / cropped_aspect) + let centered = (output_size - target_size) / 2.0; + (centered, target_size) }; - let target_offset = (output_size - target_size) / 2.0; + let room = output_size - target_size; + let shift_x = (project.background.position_offset_x / 100.0) * room.x; + let shift_y = (project.background.position_offset_y / 100.0) * room.y; + let raw_offset = centered_offset + XY::new(shift_x, shift_y); + let max_x = room.x.max(0.0); + let max_y = room.y.max(0.0); + let offset = XY::new( + raw_offset.x.clamp(0.0, max_x), + raw_offset.y.clamp(0.0, max_y), + ); - Coord::new(if is_height_constrained { - XY::new(target_offset.x, padding) - } else { - XY::new(padding, target_offset.y) - }) + (Coord::new(offset), Coord::new(target_size)) } - pub fn display_size( + pub fn display_offset( options: &RenderOptions, project: &ProjectConfiguration, resolution_base: XY, ) -> Coord { - let output_size = Self::get_output_size(options, project, resolution_base); - let output_size = XY::new(output_size.0 as f64, output_size.1 as f64); - - let display_offset = Self::display_offset(options, project, resolution_base); - - let end = Coord::new(output_size) - display_offset; + Self::display_layout(options, project, resolution_base).0 + } - end - display_offset + pub fn display_size( + options: &RenderOptions, + project: &ProjectConfiguration, + resolution_base: XY, + ) -> Coord { + Self::display_layout(options, project, resolution_base).1 } fn display_bounds( zoom: &InterpolatedZoom, display_offset: Coord, display_size: Coord, - output_size: XY, ) -> (Coord, Coord) { - let base_end = Coord::new(output_size) - display_offset; + let base_end = display_offset + display_size; let zoom_start = Coord::new(zoom.bounds.top_left * display_size.coord); let zoom_end = Coord::new((zoom.bounds.bottom_right - 1.0) * display_size.coord); let start = display_offset + zoom_start; @@ -2570,10 +2573,9 @@ impl ProjectUniforms { let display_offset = Self::display_offset(options, project, resolution_base); let display_size = Self::display_size(options, project, resolution_base); - let (start, end) = - Self::display_bounds(&zoom, display_offset, display_size, output_size); + let (start, end) = Self::display_bounds(&zoom, display_offset, display_size); let (prev_start, prev_end) = - Self::display_bounds(&prev_zoom, display_offset, display_size, output_size); + Self::display_bounds(&prev_zoom, display_offset, display_size); let target_size = (end - start).coord; let min_target_axis = target_size.x.min(target_size.y); @@ -3006,6 +3008,103 @@ mod tests { assert!(offset.y + size.y <= height as f64 + f64::EPSILON); } + #[test] + fn position_offset_zero_matches_centered_offset() { + let options = render_options(1920, 1080); + let mut project = ProjectConfiguration::default(); + project.background.padding = 25.0; + project.background.crop = Some(Crop { + position: XY::new(100, 50), + size: XY::new(1000, 500), + }); + + let (width, height) = ProjectUniforms::get_base_size(&options, &project); + let baseline = ProjectUniforms::display_offset(&options, &project, XY::new(width, height)); + + project.background.position_offset_x = 0.0; + project.background.position_offset_y = 0.0; + let with_zero = ProjectUniforms::display_offset(&options, &project, XY::new(width, height)); + + assert_eq!(with_zero.coord, baseline.coord); + } + + #[test] + fn position_offset_shifts_image_within_available_room() { + let options = render_options(1920, 1080); + let mut project = ProjectConfiguration { + aspect_ratio: Some(AspectRatio::Wide), + ..ProjectConfiguration::default() + }; + project.background.padding = 30.0; + + let (width, height) = ProjectUniforms::get_base_size(&options, &project); + let resolution = XY::new(width, height); + + let centered = ProjectUniforms::display_offset(&options, &project, resolution); + let size = ProjectUniforms::display_size(&options, &project, resolution); + let output_u = ProjectUniforms::get_output_size(&options, &project, resolution); + let output = XY::new(output_u.0 as f64, output_u.1 as f64); + let room = output - size.coord; + + project.background.position_offset_x = 50.0; + let shifted_right = ProjectUniforms::display_offset(&options, &project, resolution); + assert!((shifted_right.x - (centered.x + room.x * 0.5)).abs() < 1e-6); + assert!((shifted_right.y - centered.y).abs() < 1e-6); + + project.background.position_offset_x = -50.0; + let shifted_left = ProjectUniforms::display_offset(&options, &project, resolution); + assert!((shifted_left.x - (centered.x - room.x * 0.5)).abs() < 1e-6); + + project.background.position_offset_x = 0.0; + project.background.position_offset_y = 50.0; + let shifted_down = ProjectUniforms::display_offset(&options, &project, resolution); + assert!((shifted_down.y - (centered.y + room.y * 0.5)).abs() < 1e-6); + } + + #[test] + fn position_offset_clamps_to_keep_image_visible() { + let options = render_options(1920, 1080); + let mut project = ProjectConfiguration { + aspect_ratio: Some(AspectRatio::Wide), + ..ProjectConfiguration::default() + }; + project.background.padding = 30.0; + project.background.position_offset_x = 500.0; + project.background.position_offset_y = -500.0; + + let (width, height) = ProjectUniforms::get_base_size(&options, &project); + let resolution = XY::new(width, height); + let offset = ProjectUniforms::display_offset(&options, &project, resolution); + let size = ProjectUniforms::display_size(&options, &project, resolution); + let output_u = ProjectUniforms::get_output_size(&options, &project, resolution); + + assert!(offset.x >= 0.0); + assert!(offset.y >= 0.0); + assert!(offset.x + size.x <= output_u.0 as f64 + f64::EPSILON); + assert!(offset.y + size.y <= output_u.1 as f64 + f64::EPSILON); + } + + #[test] + fn position_offset_does_not_change_display_size() { + let options = render_options(1920, 1080); + let mut project = ProjectConfiguration { + aspect_ratio: Some(AspectRatio::Wide), + ..ProjectConfiguration::default() + }; + project.background.padding = 30.0; + + let (width, height) = ProjectUniforms::get_base_size(&options, &project); + let resolution = XY::new(width, height); + let baseline = ProjectUniforms::display_size(&options, &project, resolution); + + project.background.position_offset_x = 40.0; + project.background.position_offset_y = -25.0; + let shifted = ProjectUniforms::display_size(&options, &project, resolution); + + assert!((baseline.x - shifted.x).abs() < 1e-6); + assert!((baseline.y - shifted.y).abs() < 1e-6); + } + #[test] fn fixed_aspect_ratio_preserves_source_resolution_with_padding() { let options = render_options(1920, 1080); diff --git a/package.json b/package.json index 6bbc2b53647..7c7096d1b65 100644 --- a/package.json +++ b/package.json @@ -63,6 +63,11 @@ "allowedVersions": { "next-auth>next": ">=16.0.0" } + }, + "overrides": { + "storybook-solidjs-vite": "1.0.0-beta.2", + "storybook-solidjs": "1.0.0-beta.2", + "@storybook/builder-vite": "8.6.12" } }, "packageManager": "pnpm@10.5.2", diff --git a/packages/ui-solid/src/PaddingField/PaddingField.stories.tsx b/packages/ui-solid/src/PaddingField/PaddingField.stories.tsx new file mode 100644 index 00000000000..ea958081c9a --- /dev/null +++ b/packages/ui-solid/src/PaddingField/PaddingField.stories.tsx @@ -0,0 +1,58 @@ +import { createSignal } from "solid-js"; +import type { Meta, StoryObj } from "storybook-solidjs"; +import { PaddingField } from "./index"; + +const meta: Meta = { + title: "Editor/PaddingField", + component: PaddingField, +}; +export default meta; + +type Story = StoryObj; + +function Harness(props: { + initial?: number; + min?: number; + max?: number; + step?: number; + disabled?: boolean; +}) { + const [value, setValue] = createSignal(props.initial ?? 0); + const [lastEnd, setLastEnd] = createSignal(null); + + return ( +
+ +
+
value: {value().toFixed(2)}
+
+ lastEnd: {lastEnd() !== null ? lastEnd()!.toFixed(2) : "(none)"} +
+
+
+ ); +} + +export const Default: Story = { + render: () => , +}; + +export const Mid: Story = { + render: () => , +}; + +export const Max: Story = { + render: () => , +}; + +export const Disabled: Story = { + render: () => , +}; diff --git a/packages/ui-solid/src/PaddingField/index.tsx b/packages/ui-solid/src/PaddingField/index.tsx new file mode 100644 index 00000000000..b24614ce0f8 --- /dev/null +++ b/packages/ui-solid/src/PaddingField/index.tsx @@ -0,0 +1,63 @@ +import { Slider as KSlider } from "@kobalte/core/slider"; +import { cx } from "cva"; +import { type JSX, splitProps } from "solid-js"; + +export type PaddingFieldProps = { + value: number; + onChange: (value: number) => void; + onChangeEnd?: (value: number) => void; + min?: number; + max?: number; + step?: number; + disabled?: boolean; + class?: string; + label?: JSX.Element; + icon?: JSX.Element; +}; + +const DEFAULT_MIN = 0; +const DEFAULT_MAX = 40; +const DEFAULT_STEP = 0.1; + +export function PaddingField(props: PaddingFieldProps) { + const [, rest] = splitProps(props, ["value", "onChange", "onChangeEnd"]); + + const min = () => rest.min ?? DEFAULT_MIN; + const max = () => rest.max ?? DEFAULT_MAX; + const step = () => rest.step ?? DEFAULT_STEP; + + return ( +
+ + {rest.icon} + {rest.label ?? "Padding"} + +
+ props.onChange(v[0])} + onChangeEnd={(v) => props.onChangeEnd?.(v[0])} + > + + + + + + + {props.value.toFixed(1)}% + +
+
+ ); +} diff --git a/packages/ui-solid/src/index.tsx b/packages/ui-solid/src/index.tsx index c60005c70c7..755669a8b80 100644 --- a/packages/ui-solid/src/index.tsx +++ b/packages/ui-solid/src/index.tsx @@ -1,4 +1,5 @@ export * from "./Button"; +export * from "./PaddingField"; export * from "./PositionOffsetField"; export * from "./ProgressCircle"; export * from "./SwitchTab"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fb43a78d38c..6085d59125c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,11 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + storybook-solidjs-vite: 1.0.0-beta.2 + storybook-solidjs: 1.0.0-beta.2 + '@storybook/builder-vite': 8.6.12 + importers: .: @@ -115,7 +120,7 @@ importers: version: 0.14.10(solid-js@1.9.6) '@solidjs/start': specifier: ^1.1.3 - version: 1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-rc.13)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1) + version: 1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-rc.17)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1) '@tanstack/solid-query': specifier: ^5.51.21 version: 5.75.4(solid-js@1.9.6) @@ -205,7 +210,7 @@ importers: version: 9.0.1 vinxi: specifier: ^0.5.6 - version: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-rc.13)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + version: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-rc.17)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) webcodecs: specifier: ^0.1.0 version: 0.1.0 @@ -310,7 +315,7 @@ importers: devDependencies: '@types/bun': specifier: latest - version: 1.3.11 + version: 1.3.13 apps/storybook: dependencies: @@ -352,11 +357,11 @@ importers: specifier: ^8.2.7 version: 8.6.12(prettier@3.7.4) storybook-solidjs: - specifier: ^1.0.0-beta.2 - version: 1.0.0-beta.7(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.7.4)))(solid-js@1.9.6)(storybook@8.6.12(prettier@3.7.4)) + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(babel-preset-solid@1.9.6(@babel/core@7.27.1))(solid-js@1.9.6) storybook-solidjs-vite: - specifier: ^1.0.0-beta.2 - version: 1.0.0-beta.7(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.7.4)))(esbuild@0.25.5)(rollup@4.40.2)(solid-js@1.9.6)(storybook@8.6.12(prettier@3.7.4))(vite-plugin-solid@2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5)) + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(storybook@8.6.12(prettier@3.7.4))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) typescript: specifier: ^5.8.3 version: 5.8.3 @@ -464,7 +469,7 @@ importers: version: 3.10.0(react-hook-form@7.56.2(react@19.2.4)) '@kubiks/otel-drizzle': specifier: ^2.1.0 - version: 2.1.0(@opentelemetry/api@1.9.0)(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2)) + version: 2.1.0(@opentelemetry/api@1.9.0)(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2)) '@mux/mux-node': specifier: ^8.5.1 version: 8.8.0(encoding@0.1.13) @@ -602,7 +607,7 @@ importers: version: 16.5.0 drizzle-orm: specifier: 0.44.6 - version: 0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2) + version: 0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2) dub: specifier: ^0.64.0 version: 0.64.0(@modelcontextprotocol/sdk@1.6.1)(zod@3.25.76) @@ -963,7 +968,7 @@ importers: version: 0.47.0(@effect/experimental@0.56.0(@effect/platform@0.92.1(effect@3.18.4))(effect@3.18.4)(ioredis@5.6.1))(@effect/platform@0.92.1(effect@3.18.4))(@effect/sql@0.44.2(@effect/experimental@0.56.0(@effect/platform@0.92.1(effect@3.18.4))(effect@3.18.4)(ioredis@5.6.1))(@effect/platform@0.92.1(effect@3.18.4))(effect@3.18.4))(effect@3.18.4) '@kubiks/otel-drizzle': specifier: ^2.1.0 - version: 2.1.0(@opentelemetry/api@1.9.0)(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2)) + version: 2.1.0(@opentelemetry/api@1.9.0)(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2)) '@mattrax/mysql-planetscale': specifier: ^0.0.3 version: 0.0.3 @@ -984,7 +989,7 @@ importers: version: 1.0.5(react@19.1.1) drizzle-orm: specifier: 0.44.6 - version: 0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2) + version: 0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2) dub: specifier: ^0.64.0 version: 0.64.0(@modelcontextprotocol/sdk@1.6.1)(zod@3.25.76) @@ -1263,8 +1268,8 @@ importers: specifier: ^8.4.41 version: 8.5.3 storybook-solidjs: - specifier: ^1.0.0-beta.2 - version: 1.0.0-beta.7(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.7.4)))(solid-js@1.9.6)(storybook@8.6.12(prettier@3.7.4)) + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(babel-preset-solid@1.9.6(@babel/core@7.27.1))(solid-js@1.9.6) tailwind-scrollbar: specifier: ^3.1.0 version: 3.1.0(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@22.15.17)(typescript@5.8.3))) @@ -1388,7 +1393,7 @@ importers: version: 3.1.0(@aws-sdk/credential-provider-web-identity@3.972.26) drizzle-orm: specifier: 0.44.6 - version: 0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2) + version: 0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2) effect: specifier: ^3.18.4 version: 3.18.4 @@ -1912,10 +1917,6 @@ packages: resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} engines: {node: '>=6.9.0'} - '@babel/standalone@7.27.2': - resolution: {integrity: sha512-fO5toB6PVy7WFfAtXScY1xzwbTOgzxNw+eIiYpjPy9dNeTVscu59fX68JBz+iOZ/ZHsVBjQa4y7yent7eTDgXg==} - engines: {node: '>=6.9.0'} - '@babel/template@7.27.2': resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} @@ -2327,11 +2328,14 @@ packages: '@effect/rpc': ^0.71.0 effect: ^3.18.1 + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + '@emnapi/core@1.5.0': resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==} - '@emnapi/core@1.9.1': - resolution: {integrity: sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==} + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} '@emnapi/runtime@1.4.3': resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} @@ -2342,14 +2346,11 @@ packages: '@emnapi/runtime@1.7.1': resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} - '@emnapi/runtime@1.9.1': - resolution: {integrity: sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==} - '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} - '@emnapi/wasi-threads@1.2.0': - resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==} + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} '@esbuild-kit/core-utils@3.3.2': resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} @@ -4255,8 +4256,8 @@ packages: '@napi-rs/wasm-runtime@1.0.6': resolution: {integrity: sha512-DXj75ewm11LIWUk198QSKUTxjyRjsBwk09MuMk5DGK+GDUtyPhhEHOGP/Xwwj3DjQXXkivoBirmOnKrLfc0+9g==} - '@napi-rs/wasm-runtime@1.1.2': - resolution: {integrity: sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw==} + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} peerDependencies: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 @@ -4868,8 +4869,8 @@ packages: resolution: {integrity: sha512-JD6DerIKdJGmRp4jQyX5FlrQjA4tjOw1cvfsPAZXfOOEErMUHjPcPSICS+6WnM0nB0efSFARh0KAZss+bvExOA==} engines: {node: '>=14'} - '@oxc-project/types@0.123.0': - resolution: {integrity: sha512-YtECP/y8Mj1lSHiUWGSRzy/C6teUKlS87dEfuVKT09LgQbUsBW1rNg+MiJ4buGu3yuADV60gbIvo9/HplA56Ew==} + '@oxc-project/types@0.127.0': + resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==} '@oxc-project/types@0.94.0': resolution: {integrity: sha512-+UgQT/4o59cZfH6Cp7G0hwmqEQ0wE+AdIwhikdwnhWI9Dp8CgSY081+Q3O67/wq3VJu8mgUEB93J9EHHn70fOw==} @@ -5655,95 +5656,111 @@ packages: '@react-email/body@0.0.11': resolution: {integrity: sha512-ZSD2SxVSgUjHGrB0Wi+4tu3MEpB4fYSbezsFNEJk2xCWDBkFiOeEsjTmR5dvi+CxTK691hQTQlHv0XWuP7ENTg==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/button@0.1.0': resolution: {integrity: sha512-fg4LtgTu5zXxaRSly9cuv6sHVF/hi1lElbRaIA8EPx5coWOBhCto6rCPfawcXpaN2oER7rNHUrcNBkI+lz5F9A==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/code-block@0.1.0': resolution: {integrity: sha512-jSpHFsgqnQXxDIssE4gvmdtFncaFQz5D6e22BnVjcCPk/udK+0A9jRwGFEG8JD2si9ZXBmU4WsuqQEczuZn4ww==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/code-inline@0.0.5': resolution: {integrity: sha512-MmAsOzdJpzsnY2cZoPHFPk6uDO/Ncpb4Kh1hAt9UZc1xOW3fIzpe1Pi9y9p6wwUmpaeeDalJxAxH6/fnTquinA==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/column@0.0.13': resolution: {integrity: sha512-Lqq17l7ShzJG/d3b1w/+lVO+gp2FM05ZUo/nW0rjxB8xBICXOVv6PqjDnn3FXKssvhO5qAV20lHM6S+spRhEwQ==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/components@0.1.0': resolution: {integrity: sha512-Rx0eZk0XuzLKXC5NoMm8xuH72ALVsPYNb/BvcdCJx4EZAoVpQISb4sCqpo9blVYVIazNr4MqWroqFb3ZNrCLMQ==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/container@0.0.15': resolution: {integrity: sha512-Qo2IQo0ru2kZq47REmHW3iXjAQaKu4tpeq/M8m1zHIVwKduL2vYOBQWbC2oDnMtWPmkBjej6XxgtZByxM6cCFg==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/font@0.0.9': resolution: {integrity: sha512-4zjq23oT9APXkerqeslPH3OZWuh5X4crHK6nx82mVHV2SrLba8+8dPEnWbaACWTNjOCbcLIzaC9unk7Wq2MIXw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/head@0.0.12': resolution: {integrity: sha512-X2Ii6dDFMF+D4niNwMAHbTkeCjlYYnMsd7edXOsi0JByxt9wNyZ9EnhFiBoQdqkE+SMDcu8TlNNttMrf5sJeMA==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/heading@0.0.15': resolution: {integrity: sha512-xF2GqsvBrp/HbRHWEfOgSfRFX+Q8I5KBEIG5+Lv3Vb2R/NYr0s8A5JhHHGf2pWBMJdbP4B2WHgj/VUrhy8dkIg==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/hr@0.0.11': resolution: {integrity: sha512-S1gZHVhwOsd1Iad5IFhpfICwNPMGPJidG/Uysy1AwmspyoAP5a4Iw3OWEpINFdgh9MHladbxcLKO2AJO+cA9Lw==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/html@0.0.11': resolution: {integrity: sha512-qJhbOQy5VW5qzU74AimjAR9FRFQfrMa7dn4gkEXKMB/S9xZN8e1yC1uA9C15jkXI/PzmJ0muDIWmFwatm5/+VA==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/img@0.0.11': resolution: {integrity: sha512-aGc8Y6U5C3igoMaqAJKsCpkbm1XjguQ09Acd+YcTKwjnC2+0w3yGUJkjWB2vTx4tN8dCqQCXO8FmdJpMfOA9EQ==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/link@0.0.12': resolution: {integrity: sha512-vF+xxQk2fGS1CN7UPQDbzvcBGfffr+GjTPNiWM38fhBfsLv6A/YUfaqxWlmL7zLzVmo0K2cvvV9wxlSyNba1aQ==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/markdown@0.0.15': resolution: {integrity: sha512-UQA9pVm5sbflgtg3EX3FquUP4aMBzmLReLbGJ6DZQZnAskBF36aI56cRykDq1o+1jT+CKIK1CducPYziaXliag==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/preview@0.0.13': resolution: {integrity: sha512-F7j9FJ0JN/A4d7yr+aw28p4uX7VLWs7hTHtLo7WRyw4G+Lit6Zucq4UWKRxJC8lpsUdzVmG7aBJnKOT+urqs/w==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc @@ -5757,24 +5774,28 @@ packages: '@react-email/row@0.0.12': resolution: {integrity: sha512-HkCdnEjvK3o+n0y0tZKXYhIXUNPDx+2vq1dJTmqappVHXS5tXS6W5JOPZr5j+eoZ8gY3PShI2LWj5rWF7ZEtIQ==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/section@0.0.16': resolution: {integrity: sha512-FjqF9xQ8FoeUZYKSdt8sMIKvoT9XF8BrzhT3xiFKdEMwYNbsDflcjfErJe3jb7Wj/es/lKTbV5QR1dnLzGpL3w==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/tailwind@1.0.5': resolution: {integrity: sha512-BH00cZSeFfP9HiDASl+sPHi7Hh77W5nzDgdnxtsVr/m3uQD9g180UwxcE3PhOfx0vRdLzQUU8PtmvvDfbztKQg==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/text@0.1.5': resolution: {integrity: sha512-o5PNHFSE085VMXayxH+SJ1LSOtGsTv+RpNKnTiJDrJUwoBu77G3PlKOsZZQHCNyD28WsQpl9v2WcJLbQudqwPg==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc @@ -5819,8 +5840,8 @@ packages: cpu: [arm64] os: [android] - '@rolldown/binding-android-arm64@1.0.0-rc.13': - resolution: {integrity: sha512-5ZiiecKH2DXAVJTNN13gNMUcCDg4Jy8ZjbXEsPnqa248wgOVeYRX0iqXXD5Jz4bI9BFHgKsI2qmyJynstbmr+g==} + '@rolldown/binding-android-arm64@1.0.0-rc.17': + resolution: {integrity: sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] @@ -5831,8 +5852,8 @@ packages: cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-arm64@1.0.0-rc.13': - resolution: {integrity: sha512-tz/v/8G77seu8zAB3A5sK3UFoOl06zcshEzhUO62sAEtrEuW/H1CcyoupOrD+NbQJytYgA4CppXPzlrmp4JZKA==} + '@rolldown/binding-darwin-arm64@1.0.0-rc.17': + resolution: {integrity: sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] @@ -5843,8 +5864,8 @@ packages: cpu: [x64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-rc.13': - resolution: {integrity: sha512-8DakphqOz8JrMYWTJmWA+vDJxut6LijZ8Xcdc4flOlAhU7PNVwo2MaWBF9iXjJAPo5rC/IxEFZDhJ3GC7NHvug==} + '@rolldown/binding-darwin-x64@1.0.0-rc.17': + resolution: {integrity: sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] @@ -5855,8 +5876,8 @@ packages: cpu: [x64] os: [freebsd] - '@rolldown/binding-freebsd-x64@1.0.0-rc.13': - resolution: {integrity: sha512-4wBQFfjDuXYN/SVI8inBF3Aa+isq40rc6VMFbk5jcpolUBTe5cYnMsHZ51nFWsx3PVyyNN3vgoESki0Hmr/4BA==} + '@rolldown/binding-freebsd-x64@1.0.0-rc.17': + resolution: {integrity: sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] @@ -5867,8 +5888,8 @@ packages: cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.13': - resolution: {integrity: sha512-JW/e4yPIXLms+jmnbwwy5LA/LxVwZUWLN8xug+V200wzaVi5TEGIWQlh8o91gWYFxW609euI98OCCemmWGuPrw==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17': + resolution: {integrity: sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] @@ -5879,8 +5900,8 @@ packages: cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.13': - resolution: {integrity: sha512-ZfKWpXiUymDnavepCaM6KG/uGydJ4l2nBmMxg60Ci4CbeefpqjPWpfaZM7PThOhk2dssqBAcwLc6rAyr0uTdXg==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] @@ -5891,20 +5912,20 @@ packages: cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.13': - resolution: {integrity: sha512-bmRg3O6Z0gq9yodKKWCIpnlH051sEfdVwt+6m5UDffAQMUUqU0xjnQqqAUm+Gu7ofAAly9DqiQDtKu2nPDEABA==} + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17': + resolution: {integrity: sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.13': - resolution: {integrity: sha512-8Wtnbw4k7pMYN9B/mOEAsQ8HOiq7AZ31Ig4M9BKn2So4xRaFEhtCSa4ZJaOutOWq50zpgR4N5+L/opnlaCx8wQ==} + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.13': - resolution: {integrity: sha512-D/0Nlo8mQuxSMohNJUF2lDXWRsFDsHldfRRgD9bRgktj+EndGPj4DOV37LqDKPYS+osdyhZEH7fTakTAEcW7qg==} + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] @@ -5915,8 +5936,8 @@ packages: cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.13': - resolution: {integrity: sha512-eRrPvat2YaVQcwwKi/JzOP6MKf1WRnOCr+VaI3cTWz3ZoLcP/654z90lVCJ4dAuMEpPdke0n+qyAqXDZdIC4rA==} + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] @@ -5927,8 +5948,8 @@ packages: cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-musl@1.0.0-rc.13': - resolution: {integrity: sha512-PsdONiFRp8hR8KgVjTWjZ9s7uA3uueWL0t74/cKHfM4dR5zXYv4AjB8BvA+QDToqxAFg4ZkcVEqeu5F7inoz5w==} + '@rolldown/binding-linux-x64-musl@1.0.0-rc.17': + resolution: {integrity: sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] @@ -5939,8 +5960,8 @@ packages: cpu: [arm64] os: [openharmony] - '@rolldown/binding-openharmony-arm64@1.0.0-rc.13': - resolution: {integrity: sha512-hCNXgC5dI3TVOLrPT++PKFNZ+1EtS0mLQwfXXXSUD/+rGlB65gZDwN/IDuxLpQP4x8RYYHqGomlUXzpO8aVI2w==} + '@rolldown/binding-openharmony-arm64@1.0.0-rc.17': + resolution: {integrity: sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] @@ -5950,9 +5971,9 @@ packages: engines: {node: '>=14.0.0'} cpu: [wasm32] - '@rolldown/binding-wasm32-wasi@1.0.0-rc.13': - resolution: {integrity: sha512-viLS5C5et8NFtLWw9Sw3M/w4vvnVkbWkO7wSNh3C+7G1+uCkGpr6PcjNDSFcNtmXY/4trjPBqUfcOL+P3sWy/g==} - engines: {node: '>=14.0.0'} + '@rolldown/binding-wasm32-wasi@1.0.0-rc.17': + resolution: {integrity: sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.42': @@ -5961,8 +5982,8 @@ packages: cpu: [arm64] os: [win32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.13': - resolution: {integrity: sha512-Fqa3Tlt1xL4wzmAYxGNFV36Hb+VfPc9PYU+E25DAnswXv3ODDu/yyWjQDbXMo5AGWkQVjLgQExuVu8I/UaZhPQ==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17': + resolution: {integrity: sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] @@ -5979,8 +6000,8 @@ packages: cpu: [x64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.13': - resolution: {integrity: sha512-/pLI5kPkGEi44TDlnbio3St/5gUFeN51YWNAk/Gnv6mEQBOahRBh52qVFVBpmrnU01n2yysvBML9Ynu7K4kGAQ==} + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17': + resolution: {integrity: sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -5988,8 +6009,8 @@ packages: '@rolldown/pluginutils@1.0.0-beta.42': resolution: {integrity: sha512-N7pQzk9CyE7q0bBN/q0J8s6Db279r5kUZc6d7/wWRe9/zXqC52HQovVyu6iXPIDY4BEzzgbVLhVFXrOuGJ22ZQ==} - '@rolldown/pluginutils@1.0.0-rc.13': - resolution: {integrity: sha512-3ngTAv6F/Py35BsYbeeLeecvhMKdsKm4AoOETVhAA+Qc8nrA2I0kF7oa93mE9qnIurngOSpMnQ0x2nQY2FPviA==} + '@rolldown/pluginutils@1.0.0-rc.17': + resolution: {integrity: sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg==} '@rollup/plugin-alias@5.1.1': resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} @@ -7060,11 +7081,11 @@ packages: react-dom: optional: true - '@storybook/builder-vite@10.4.0-alpha.8': - resolution: {integrity: sha512-weLrxdNknHwHZrGMVfWjAcN48kIG5ipYJAWjKrx2nzhCaZY30DQ1SuVVaDiwVSUfTmncK/MX5weerJjb8Ny66g==} + '@storybook/builder-vite@8.6.12': + resolution: {integrity: sha512-Gju21ud/3Qw4v2vLNaa5SuJECsI9ICNRr2G0UyCCzRvCHg8jpA9lDReu2NqhLDyFIuDG+ZYT38gcaHEUoNQ8KQ==} peerDependencies: - storybook: ^10.4.0-alpha.8 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + storybook: ^8.6.12 + vite: ^4.0.0 || ^5.0.0 || ^6.0.0 '@storybook/core@8.6.12': resolution: {integrity: sha512-t+ZuDzAlsXKa6tLxNZT81gEAt4GNwsKP/Id2wluhmUWD/lwYW0uum1JiPUuanw8xD6TdakCW/7ULZc7aQUBLCQ==} @@ -7074,24 +7095,6 @@ packages: prettier: optional: true - '@storybook/csf-plugin@10.4.0-alpha.8': - resolution: {integrity: sha512-h5GXJaAQGNRhko09qvoVAxPBLvKlQkgDFBgc/3TPZKd2t0fZMErdJPX6ixn4cOONn5SpDqeI/uej0OHC5uazlg==} - peerDependencies: - esbuild: '*' - rollup: '*' - storybook: ^10.4.0-alpha.8 - vite: '*' - webpack: '*' - peerDependenciesMeta: - esbuild: - optional: true - rollup: - optional: true - vite: - optional: true - webpack: - optional: true - '@storybook/csf-plugin@8.6.12': resolution: {integrity: sha512-6s8CnP1aoKPb3XtC0jRLUp8M5vTA8RhGAwQDKUsFpCC7g89JR9CaKs9FY2ZSzsNbjR15uASi7b3K8BzeYumYQg==} peerDependencies: @@ -7102,11 +7105,6 @@ packages: peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - '@storybook/docs-tools@9.0.0-alpha.1': - resolution: {integrity: sha512-+TJAemnAxjkY8ZznwOjot4tysY626X/ju7WAeifh0qEFnmw83ZNZahw0bg/PhrlGmxB3Y3h8hE0YEn7sURqy2w==} - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 || ^9.0.0-0 - '@storybook/global@5.0.0': resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} @@ -7122,11 +7120,6 @@ packages: peerDependencies: storybook: ^8.6.12 - '@storybook/preview-api@9.0.0-alpha.1': - resolution: {integrity: sha512-icCFaC6CMbqJAudEY6c7hsnAW4lArLxqf9q264cAhxaJg+Ki5T7vxSrb+FckJM7xawy3QOSxhzs4xA7tVy4n+w==} - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 || ^9.0.0-0 - '@storybook/react-dom-shim@8.6.12': resolution: {integrity: sha512-51QvoimkBzYs8s3rCYnY5h0cFqLz/Mh0vRcughwYaXckWzDBV8l67WBO5Xf5nBsukCbWyqBVPpEQLww8s7mrLA==} peerDependencies: @@ -7148,11 +7141,6 @@ packages: peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - '@storybook/types@9.0.0-alpha.1': - resolution: {integrity: sha512-n2pfsrXdrjsOiVs0FbN7rw1hD4Lh3mtcQvbf2QjCHFlT+UGaOYtPuA+hjJafaz97ayTWXc/RAz382DQHTA6tyw==} - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 || ^9.0.0-0 - '@stripe/stripe-js@3.5.0': resolution: {integrity: sha512-pKS3wZnJoL1iTyGBXAvCwduNNeghJHY6QSRSNNvpYnrrQrLZ6Owsazjyynu0e0ObRgks0i7Rv+pe2M7/MBTZpQ==} engines: {node: '>=12.16'} @@ -7735,8 +7723,8 @@ packages: '@types/braces@3.0.5': resolution: {integrity: sha512-SQFof9H+LXeWNz8wDe7oN5zu7ket0qwMu5vZubW4GCJ8Kkeh6nBWUz87+KTz/G3Kqsrp0j/W253XJb3KMEeg3w==} - '@types/bun@1.3.11': - resolution: {integrity: sha512-5vPne5QvtpjGpsGYXiFyycfpDF2ECyPcTSsFBMa0fraoxiQyMJ3SmuQIGhzPg2WJuWxVBoxWJ2kClYTcw/4fAg==} + '@types/bun@1.3.13': + resolution: {integrity: sha512-9fqXWk5YIHGGnUau9TEi+qdlTYDAnOj+xLCmSTwXfAIqXr2x4tytJb43E9uCvt09zJURKXwAtkoH4nLQfzeTXw==} '@types/cacheable-request@6.0.3': resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} @@ -7801,12 +7789,6 @@ packages: '@types/dom-webcodecs@0.1.14': resolution: {integrity: sha512-ba9aF0qARLLQpLihONIRbj8VvAdUxO+5jIxlscVcDAQTcJmq5qVr781+ino5qbQUJUmO21cLP2eLeXYWzao5Vg==} - '@types/eslint-scope@3.7.7': - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} - - '@types/eslint@9.6.1': - resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} - '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} @@ -8376,51 +8358,6 @@ packages: '@vitest/utils@3.2.4': resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} - '@webassemblyjs/ast@1.14.1': - resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} - - '@webassemblyjs/floating-point-hex-parser@1.13.2': - resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} - - '@webassemblyjs/helper-api-error@1.13.2': - resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} - - '@webassemblyjs/helper-buffer@1.14.1': - resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} - - '@webassemblyjs/helper-numbers@1.13.2': - resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} - - '@webassemblyjs/helper-wasm-bytecode@1.13.2': - resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} - - '@webassemblyjs/helper-wasm-section@1.14.1': - resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} - - '@webassemblyjs/ieee754@1.13.2': - resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} - - '@webassemblyjs/leb128@1.13.2': - resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} - - '@webassemblyjs/utf8@1.13.2': - resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} - - '@webassemblyjs/wasm-edit@1.14.1': - resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} - - '@webassemblyjs/wasm-gen@1.14.1': - resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} - - '@webassemblyjs/wasm-opt@1.14.1': - resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} - - '@webassemblyjs/wasm-parser@1.14.1': - resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} - - '@webassemblyjs/wast-printer@1.14.1': - resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} - '@webgpu/types@0.1.68': resolution: {integrity: sha512-3ab1B59Ojb6RwjOspYLsTpCzbNB3ZaamIAxBMmvnNkiDoLTZUOBXZ9p5nAYVEkQlDdf6qAZWi1pqj9+ypiqznA==} @@ -8581,12 +8518,6 @@ packages: resolution: {integrity: sha512-siPY6BD5dQ2SZPl3I0OZBHL27ZqZvLEosObsZRQ1NUB8qcxegwt0T9eKtV96JMFQpIz1elhkzqOg4c/Ri6Dp9A==} engines: {node: ^14.14.0 || >=16.0.0} - '@xtuc/ieee754@1.2.0': - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - - '@xtuc/long@4.2.2': - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} @@ -8615,12 +8546,6 @@ packages: peerDependencies: acorn: ^8 - acorn-import-phases@1.0.4: - resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} - engines: {node: '>=10.13.0'} - peerDependencies: - acorn: ^8.14.0 - acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -8684,19 +8609,6 @@ packages: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} - ajv-formats@2.1.1: - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - - ajv-keywords@5.1.0: - resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} - peerDependencies: - ajv: ^8.8.2 - ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -8902,9 +8814,6 @@ packages: resolution: {integrity: sha512-V+SsTpDqkrWTimiotsyl33ePSjA5/KrithwupuvJ6ztsqPvGv6ge4OredFhPffVXiLN/QUWvE0XcqJaYgt6fOg==} engines: {node: '>= 14'} - async-mutex@0.5.0: - resolution: {integrity: sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==} - async-sema@3.1.1: resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} @@ -8928,6 +8837,7 @@ packages: aws-sdk@2.1692.0: resolution: {integrity: sha512-x511uiJ/57FIsbgUe5csJ13k3uzu25uWQE+XqfBis/sB0SFoiElJWXRkgEAUh0U6n40eT3ay5Ue4oPkRMu1LYw==} engines: {node: '>= 10.0.0'} + deprecated: The AWS SDK for JavaScript (v2) has reached end-of-support, and no longer receives updates. Please migrate your code to use AWS SDK for JavaScript (v3). More info https://a.co/cUPnyil aws-ssl-profiles@1.1.2: resolution: {integrity: sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==} @@ -9108,8 +9018,8 @@ packages: resolution: {integrity: sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==} engines: {node: '>=18.20'} - bun-types@1.3.11: - resolution: {integrity: sha512-1KGPpoxQWl9f6wcZh57LvrPIInQMn2TQ7jsgxqpRzg+l0QPOFvJVH7HmvHo/AiPgwXy+/Thf6Ov3EdVn1vOabg==} + bun-types@1.3.13: + resolution: {integrity: sha512-QXKeHLlOLqQX9LgYaHJfzdBaV21T63HhFJnvuRCcjZiaUDpbs5ED1MgxbMra71CsryN/1dAoXuJJJwIv/2drVA==} bundle-name@4.1.0: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} @@ -9299,10 +9209,6 @@ packages: '@chromatic-com/playwright': optional: true - chrome-trace-event@1.0.4: - resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} - engines: {node: '>=6.0'} - citty@0.1.6: resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} @@ -11828,10 +11734,6 @@ packages: engines: {node: '>=10'} hasBin: true - jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} - jiti@1.21.7: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true @@ -11906,9 +11808,6 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-parse-even-better-errors@3.0.2: resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -12038,10 +11937,6 @@ packages: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - loader-runner@4.3.1: - resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} - engines: {node: '>=6.11.5'} - local-pkg@0.5.1: resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} engines: {node: '>=14'} @@ -12716,9 +12611,6 @@ packages: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} - neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - nested-error-stacks@2.1.1: resolution: {integrity: sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==} @@ -14026,8 +13918,8 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - rolldown@1.0.0-rc.13: - resolution: {integrity: sha512-bvVj8YJmf0rq4pSFmH7laLa6pYrhghv3PRzrCdRAr23g66zOKVJ4wkvFtgohtPLWmthgg8/rkaqRHrpUEh0Zbw==} + rolldown@1.0.0-rc.17: + resolution: {integrity: sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -14114,10 +14006,6 @@ packages: scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} - schema-utils@4.3.3: - resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} - engines: {node: '>= 10.13.0'} - scule@1.3.0: resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} @@ -14532,26 +14420,17 @@ packages: resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} engines: {node: '>=4', npm: '>=6'} - storybook-solidjs-vite@1.0.0-beta.7: - resolution: {integrity: sha512-YOTsycsXi1KXOa/nNHbKNvKMELiygDfLQEL1D7yBIW6IhScRgXEIQGttJ8eeYqe43Mofi53U544AOIIF9btEzw==} - engines: {node: '>=18'} - peerDependencies: - solid-js: ~1.9.0 - storybook: '*' - vite: ^4.0.0 || ^5.0.0 || ^6.0.0 - vite-plugin-solid: ^2.10.0 + storybook-solidjs-vite@1.0.0-beta.2: + resolution: {integrity: sha512-dD+VMYC5fBBQNesVb+mjB0LOkZIf100SQFbjAt9/sDstNUvc5ce3yZwLYXzgcOc7jcSMkrBu/cZNRzEM4YIAyw==} + engines: {node: ^14.18 || >=16} - storybook-solidjs@1.0.0-beta.7: - resolution: {integrity: sha512-PgquZC4FiNPCDOIXuXYOco01vMHCXBBAr3Y/a9ylF4+0vOTcL2RAqieUmTbZhBxVWZIm+nPIyOlz8UqhwcgLtQ==} - engines: {node: '>=18.0.0'} + storybook-solidjs@1.0.0-beta.2: + resolution: {integrity: sha512-wXjM/uH29IPjgxlPvQVNTM/7iBFNNzjuOugpk7iM2oy+sZl7K70eBjvOqGgX5v35pNHTaA8Ju3BlLdp+O20abg==} + engines: {node: '>=16.0.0'} deprecated: 'This package is deprecated. Use storybook-solidjs-vite instead: https://www.npmjs.com/package/storybook-solidjs-vite' peerDependencies: - '@storybook/test': '*' - solid-js: ~1.9.0 - storybook: '*' - peerDependenciesMeta: - '@storybook/test': - optional: true + babel-preset-solid: ^1.6.6 + solid-js: ^1.6.6 storybook@8.6.12: resolution: {integrity: sha512-Z/nWYEHBTLK1ZBtAWdhxC0l5zf7ioJ7G4+zYqtTdYeb67gTnxNj80gehf8o8QY9L2zA2+eyMRGLC2V5fI7Z3Tw==} @@ -14764,12 +14643,12 @@ packages: tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} - deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me tar@7.4.3: resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} engines: {node: '>=18'} - deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me tauri-plugin-context-menu@0.5.0: resolution: {integrity: sha512-CkAjSyxLx26hTXabG5Unbv+GWeH0XYNQB3zTqRxHpp257mWX8I4oASp8YF5T3zxFQEK++ZHqMZHpLrQ3usShRQ==} @@ -14787,22 +14666,6 @@ packages: peerDependencies: solid-js: ^1.8 - terser-webpack-plugin@5.3.14: - resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true - terser@5.39.0: resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} engines: {node: '>=10'} @@ -15864,23 +15727,9 @@ packages: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} - webpack-sources@3.3.3: - resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} - engines: {node: '>=10.13.0'} - webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - webpack@5.101.3: - resolution: {integrity: sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} @@ -17491,8 +17340,6 @@ snapshots: '@babel/runtime@7.27.1': {} - '@babel/standalone@7.27.2': {} - '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 @@ -17904,15 +17751,20 @@ snapshots: '@effect/rpc': 0.71.0(@effect/platform@0.92.1(effect@3.18.4))(effect@3.18.4) effect: 3.18.4 + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + '@emnapi/core@1.5.0': dependencies: '@emnapi/wasi-threads': 1.1.0 tslib: 2.8.1 optional: true - '@emnapi/core@1.9.1': + '@emnapi/runtime@1.10.0': dependencies: - '@emnapi/wasi-threads': 1.2.0 tslib: 2.8.1 optional: true @@ -17931,17 +17783,12 @@ snapshots: tslib: 2.8.1 optional: true - '@emnapi/runtime@1.9.1': - dependencies: - tslib: 2.8.1 - optional: true - '@emnapi/wasi-threads@1.1.0': dependencies: tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.2.0': + '@emnapi/wasi-threads@1.2.1': dependencies: tslib: 2.8.1 optional: true @@ -19044,10 +18891,10 @@ snapshots: '@solid-primitives/utils': 6.3.1(solid-js@1.9.6) solid-js: 1.9.6 - '@kubiks/otel-drizzle@2.1.0(@opentelemetry/api@1.9.0)(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2))': + '@kubiks/otel-drizzle@2.1.0(@opentelemetry/api@1.9.0)(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2))': dependencies: '@opentelemetry/api': 1.9.0 - drizzle-orm: 0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2) + drizzle-orm: 0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2) '@logdna/tail-file@2.2.0': {} @@ -19276,8 +19123,8 @@ snapshots: '@napi-rs/wasm-runtime@0.2.9': dependencies: - '@emnapi/core': 1.9.1 - '@emnapi/runtime': 1.9.1 + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 '@tybys/wasm-util': 0.9.0 optional: true @@ -19288,10 +19135,10 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@napi-rs/wasm-runtime@1.1.2(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)': + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@emnapi/core': 1.9.1 - '@emnapi/runtime': 1.9.1 + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 '@tybys/wasm-util': 0.10.1 optional: true @@ -20071,7 +19918,7 @@ snapshots: '@opentelemetry/semantic-conventions@1.37.0': {} - '@oxc-project/types@0.123.0': {} + '@oxc-project/types@0.127.0': {} '@oxc-project/types@0.94.0': {} @@ -21162,67 +21009,67 @@ snapshots: '@rolldown/binding-android-arm64@1.0.0-beta.42': optional: true - '@rolldown/binding-android-arm64@1.0.0-rc.13': + '@rolldown/binding-android-arm64@1.0.0-rc.17': optional: true '@rolldown/binding-darwin-arm64@1.0.0-beta.42': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-rc.13': + '@rolldown/binding-darwin-arm64@1.0.0-rc.17': optional: true '@rolldown/binding-darwin-x64@1.0.0-beta.42': optional: true - '@rolldown/binding-darwin-x64@1.0.0-rc.13': + '@rolldown/binding-darwin-x64@1.0.0-rc.17': optional: true '@rolldown/binding-freebsd-x64@1.0.0-beta.42': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-rc.13': + '@rolldown/binding-freebsd-x64@1.0.0-rc.17': optional: true '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.42': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.13': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17': optional: true '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.42': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.13': + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17': optional: true '@rolldown/binding-linux-arm64-musl@1.0.0-beta.42': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.13': + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.13': + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.13': + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17': optional: true '@rolldown/binding-linux-x64-gnu@1.0.0-beta.42': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.13': + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17': optional: true '@rolldown/binding-linux-x64-musl@1.0.0-beta.42': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-rc.13': + '@rolldown/binding-linux-x64-musl@1.0.0-rc.17': optional: true '@rolldown/binding-openharmony-arm64@1.0.0-beta.42': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-rc.13': + '@rolldown/binding-openharmony-arm64@1.0.0-rc.17': optional: true '@rolldown/binding-wasm32-wasi@1.0.0-beta.42': @@ -21230,17 +21077,17 @@ snapshots: '@napi-rs/wasm-runtime': 1.0.6 optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-rc.13': + '@rolldown/binding-wasm32-wasi@1.0.0-rc.17': dependencies: - '@emnapi/core': 1.9.1 - '@emnapi/runtime': 1.9.1 - '@napi-rs/wasm-runtime': 1.1.2(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1) + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.42': optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.13': + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17': optional: true '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.42': @@ -21249,12 +21096,12 @@ snapshots: '@rolldown/binding-win32-x64-msvc@1.0.0-beta.42': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.13': + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17': optional: true '@rolldown/pluginutils@1.0.0-beta.42': {} - '@rolldown/pluginutils@1.0.0-rc.13': {} + '@rolldown/pluginutils@1.0.0-rc.17': {} '@rollup/plugin-alias@5.1.1(rollup@4.40.2)': optionalDependencies: @@ -22531,11 +22378,11 @@ snapshots: dependencies: solid-js: 1.9.6 - '@solidjs/start@1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-rc.13)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1)': + '@solidjs/start@1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-rc.17)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1)': dependencies: '@tanstack/server-functions-plugin': 1.119.2(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) - '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-rc.13)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) - '@vinxi/server-components': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-rc.13)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) + '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-rc.17)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) + '@vinxi/server-components': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-rc.17)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) defu: 6.1.4 error-stack-parser: 2.1.4 html-to-image: 1.11.13 @@ -22546,7 +22393,7 @@ snapshots: source-map-js: 1.2.1 terracotta: 1.0.6(solid-js@1.9.6) tinyglobby: 0.2.13 - vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-rc.13)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-rc.17)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) vite-plugin-solid: 2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) transitivePeerDependencies: - '@testing-library/jest-dom' @@ -22676,16 +22523,13 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - '@storybook/builder-vite@10.4.0-alpha.8(esbuild@0.25.5)(rollup@4.40.2)(storybook@8.6.12(prettier@3.7.4))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5))': + '@storybook/builder-vite@8.6.12(storybook@8.6.12(prettier@3.7.4))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))': dependencies: - '@storybook/csf-plugin': 10.4.0-alpha.8(esbuild@0.25.5)(rollup@4.40.2)(storybook@8.6.12(prettier@3.7.4))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5)) + '@storybook/csf-plugin': 8.6.12(storybook@8.6.12(prettier@3.7.4)) + browser-assert: 1.2.1 storybook: 8.6.12(prettier@3.7.4) ts-dedent: 2.2.0 vite: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) - transitivePeerDependencies: - - esbuild - - rollup - - webpack '@storybook/core@8.6.12(prettier@3.7.4)(storybook@8.6.12(prettier@3.7.4))': dependencies: @@ -22708,16 +22552,6 @@ snapshots: - supports-color - utf-8-validate - '@storybook/csf-plugin@10.4.0-alpha.8(esbuild@0.25.5)(rollup@4.40.2)(storybook@8.6.12(prettier@3.7.4))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5))': - dependencies: - storybook: 8.6.12(prettier@3.7.4) - unplugin: 2.3.11 - optionalDependencies: - esbuild: 0.25.5 - rollup: 4.40.2 - vite: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) - webpack: 5.101.3(esbuild@0.25.5) - '@storybook/csf-plugin@8.6.12(storybook@8.6.12(prettier@3.7.4))': dependencies: storybook: 8.6.12(prettier@3.7.4) @@ -22727,10 +22561,6 @@ snapshots: dependencies: storybook: 8.6.12(prettier@3.7.4) - '@storybook/docs-tools@9.0.0-alpha.1(storybook@8.6.12(prettier@3.7.4))': - dependencies: - storybook: 8.6.12(prettier@3.7.4) - '@storybook/global@5.0.0': {} '@storybook/icons@1.4.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': @@ -22744,10 +22574,6 @@ snapshots: '@vitest/utils': 2.1.9 storybook: 8.6.12(prettier@3.7.4) - '@storybook/preview-api@9.0.0-alpha.1(storybook@8.6.12(prettier@3.7.4))': - dependencies: - storybook: 8.6.12(prettier@3.7.4) - '@storybook/react-dom-shim@8.6.12(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@8.6.12(prettier@3.7.4))': dependencies: react: 19.2.4 @@ -22775,10 +22601,6 @@ snapshots: dependencies: storybook: 8.6.12(prettier@3.7.4) - '@storybook/types@9.0.0-alpha.1(storybook@8.6.12(prettier@3.7.4))': - dependencies: - storybook: 8.6.12(prettier@3.7.4) - '@stripe/stripe-js@3.5.0': {} '@swc/cli@0.8.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(chokidar@5.0.0)': @@ -23378,9 +23200,9 @@ snapshots: '@types/braces@3.0.5': {} - '@types/bun@1.3.11': + '@types/bun@1.3.13': dependencies: - bun-types: 1.3.11 + bun-types: 1.3.13 '@types/cacheable-request@6.0.3': dependencies: @@ -23449,18 +23271,6 @@ snapshots: '@types/dom-webcodecs@0.1.14': {} - '@types/eslint-scope@3.7.7': - dependencies: - '@types/eslint': 9.6.1 - '@types/estree': 1.0.8 - optional: true - - '@types/eslint@9.6.1': - dependencies: - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - optional: true - '@types/estree-jsx@1.0.5': dependencies: '@types/estree': 1.0.8 @@ -23922,8 +23732,8 @@ snapshots: dependencies: '@mapbox/node-pre-gyp': 1.0.11(encoding@0.1.13) '@rollup/pluginutils': 5.1.4(rollup@4.40.2) - acorn: 8.15.0 - acorn-import-attributes: 1.9.5(acorn@8.15.0) + acorn: 8.16.0 + acorn-import-attributes: 1.9.5(acorn@8.16.0) async-sema: 3.1.1 bindings: 1.5.0 estree-walker: 2.0.2 @@ -24000,7 +23810,7 @@ snapshots: untun: 0.1.3 uqr: 0.1.2 - '@vinxi/plugin-directives@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-rc.13)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': + '@vinxi/plugin-directives@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-rc.17)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': dependencies: '@babel/parser': 7.27.2 acorn: 8.14.1 @@ -24011,18 +23821,18 @@ snapshots: magicast: 0.2.11 recast: 0.23.11 tslib: 2.8.1 - vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-rc.13)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-rc.17)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) - '@vinxi/server-components@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-rc.13)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': + '@vinxi/server-components@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-rc.17)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': dependencies: - '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-rc.13)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) + '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-rc.17)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) acorn: 8.14.1 acorn-loose: 8.5.0 acorn-typescript: 1.4.13(acorn@8.14.1) astring: 1.9.0 magicast: 0.2.11 recast: 0.23.11 - vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-rc.13)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-rc.17)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) '@virtual-grid/core@2.0.1': {} @@ -24185,97 +23995,6 @@ snapshots: loupe: 3.2.1 tinyrainbow: 2.0.0 - '@webassemblyjs/ast@1.14.1': - dependencies: - '@webassemblyjs/helper-numbers': 1.13.2 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - optional: true - - '@webassemblyjs/floating-point-hex-parser@1.13.2': - optional: true - - '@webassemblyjs/helper-api-error@1.13.2': - optional: true - - '@webassemblyjs/helper-buffer@1.14.1': - optional: true - - '@webassemblyjs/helper-numbers@1.13.2': - dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.13.2 - '@webassemblyjs/helper-api-error': 1.13.2 - '@xtuc/long': 4.2.2 - optional: true - - '@webassemblyjs/helper-wasm-bytecode@1.13.2': - optional: true - - '@webassemblyjs/helper-wasm-section@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/wasm-gen': 1.14.1 - optional: true - - '@webassemblyjs/ieee754@1.13.2': - dependencies: - '@xtuc/ieee754': 1.2.0 - optional: true - - '@webassemblyjs/leb128@1.13.2': - dependencies: - '@xtuc/long': 4.2.2 - optional: true - - '@webassemblyjs/utf8@1.13.2': - optional: true - - '@webassemblyjs/wasm-edit@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/helper-wasm-section': 1.14.1 - '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/wasm-opt': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - '@webassemblyjs/wast-printer': 1.14.1 - optional: true - - '@webassemblyjs/wasm-gen@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/ieee754': 1.13.2 - '@webassemblyjs/leb128': 1.13.2 - '@webassemblyjs/utf8': 1.13.2 - optional: true - - '@webassemblyjs/wasm-opt@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - optional: true - - '@webassemblyjs/wasm-parser@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-api-error': 1.13.2 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/ieee754': 1.13.2 - '@webassemblyjs/leb128': 1.13.2 - '@webassemblyjs/utf8': 1.13.2 - optional: true - - '@webassemblyjs/wast-printer@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@xtuc/long': 4.2.2 - optional: true - '@webgpu/types@0.1.68': {} '@whatwg-node/disposablestack@0.0.6': @@ -24649,12 +24368,6 @@ snapshots: dependencies: arch: 3.0.0 - '@xtuc/ieee754@1.2.0': - optional: true - - '@xtuc/long@4.2.2': - optional: true - abbrev@1.1.1: {} abbrev@2.0.0: {} @@ -24679,10 +24392,9 @@ snapshots: dependencies: acorn: 8.15.0 - acorn-import-phases@1.0.4(acorn@8.16.0): + acorn-import-attributes@1.9.5(acorn@8.16.0): dependencies: acorn: 8.16.0 - optional: true acorn-jsx@5.3.2(acorn@7.4.1): dependencies: @@ -24738,17 +24450,6 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 - ajv-formats@2.1.1(ajv@8.17.1): - optionalDependencies: - ajv: 8.17.1 - optional: true - - ajv-keywords@5.1.0(ajv@8.17.1): - dependencies: - ajv: 8.17.1 - fast-deep-equal: 3.1.3 - optional: true - ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -25013,10 +24714,6 @@ snapshots: async-listen@3.0.0: {} - async-mutex@0.5.0: - dependencies: - tslib: 2.8.1 - async-sema@3.1.1: {} async@3.2.6: {} @@ -25261,7 +24958,7 @@ snapshots: builtin-modules@5.0.0: {} - bun-types@1.3.11: + bun-types@1.3.13: dependencies: '@types/node': 20.19.21 @@ -25478,9 +25175,6 @@ snapshots: chromatic@11.28.2: {} - chrome-trace-event@1.0.4: - optional: true - citty@0.1.6: dependencies: consola: 3.4.2 @@ -25828,9 +25522,9 @@ snapshots: dayjs@1.11.13: {} - db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2))(mysql2@3.15.2): + db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2))(mysql2@3.15.2): optionalDependencies: - drizzle-orm: 0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2) + drizzle-orm: 0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2) mysql2: 3.15.2 debounce@2.2.0: {} @@ -26108,12 +25802,12 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2): + drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2): optionalDependencies: '@cloudflare/workers-types': 4.20250507.0 '@opentelemetry/api': 1.9.0 '@planetscale/database': 1.19.0 - bun-types: 1.3.11 + bun-types: 1.3.13 mysql2: 3.15.2 dts-resolver@2.1.2: {} @@ -26409,7 +26103,7 @@ snapshots: esast-util-from-js@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 - acorn: 8.15.0 + acorn: 8.16.0 esast-util-from-estree: 2.0.0 vfile-message: 4.0.2 @@ -26687,7 +26381,7 @@ snapshots: '@next/eslint-plugin-next': 16.2.1 eslint: 9.30.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.30.1(jiti@2.6.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.57.2(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)) eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.57.2(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.6.1)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.30.1(jiti@2.6.1)) eslint-plugin-react: 7.37.5(eslint@9.30.1(jiti@2.6.1)) @@ -26734,7 +26428,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.30.1(jiti@2.6.1)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.57.2(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3(supports-color@8.1.1) @@ -26760,14 +26454,14 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.57.2(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.6.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.57.2(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.57.2(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.57.2(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3) eslint: 9.30.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.30.1(jiti@2.6.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.57.2(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)) transitivePeerDependencies: - supports-color @@ -26811,7 +26505,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.30.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.57.2(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.6.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.57.2(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.57.2(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -28546,13 +28240,6 @@ snapshots: filelist: 1.0.4 picocolors: 1.1.1 - jest-worker@27.5.1: - dependencies: - '@types/node': 20.19.21 - merge-stream: 2.0.0 - supports-color: 8.1.1 - optional: true - jiti@1.21.7: {} jiti@2.4.2: {} @@ -28621,9 +28308,6 @@ snapshots: json-buffer@3.0.1: {} - json-parse-even-better-errors@2.3.1: - optional: true - json-parse-even-better-errors@3.0.2: {} json-schema-traverse@0.4.1: {} @@ -28746,9 +28430,6 @@ snapshots: load-tsconfig@0.2.5: {} - loader-runner@4.3.1: - optional: true - local-pkg@0.5.1: dependencies: mlly: 1.7.4 @@ -29669,9 +29350,6 @@ snapshots: negotiator@1.0.0: {} - neo-async@2.6.2: - optional: true - nested-error-stacks@2.1.1: {} netlify@13.3.5: @@ -29805,7 +29483,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - nitropack@2.11.11(@planetscale/database@1.19.0)(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2))(encoding@0.1.13)(mysql2@3.15.2)(rolldown@1.0.0-rc.13)(xml2js@0.6.2): + nitropack@2.11.11(@planetscale/database@1.19.0)(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2))(encoding@0.1.13)(mysql2@3.15.2)(rolldown@1.0.0-rc.17)(xml2js@0.6.2): dependencies: '@cloudflare/kv-asset-handler': 0.4.0 '@netlify/functions': 3.1.5(encoding@0.1.13)(rollup@4.40.2) @@ -29827,7 +29505,7 @@ snapshots: cookie-es: 2.0.0 croner: 9.0.0 crossws: 0.3.5 - db0: 0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2))(mysql2@3.15.2) + db0: 0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2))(mysql2@3.15.2) defu: 6.1.4 destr: 2.0.5 dot-prop: 9.0.0 @@ -29859,7 +29537,7 @@ snapshots: pretty-bytes: 6.1.1 radix3: 1.1.2 rollup: 4.40.2 - rollup-plugin-visualizer: 5.14.0(rolldown@1.0.0-rc.13)(rollup@4.40.2) + rollup-plugin-visualizer: 5.14.0(rolldown@1.0.0-rc.17)(rollup@4.40.2) scule: 1.3.0 semver: 7.7.2 serve-placeholder: 2.0.2 @@ -29873,7 +29551,7 @@ snapshots: unenv: 2.0.0-rc.15 unimport: 5.0.1 unplugin-utils: 0.2.4 - unstorage: 1.16.0(@planetscale/database@1.19.0)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2))(mysql2@3.15.2))(ioredis@5.6.1) + unstorage: 1.16.0(@planetscale/database@1.19.0)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2))(mysql2@3.15.2))(ioredis@5.6.1) untyped: 2.0.0 unwasm: 0.3.9 youch: 4.1.0-beta.7 @@ -31297,7 +30975,7 @@ snapshots: dependencies: glob: 7.2.3 - rolldown-plugin-dts@0.16.11(rolldown@1.0.0-rc.13)(typescript@5.8.3): + rolldown-plugin-dts@0.16.11(rolldown@1.0.0-rc.17)(typescript@5.8.3): dependencies: '@babel/generator': 7.28.3 '@babel/parser': 7.28.4 @@ -31308,7 +30986,7 @@ snapshots: dts-resolver: 2.1.2 get-tsconfig: 4.11.0 magic-string: 0.30.19 - rolldown: 1.0.0-rc.13 + rolldown: 1.0.0-rc.17 optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -31336,26 +31014,26 @@ snapshots: '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.42 '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.42 - rolldown@1.0.0-rc.13: + rolldown@1.0.0-rc.17: dependencies: - '@oxc-project/types': 0.123.0 - '@rolldown/pluginutils': 1.0.0-rc.13 + '@oxc-project/types': 0.127.0 + '@rolldown/pluginutils': 1.0.0-rc.17 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-rc.13 - '@rolldown/binding-darwin-arm64': 1.0.0-rc.13 - '@rolldown/binding-darwin-x64': 1.0.0-rc.13 - '@rolldown/binding-freebsd-x64': 1.0.0-rc.13 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.13 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.13 - '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.13 - '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.13 - '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.13 - '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.13 - '@rolldown/binding-linux-x64-musl': 1.0.0-rc.13 - '@rolldown/binding-openharmony-arm64': 1.0.0-rc.13 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.13 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.13 - '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.13 + '@rolldown/binding-android-arm64': 1.0.0-rc.17 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.17 + '@rolldown/binding-darwin-x64': 1.0.0-rc.17 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.17 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.17 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.17 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.17 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.17 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.17 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.17 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.17 rollup-plugin-inject@3.0.2: dependencies: @@ -31367,14 +31045,14 @@ snapshots: dependencies: rollup-plugin-inject: 3.0.2 - rollup-plugin-visualizer@5.14.0(rolldown@1.0.0-rc.13)(rollup@4.40.2): + rollup-plugin-visualizer@5.14.0(rolldown@1.0.0-rc.17)(rollup@4.40.2): dependencies: open: 8.4.2 picomatch: 4.0.3 source-map: 0.7.4 yargs: 17.7.2 optionalDependencies: - rolldown: 1.0.0-rc.13 + rolldown: 1.0.0-rc.17 rollup: 4.40.2 rollup-pluginutils@2.8.2: @@ -31466,14 +31144,6 @@ snapshots: scheduler@0.27.0: {} - schema-utils@4.3.3: - dependencies: - '@types/json-schema': 7.0.15 - ajv: 8.17.1 - ajv-formats: 2.1.1(ajv@8.17.1) - ajv-keywords: 5.1.0(ajv@8.17.1) - optional: true - scule@1.3.0: {} seedrandom@3.0.5: {} @@ -31998,35 +31668,17 @@ snapshots: stoppable@1.1.0: {} - storybook-solidjs-vite@1.0.0-beta.7(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.7.4)))(esbuild@0.25.5)(rollup@4.40.2)(solid-js@1.9.6)(storybook@8.6.12(prettier@3.7.4))(vite-plugin-solid@2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5)): + storybook-solidjs-vite@1.0.0-beta.2(storybook@8.6.12(prettier@3.7.4))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)): dependencies: - '@storybook/builder-vite': 10.4.0-alpha.8(esbuild@0.25.5)(rollup@4.40.2)(storybook@8.6.12(prettier@3.7.4))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5)) - '@storybook/types': 9.0.0-alpha.1(storybook@8.6.12(prettier@3.7.4)) - magic-string: 0.30.17 - solid-js: 1.9.6 - storybook: 8.6.12(prettier@3.7.4) - storybook-solidjs: 1.0.0-beta.7(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.7.4)))(solid-js@1.9.6)(storybook@8.6.12(prettier@3.7.4)) - vite: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) - vite-plugin-solid: 2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) + '@storybook/builder-vite': 8.6.12(storybook@8.6.12(prettier@3.7.4))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) transitivePeerDependencies: - - '@storybook/test' - - esbuild - - rollup - - webpack + - storybook + - vite - storybook-solidjs@1.0.0-beta.7(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.7.4)))(solid-js@1.9.6)(storybook@8.6.12(prettier@3.7.4)): + storybook-solidjs@1.0.0-beta.2(babel-preset-solid@1.9.6(@babel/core@7.27.1))(solid-js@1.9.6): dependencies: - '@babel/standalone': 7.27.2 - '@storybook/docs-tools': 9.0.0-alpha.1(storybook@8.6.12(prettier@3.7.4)) - '@storybook/global': 5.0.0 - '@storybook/preview-api': 9.0.0-alpha.1(storybook@8.6.12(prettier@3.7.4)) - '@storybook/types': 9.0.0-alpha.1(storybook@8.6.12(prettier@3.7.4)) - '@types/babel__standalone': link:.yarn/cache/null - async-mutex: 0.5.0 + babel-preset-solid: 1.9.6(@babel/core@7.27.1) solid-js: 1.9.6 - storybook: 8.6.12(prettier@3.7.4) - optionalDependencies: - '@storybook/test': 8.6.12(storybook@8.6.12(prettier@3.7.4)) storybook@8.6.12(prettier@3.7.4): dependencies: @@ -32398,18 +32050,6 @@ snapshots: solid-js: 1.9.6 solid-use: 0.9.1(solid-js@1.9.6) - terser-webpack-plugin@5.3.14(esbuild@0.25.5)(webpack@5.101.3(esbuild@0.25.5)): - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - jest-worker: 27.5.1 - schema-utils: 4.3.3 - serialize-javascript: 6.0.2 - terser: 5.44.0 - webpack: 5.101.3(esbuild@0.25.5) - optionalDependencies: - esbuild: 0.25.5 - optional: true - terser@5.39.0: dependencies: '@jridgewell/source-map': 0.3.6 @@ -32641,8 +32281,8 @@ snapshots: diff: 8.0.2 empathic: 2.0.0 hookable: 5.5.3 - rolldown: 1.0.0-rc.13 - rolldown-plugin-dts: 0.16.11(rolldown@1.0.0-rc.13)(typescript@5.8.3) + rolldown: 1.0.0-rc.17 + rolldown-plugin-dts: 0.16.11(rolldown@1.0.0-rc.17)(typescript@5.8.3) semver: 7.7.2 tinyexec: 1.0.1 tinyglobby: 0.2.15 @@ -33122,7 +32762,7 @@ snapshots: '@unrs/resolver-binding-win32-ia32-msvc': 1.7.2 '@unrs/resolver-binding-win32-x64-msvc': 1.7.2 - unstorage@1.16.0(@planetscale/database@1.19.0)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2))(mysql2@3.15.2))(ioredis@5.6.1): + unstorage@1.16.0(@planetscale/database@1.19.0)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2))(mysql2@3.15.2))(ioredis@5.6.1): dependencies: anymatch: 3.1.3 chokidar: 4.0.3 @@ -33134,7 +32774,7 @@ snapshots: ufo: 1.6.1 optionalDependencies: '@planetscale/database': 1.19.0 - db0: 0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2))(mysql2@3.15.2) + db0: 0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2))(mysql2@3.15.2) ioredis: 5.6.1 untun@0.1.3: @@ -33300,7 +32940,7 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-rc.13)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1): + vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-rc.17)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1): dependencies: '@babel/core': 7.27.1 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.1) @@ -33322,7 +32962,7 @@ snapshots: hookable: 5.5.3 http-proxy: 1.18.1 micromatch: 4.0.8 - nitropack: 2.11.11(@planetscale/database@1.19.0)(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2))(encoding@0.1.13)(mysql2@3.15.2)(rolldown@1.0.0-rc.13)(xml2js@0.6.2) + nitropack: 2.11.11(@planetscale/database@1.19.0)(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2))(encoding@0.1.13)(mysql2@3.15.2)(rolldown@1.0.0-rc.17)(xml2js@0.6.2) node-fetch-native: 1.6.6 path-to-regexp: 6.3.0 pathe: 1.1.2 @@ -33333,7 +32973,7 @@ snapshots: ufo: 1.6.1 unctx: 2.4.1 unenv: 1.10.0 - unstorage: 1.16.0(@planetscale/database@1.19.0)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.11)(mysql2@3.15.2))(mysql2@3.15.2))(ioredis@5.6.1) + unstorage: 1.16.0(@planetscale/database@1.19.0)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.13)(mysql2@3.15.2))(mysql2@3.15.2))(ioredis@5.6.1) vite: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) zod: 3.25.76 transitivePeerDependencies: @@ -33645,44 +33285,8 @@ snapshots: webidl-conversions@7.0.0: {} - webpack-sources@3.3.3: - optional: true - webpack-virtual-modules@0.6.2: {} - webpack@5.101.3(esbuild@0.25.5): - dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/wasm-edit': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.16.0 - acorn-import-phases: 1.0.4(acorn@8.16.0) - browserslist: 4.26.3 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.19.0 - es-module-lexer: 1.7.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.1 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 4.3.3 - tapable: 2.3.0 - terser-webpack-plugin: 5.3.14(esbuild@0.25.5)(webpack@5.101.3(esbuild@0.25.5)) - watchpack: 2.5.1 - webpack-sources: 3.3.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - optional: true - whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3 From 88783e836f013f10ae24e9ffb385fd34b6d7539c Mon Sep 17 00:00:00 2001 From: Bowei Liu Date: Tue, 28 Apr 2026 16:14:57 -0700 Subject: [PATCH 3/6] Add MR_TEST_REVIEW.md Co-authored-by: Sculptor --- MR_TEST_REVIEW.md | 80 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 MR_TEST_REVIEW.md diff --git a/MR_TEST_REVIEW.md b/MR_TEST_REVIEW.md new file mode 100644 index 00000000000..373389dc3c0 --- /dev/null +++ b/MR_TEST_REVIEW.md @@ -0,0 +1,80 @@ +# MR Review — `crates/rendering/src/lib.rs` test changes + +Branch: `position-offset-field` vs `main`. Scope: tests in `mod tests` only. + +## Summary of test diff + +| Status | Test | Notes | +|--------|------|-------| +| Removed | (none) | | +| Modified | (none) | Existing tests untouched. | +| Added | `position_offset_zero_matches_centered_offset` | Sanity check: zero offset == pre-feature baseline. | +| Added | `position_offset_shifts_image_within_available_room` | Asserts ±50 shifts image by `room * 0.5` on x and y. | +| Added | `position_offset_clamps_to_keep_image_visible` | Extreme values (±500) clamp to keep image inside frame. | +| Added | `position_offset_does_not_change_display_size` | Invariant: offset only translates, never resizes. | + +No regressions in existing coverage. No callers/signatures of `display_offset` / `display_size` changed outwardly, so old tests still exercise the same surface. + +## Code under test (recap) + +New tail in `display_layout`: + +```rust +let room = output_size - target_size; +let shift_x = (project.background.position_offset_x / 100.0) * room.x; +let shift_y = (project.background.position_offset_y / 100.0) * room.y; +let raw_offset = centered_offset + XY::new(shift_x, shift_y); +let max_x = room.x.max(0.0); +let max_y = room.y.max(0.0); +let offset = XY::new( + raw_offset.x.clamp(0.0, max_x), + raw_offset.y.clamp(0.0, max_y), +); +``` + +Plus refactor: `display_offset` + `display_size` collapse into single `display_layout`. `display_bounds` drops `output_size` param; uses `display_offset + display_size` for end. + +## Correctness analysis + +### Refactor (non-test) sanity +- `display_bounds` previously did `output_size - display_offset` for `base_end`. That assumed symmetric centering — invalid once offset is asymmetric. New form `display_offset + display_size` is correct under any offset. +- `display_size` was previously `(output - 2*offset)`, only valid when image was centered. Now derived directly from layout. Correct. +- Fold of two functions into `display_layout` returning `(offset, size)` — same outputs, no behavior drift in the no-offset case (verified by `position_offset_zero_matches_centered_offset` and the untouched existing tests). + +### Logic correctness — what the math actually does +`centered_offset` is the **left/top margin** when image is centered, i.e. `room/2`. New shift = `(pct/100) * room`. So: + +| pct | raw_offset | post-clamp | meaning | +|-----|-----------|-----------|---------| +| 0 | room/2 | room/2 | centered | +| +50 | room | room | image flush against right/bottom edge | +| -50 | 0 | 0 | flush against left/top | +| +100| 1.5·room | room (clamped) | saturated | +| -100| -room/2 | 0 (clamped) | saturated | + +**Issue**: useful slider range is `[-50, +50]`; values past ±50 are clamped no-ops. If product spec wanted ±100 to be the extremes (typical slider UX), the divisor should be `200.0` instead of `100.0`, or shift should be `(pct/100) * (room/2)`. As-is, half the slider range is dead. The tests *encode* this behavior rather than challenge it — `position_offset_shifts_image_within_available_room` uses ±50 and asserts shift == `room * 0.5`, which mathematically matches, but documents the half-range-dead UX. **Worth confirming with design before merge.** + +### Test-by-test verdict + +1. **`position_offset_zero_matches_centered_offset`** — Correct. Guards against accidental drift when feature flag is off (offset=0). Uses auto-aspect path (no `aspect_ratio`). + +2. **`position_offset_shifts_image_within_available_room`** — Correct given the code. Caveats: + - Uses `aspect_ratio: Wide`, so only the fixed-aspect branch is exercised. + - Does not cover combined non-zero x AND y simultaneously. + - Does not cover intermediate values (e.g. 25%) to verify linearity. + - Hard-codes the half-range-saturation behavior (see issue above). + +3. **`position_offset_clamps_to_keep_image_visible`** — Correct. Tests extreme out-of-range (±500) and asserts image stays in `[0, output]`. Good. But: also worth asserting image is **at the edge** (not at center), to catch a bug where clamp is too aggressive. + +4. **`position_offset_does_not_change_display_size`** — Correct invariant. Only checks the fixed-aspect branch. + +### Coverage gaps +- **Auto-aspect-ratio branch with non-zero offset is untested.** The auto branch computes `target_size = output - centered*2` differently; the same room-shift logic should apply but isn't asserted. Test 1 covers offset=0 on auto path only — insufficient. +- **No test for `display_bounds` change.** The signature/body change isn't directly exercised; relies on integration with `ProjectUniforms::new`. +- **Sign of y-axis convention**: `position_offset_y = +50` produces `centered.y + room.y/2` (image moves *down* in frame coords). Test 2 names it `shifted_down` — consistent. Confirm UI sends positive Y for "down" or negate at boundary. +- **Float strictness**: tests use `1e-6` epsilon; `f64::EPSILON` would be tighter. Current tolerance is fine but loose. + +## Recommendation +- **LGTM on test correctness** (assertions match implementation). +- **Block on**: confirm whether the ±50 = full-extreme is the intended slider semantics. If not, fix code (`/200.0` or `room/2` factor), update tests accordingly. +- **Nice-to-have**: add an auto-aspect branch shift test, and a combined x+y test. From eca1e81831b551369e82c0002a8aebbcafca4eeb Mon Sep 17 00:00:00 2001 From: Bowei Liu Date: Tue, 28 Apr 2026 16:50:07 -0700 Subject: [PATCH 4/6] Wire PositionOffsetField into ConfigSidebar Co-authored-by: Sculptor --- .../src/routes/editor/ConfigSidebar.tsx | 15 ++++ apps/desktop/src/utils/tauri.ts | 2 +- apps/storybook/.storybook/preview.ts | 1 + apps/storybook/package.json | 1 + pnpm-lock.yaml | 3 + position-offset-wiring.md | 71 +++++++++++++++++++ 6 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 position-offset-wiring.md diff --git a/apps/desktop/src/routes/editor/ConfigSidebar.tsx b/apps/desktop/src/routes/editor/ConfigSidebar.tsx index b45c5dbd58b..f858dbcc8c9 100644 --- a/apps/desktop/src/routes/editor/ConfigSidebar.tsx +++ b/apps/desktop/src/routes/editor/ConfigSidebar.tsx @@ -1,3 +1,4 @@ +import { PositionOffsetField } from "@cap/ui-solid"; import { NumberField } from "@kobalte/core"; import { Collapsible, @@ -59,6 +60,7 @@ import IconLucideGauge from "~icons/lucide/gauge"; import IconLucideGrid from "~icons/lucide/grid"; import IconLucideKeyboard from "~icons/lucide/keyboard"; import IconLucideMonitor from "~icons/lucide/monitor"; +import IconLucideMove from "~icons/lucide/move"; import IconLucideMoon from "~icons/lucide/moon"; import IconLucidePalette from "~icons/lucide/palette"; import IconLucideRabbit from "~icons/lucide/rabbit"; @@ -2022,6 +2024,19 @@ function BackgroundConfig(props: { scrollRef: HTMLDivElement }) { formatTooltip="%" /> + } + value={{ + x: project.background.positionOffsetX ?? 0, + y: project.background.positionOffsetY ?? 0, + }} + onChange={(v) => + batch(() => { + setProject("background", "positionOffsetX", v.x); + setProject("background", "positionOffsetY", v.y); + }) + } + /> }>
`). + +**Why:** This is the main video editor. The existing padding slider already +follows the `setProject("background", "padding", v[0])` pattern — position +offset must follow the same pattern so recorded videos can shift the display +within the background. + +**Suggested snippet:** +```tsx +}> + { + setProject("background", "positionOffsetX", v.x); + setProject("background", "positionOffsetY", v.y); + }} + /> + +``` + +### 2. Screenshot editor background popover +**File:** `apps/desktop/src/routes/screenshot-editor/popovers/BackgroundSettingsPopover.tsx`. + +**Why:** The screenshot editor uses the same `BackgroundConfiguration` struct +and already wires padding/rounding here. Without adding the offset field, the +feature will only work for video and not for screenshots, breaking parity. + +Use the same `PositionOffsetField` snippet, bound to whatever local +`setProject`/store equivalent the popover already uses. + +## Prerequisite (not wiring, but required) + +Restart `pnpm dev:desktop` once after the Rust changes. `tauri_specta` +regenerates `apps/desktop/src/utils/tauri.ts`, which currently still has the +old `BackgroundConfiguration` shape (no `positionOffsetX/Y`). Without a restart +the TypeScript wiring above will not compile. Never edit `tauri.ts` by hand. + +## Already done (no action needed) + +- `BackgroundConfiguration` has `position_offset_x` / `position_offset_y` + (snake_case in Rust → `positionOffsetX/Y` in TS via + `#[serde(rename_all = "camelCase")]`). +- `#[serde(default)]` on the struct means old project JSONs without these + fields deserialize to 0.0 — no migration needed. +- Renderer (`crates/rendering/src/lib.rs::display_layout`) consumes the offsets, + applies a percentage shift within the available room, and clamps so the image + stays visible. +- `PositionOffsetField` is exported from + `packages/ui-solid/src/index.tsx`. The desktop app already depends on + `@cap/ui-solid`, so the import will resolve. + +## Quick manual test path before wiring + +If you want to verify the renderer end-to-end before doing the UI work, edit +the project's saved config JSON on disk and set +`background.positionOffsetX` / `background.positionOffsetY` to a value in +roughly `[-50, 50]`, then reopen the project in the editor. From 2a05b14fcc968edb9e9a04ea8fdd09c543b958e8 Mon Sep 17 00:00:00 2001 From: Bowei Liu Date: Tue, 28 Apr 2026 16:57:32 -0700 Subject: [PATCH 5/6] Wire PositionOffsetField into BackgroundSettingsPopover Co-authored-by: Sculptor --- .../popovers/BackgroundSettingsPopover.tsx | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/apps/desktop/src/routes/screenshot-editor/popovers/BackgroundSettingsPopover.tsx b/apps/desktop/src/routes/screenshot-editor/popovers/BackgroundSettingsPopover.tsx index e6dab5748a1..e5b09449d66 100644 --- a/apps/desktop/src/routes/screenshot-editor/popovers/BackgroundSettingsPopover.tsx +++ b/apps/desktop/src/routes/screenshot-editor/popovers/BackgroundSettingsPopover.tsx @@ -1,3 +1,4 @@ +import { PositionOffsetField } from "@cap/ui-solid"; import { Popover } from "@kobalte/core/popover"; import { RadioGroup as KRadioGroup } from "@kobalte/core/radio-group"; import { Tabs as KTabs } from "@kobalte/core/tabs"; @@ -16,6 +17,7 @@ import type { BackgroundSource } from "~/utils/tauri"; import IconCapBgBlur from "~icons/cap/bg-blur"; import IconCapCircleX from "~icons/cap/circle-x"; import IconCapImage from "~icons/cap/image"; +import IconLucideMove from "~icons/lucide/move"; import { DEFAULT_GRADIENT_FROM, DEFAULT_GRADIENT_TO, @@ -539,6 +541,19 @@ export function BackgroundSettingsPopover() { formatTooltip="%" /> + } + value={{ + x: project.background.positionOffsetX ?? 0, + y: project.background.positionOffsetY ?? 0, + }} + onChange={(v) => + batch(() => { + setProject("background", "positionOffsetX", v.x); + setProject("background", "positionOffsetY", v.y); + }) + } + />
From cb91f211d1360bce848a5fc4c49484e334530335 Mon Sep 17 00:00:00 2001 From: Bowei Liu Date: Tue, 28 Apr 2026 20:22:07 -0700 Subject: [PATCH 6/6] depot --- DEPOT_BUILD.md | 63 ++++++++++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 6 ++--- 2 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 DEPOT_BUILD.md diff --git a/DEPOT_BUILD.md b/DEPOT_BUILD.md new file mode 100644 index 00000000000..5d4b03b9e3a --- /dev/null +++ b/DEPOT_BUILD.md @@ -0,0 +1,63 @@ +# Depot Build — cap-web + +Local Docker build of `apps/web` OOMs on Docker Desktop default RAM. Use Depot remote builder instead. + +## Prereqs + +- `depot` CLI installed (`brew install depot/tap/depot`) +- `.env` with: + ``` + export DEPOT_DEV_API_KEY=depot_org_... + export DEPOT_DEV_ORG_ID=.. + export DEPOT_DEV_PROJECT_ID=... + ``` + +## Build + load into local Docker + +```bash +source .env +DEPOT_TOKEN=$DEPOT_DEV_API_KEY \ + depot build \ + --project $DEPOT_DEV_PROJECT_ID \ + -f apps/web/Dockerfile \ + -t cap-web:local \ + --load \ + . +``` + +Flags: +- `--project` — Depot project ID (org token alone insufficient). +- `--load` — pull built image into local Docker daemon as `cap-web:local`. +- Build context = repo root (Dockerfile does `COPY . .`). + +## Verify + +```bash +docker images cap-web:local +``` + +## Use in compose + +`docker-compose.yml` references `cap-web:local`. Bring up: + +```bash +docker compose up -d --force-recreate cap-web +``` + +## Push to registry (optional) + +```bash +DEPOT_TOKEN=$DEPOT_DEV_API_KEY \ + depot build \ + --project $DEPOT_DEV_PROJECT_ID \ + -f apps/web/Dockerfile \ + -t ghcr.io//cap-web: \ + --push \ + . +``` + +## Notes + +- Org token (`depot_org_...`) works for `depot build` with `--project`. Does NOT work for `depot projects list` (user-scoped). +- Local `docker build` fails: `ResourceExhausted: cannot allocate memory` during Next.js build. Bump Docker Desktop RAM to 12GB+ if you want local build. +- `--no-cache` on `docker compose build` skips `cap-web` because compose entry uses `image:` not `build:`. Depot is the build path. diff --git a/docker-compose.yml b/docker-compose.yml index 0aff7ed654c..9f54cd5d5bf 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,7 +3,7 @@ name: cap services: cap-web: container_name: cap-web - image: ghcr.io/capsoftware/cap-web:latest + image: cap-web:local restart: unless-stopped depends_on: mysql: @@ -41,9 +41,7 @@ services: media-server: container_name: cap-media-server - build: - context: ./apps/media-server - dockerfile: Dockerfile.standalone + image: cap-media-server:local restart: unless-stopped environment: PORT: 3456