diff --git a/.opencode/commands/implement-plan.md b/.opencode/commands/implement-plan.md
index 20eedb3fe5..8ecd1bd537 100644
--- a/.opencode/commands/implement-plan.md
+++ b/.opencode/commands/implement-plan.md
@@ -3,11 +3,8 @@ description: Execute a ready plan end-to-end — create a GitHub issue, branch i
agent: build
---
-# Implement Plan
-
This command is run once a plan is ready (for example, from plan mode). Execute
-the plan already prepared in the current session context — it does not take
-extra arguments. Follow these steps in order.
+the plan already prepared in the current session context. Follow these steps in order.
## 1. Create the issue
diff --git a/.opencode/commands/review.md b/.opencode/commands/review.md
deleted file mode 100644
index 70bd89ac90..0000000000
--- a/.opencode/commands/review.md
+++ /dev/null
@@ -1,25 +0,0 @@
-Act as a senior software engineer and perform a thorough review.
-
-## Instructions
-
-1. **Determine what is being reviewed** from the provided context:
- - **If it is a plan** (implementation plan, design document, task breakdown) → load the **`plan-review`** skill.
- - **If it is code** (diff, PR, code change) → load the **`code-review`** skill.
-
-2. Read `AGENTS.md` and follow its instructions for finding and reading all related testing documentation from memories before reviewing.
-
-3. **Skip generated files, lockfile-only changes, and unrelated modifications** unless they introduce security risks.
-
-4. Follow the loaded skill's process and produce its output format.
-
-## Strong Rules
-
-1. Do not invent problems. Every finding must be real and actionable.
-2. Do not modify any code and do not create a commit — this command only reviews.
-3. Be specific and constructive. "This could be better" is not helpful — explain why and how.
-4. Prioritize by impact. One structural issue outweighs ten nits.
-5. Missing tests are an issue, not a suggestion. Report as a severity-tagged finding — never as a recommendation.
-
-## Context
-
-$ARGUMENTS
diff --git a/.opencode/skills/code-review/SKILL.md b/.opencode/skills/code-review/SKILL.md
index 7f06d90b59..7fa581efa0 100644
--- a/.opencode/skills/code-review/SKILL.md
+++ b/.opencode/skills/code-review/SKILL.md
@@ -106,6 +106,8 @@ For detailed security guidance, see `security-and-hardening`.
| **Low:** | Minor, optional | Author may ignore — formatting, style preferences |
| **Suggestion:** | Worth considering | Not required, but improves the code |
+**Unique finding IDs.** Assign every finding a stable identifier: `F1`, `F2`, `F3`, … numbered in order of severity (Critical first, then High, Medium, Low, Suggestion). Use the ID everywhere the finding is mentioned — in section headers, in the verdict, in follow-up discussion. Never renumber within a review. Example: `**F3 (High)** — `app/validate.cljs:42` — duplicate branch logic…`.
+
For each finding, describe the circumstances under which it could fail: specific inputs, load conditions, timing, or user actions that trigger the problem. "This crashes when input is null" is actionable; "this might crash" is not.
Lead with what matters: correctness and security first, then structural issues, then everything else. A few high-conviction comments beat a long list.
@@ -122,11 +124,11 @@ Briefly explain what the code does and give an overall assessment.
### Critical and High-Priority Issues
-List problems that could cause security incidents, data loss, crashes, incorrect behavior, or major performance degradation. For each: state the severity, identify the file/function/code section, explain why it's a problem, describe failure circumstances, and provide a concrete improvement with corrected code when useful.
+List problems that could cause security incidents, data loss, crashes, incorrect behavior, or major performance degradation. Each finding gets its unique ID (`F1`, `F2`, …). For each: state the severity, identify the file/function/code section, explain why it's a problem, describe failure circumstances, and provide a concrete improvement with corrected code when useful.
### Other Findings
-List medium- and low-priority issues, including maintainability and design concerns.
+List medium- and low-priority issues, including maintainability and design concerns. Continue the ID sequence started above (`F3`, `F4`, …).
### Suggested Refactoring
@@ -148,6 +150,8 @@ Choose one:
- **Approve with minor changes** — Good to merge after addressing low/medium issues
- **Request changes** — Critical or high issues must be resolved before merge
+List the finding IDs the verdict depends on (e.g. "Request changes: F1, F4").
+
## Change Sizing
Small, focused changes are easier to review, faster to merge, and safer to deploy.
@@ -231,25 +235,13 @@ For supply-chain risk triage, follow the `security-and-hardening` skill.
## Verification
-After review is complete:
+Before emitting the verdict, verify the change as it stands. This is the reviewer's own due diligence — it covers the state of the code at review time, not the later resolution of findings (fixing findings is the author's job; confirming them is a new review):
-- [ ] All Critical issues are resolved
-- [ ] All Required (no-prefix) changes are resolved or explicitly deferred with justification
-- [ ] Tests pass
+- [ ] Tests pass — run them yourself, don't trust the claim
- [ ] Build succeeds
- [ ] The verification story is documented (what changed, how it was verified)
- [ ] Dependency upgrades reviewed against changelog, isolated per package, verified by green suite
-## Multi-Model Review Pattern
-
-Use different models for different review perspectives:
-
-```
-Model A writes the code → Model B reviews → Model A addresses feedback → Human makes the final call
-```
-
-Different models have different blind spots.
-
## See Also
- For detailed security review guidance, see `security-and-hardening`
diff --git a/.opencode/skills/planner/SKILL.md b/.opencode/skills/planner/SKILL.md
index d1802652e2..3598a0dc16 100644
--- a/.opencode/skills/planner/SKILL.md
+++ b/.opencode/skills/planner/SKILL.md
@@ -1,13 +1,13 @@
---
name: planner
-description: Read-only planning and architecture analysis for Penpot — produce a structured implementation plan (Context, Affected modules, Approach, Risks, Testing). Always output to the user; additionally save to .opencode/plans/YYYY-MM-DD-
.md.
+description: Read-only planning and architecture analysis for Penpot — produce a structured implementation plan with task breakdown, acceptance criteria, sizing, and checkpoints. Always output to the user and save to .opencode/plans/YYYY-MM-DD-.md.
---
# Planner
Read-only senior software architect role for Penpot. Produces structured
-implementation plans that engineers or other agents can execute. Never writes
-or modifies code.
+implementation plans with task breakdowns that engineers or other agents can
+execute. Never writes or modifies code.
## When to Use
@@ -18,24 +18,29 @@ or modifies code.
- The user asks "how would I implement X?" or "what's involved in fixing Y?".
- The user is about to start non-trivial work and wants a bite-sized task
breakdown.
+- A task feels too large or vague to start.
+- Work needs to be parallelized across multiple agents or sessions.
Do **not** use this skill to actually implement anything — it is read-only.
+**When NOT to use:** Single-file changes with obvious scope, or when the spec
+already contains well-defined tasks.
+
## Role
-You are a Senior Software Architect working on Penpot, an open-source design
-tool. Your sole responsibility is planning and analysis — you do NOT write or
-modify code.
+You help users understand the Penpot codebase, design solutions, and produce
+implementation plans that other agents or developers can execute. The plan
+tells them what to build and how to verify it, task by task.
-You help users understand the codebase, design solutions, and create detailed
-implementation plans that other agents or developers can execute. Document
-everything they need to know: which files to touch for each task, code patterns,
-tests, and how to verify correctness. Apply DRY and KISS principles.
+The implementer reads the project's agent docs (`AGENTS.md`, project memories
+such as `mem:critical-info`, `mem:testing`, and each module's core memory)
+before working. Reference those memories instead of re-explaining tooling,
+conventions, or test design — explain in the plan only what they do not cover.
Do **not** suggest commit messages or commit names anywhere in your plans or
-responses — committing is the developer's responsibility.
+responses — committing is the implementer's responsibility.
-## Required Reading Before Planning
+## CRITICAL: Required Reading Before Planning
Before drafting any plan, work through the project's own guidance:
@@ -50,6 +55,8 @@ Before drafting any plan, work through the project's own guidance:
Skipping this step is the #1 cause of incorrect or incomplete plans.
+---
+
## The Planning Process
### Phase 1: Architecture Analysis
@@ -64,16 +71,42 @@ Skipping this step is the #1 cause of incorrect or incomplete plans.
### Phase 2: Task Breakdown
-Implementation order follows the monorepo's dependency graph:
-`frontend -> common`, `backend -> common`, `exporter -> common`,
-`frontend -> render-wasm`. Build shared foundations first, then layer
-consumers on top.
+#### Identify the Dependency Graph
+
+Map what depends on what, following the monorepo's module dependency graph:
+
+```
+common (shared types, schemas — no deps)
+ │
+ ├── backend (depends common)
+ │ ├── RPC handlers
+ │ └── persistence / migrations
+ │
+ ├── frontend (depends common, render-wasm)
+ │ ├── UI components
+ │ └── state / API integration
+ │
+ ├── exporter (depends common)
+ │
+ └── render-wasm (consumed by frontend)
+```
+
+Implementation order follows the dependency graph bottom-up: build shared
+foundations first, then layer consumers on top.
#### Slice Vertically
Instead of building all of common, then all of backend, then all of frontend —
build one complete feature path at a time:
+**Bad (horizontal slicing):**
+```
+Task 1: Build all common types
+Task 2: Build all backend handlers
+Task 3: Build all frontend components
+```
+
+**Good (vertical slicing):**
```
Task 1: common data types + schema ← foundation
Task 2: backend RPC handler + persistence
@@ -89,39 +122,58 @@ Each task follows this structure:
```markdown
## Task [N]: [Short descriptive title]
-**Description:** One paragraph explaining what this task accomplishes.
+**Description:** One or two paragraphs explaining what this task accomplishes.
+Should be clear and concise.
+
+**Rationale:** Why this task exists and why this approach over the obvious
+alternatives — design decisions, trade-offs, constraints discovered during
+analysis. One or two sentences; skip only if genuinely trivial.
+
+**Code sketch (optional):** Signature-, type-, or shape-level example when the
+intended interface is non-obvious. Keep it short — a skeleton that fixes the
+contract (function signature, model fields, error shape), never a full
+implementation. Omit when the task is mechanical.
**Acceptance criteria:**
- [ ] [Specific, testable condition]
- [ ] [Specific, testable condition]
**Verification:**
-- [ ] Tests pass (module-specific test command)
-- [ ] Lint/formatter passes (module-specific check command)
+- [ ] Relevant tests pass (module-specific test command).
+- [ ] Lint/formatter passes (module-specific check command), if applicable.
+- [ ] The core flow works end-to-end, if applicable.
**Dependencies:** [Task numbers this depends on, or "None"]
**Files likely touched:**
- `path/to/file.clj`
- `path/to/file_test.clj`
+
+**Estimated scope:** [XS: 1 file | S: 1-2 files | M: 3-5 files | L: 5+ files]
```
Replace "module-specific test command" with the actual commands for the module
-(e.g. `clojure -M:dev:test` for backend/common, `npx shadow-cljs compile test && npx karma start` for frontend,
-or the commands noted in the module's core memory).
+(e.g. `clojure -M:dev:test` for backend/common,
+`npx shadow-cljs compile test && npx karma start` for frontend, or the
+commands noted in the module's core memory).
+
+When possible, design each task with TDD in mind: acceptance criteria double
+as a test list, and the natural first step of the task is writing those tests
+before the implementation. Some tasks resist this (config, migrations, pure
+wiring) — for those, keep the usual verification steps.
#### Estimate Scope
-| Size | Files | Scope |
-|------|-------|-------|
-| **XS** | 1 | Single function, config change, or schema tweak |
-| **S** | 1-2 | One handler or component method |
-| **M** | 3-5 | One vertical feature slice |
-| **L** | 5-8 | Multi-component feature |
-| **XL** | 8+ | **Too large — break it down further** |
+| Size | Files | Scope | Example |
+|------|-------|-------|---------|
+| **XS** | 1 | Single function, config change, or schema tweak | Add a validation rule |
+| **S** | 1-2 | One handler or component method | Add a new RPC endpoint |
+| **M** | 3-5 | One vertical feature slice | Bookmark CRUD with tests |
+| **L** | 5-8 | Multi-component feature | Search with filtering and pagination |
+| **XL** | 8+ | **Too large — break it down further** | — |
-If a task is L or larger, break it into smaller tasks. Agents perform best on
-S and M tasks.
+If a task is XL, it should be broken into smaller tasks. Agents perform best
+on S and M tasks.
**When to break a task down further:**
- It would take more than one focused session
@@ -141,11 +193,11 @@ Arrange tasks so that:
Add explicit checkpoints with the relevant module commands:
```markdown
-## Checkpoint: After Tasks 1-3
-- [ ] All tests pass (module-specific command)
-- [ ] Lint/format passes (module-specific command)
-- [ ] Core flow works end-to-end
-- [ ] Review with human before proceeding
+### Checkpoint: After Tasks 1-3
+- [ ] Relevant tests pass (module-specific command).
+- [ ] The relevant build or compilation passes, if applicable.
+- [ ] The core flow works end-to-end.
+- [ ] Review with human before proceeding.
```
## Requirements
@@ -159,7 +211,7 @@ Add explicit checkpoints with the relevant module commands:
- Apply DRY and KISS principles to the proposed implementation.
- Define a testing strategy aligned with each affected module's tooling.
- Every task must have acceptance criteria and verification steps.
-- Checkpoints must exist between major phases.
+- Checkpoints must exist after every 2-3 tasks.
## Constraints
@@ -168,7 +220,8 @@ Add explicit checkpoints with the relevant module commands:
`.opencode/plans/`.
- You do **not** run builds, tests, linters, or any commands that modify state.
- You do **not** create git commits or interact with version control.
-- You do **not** execute shell commands beyond read-only searches.
+- You do **not** execute shell commands beyond read-only searches (`rg`, `ls`,
+ `find`, `cat`, `bat`).
- Your output is a structured plan or analysis, ready for handoff to an
engineer agent or developer.
@@ -188,8 +241,9 @@ slug is lowercase, hyphen-separated, and a short summary of the task
(e.g. `add-batch-get-profiles-for-file-comments`). Create the
`.opencode/plans/` directory if it does not exist.
-Always attempt the write. If the user explicitly provides a target file path,
-use that path instead of the default.
+IMPORTANT: The plan agent has write permission specifically for
+`.opencode/plans/` — always attempt the write. If the user explicitly provides
+a target file path, use that path instead of the default.
### Plan Document Template
@@ -212,41 +266,75 @@ use that path instead of the default.
security implications.]
## Approach
-[Step-by-step implementation plan with file paths, function names, and code
-shape where applicable. Group steps into atomic, ordered tasks.]
+[A short strategy summary: 3-5 sentences describing the overall approach and
+the shape of the dependency graph (what depends on what, what gets built
+first). High-level only — the task-by-task detail lives in the Task List.]
## Task List
-### Phase 1: Foundation
-- [ ] Task 1: ...
-- [ ] Task 2: ...
+Each task uses the full task structure defined in
+[Write Tasks](#write-tasks) — description, rationale, acceptance criteria,
+verification, dependencies, files, estimated scope, and optional code sketch.
+Never reduce a task to a one-line checkbox; the plan must be self-contained
+and executable without other context.
-### Checkpoint: Phase 1
-- [ ] Tests pass, lint/formatter clean (module-specific commands)
+Tasks are a flat, ordered list — a plan is not a roadmap. Do not group tasks
+into phases, milestones, or sprints; ordering and dependencies are already
+captured per task. Insert a checkpoint after every 2-3 tasks.
-### Phase 2: Core Features
-- [ ] Task 3: ...
-- [ ] Task 4: ...
+## Task 1: [Short descriptive title]
-### Checkpoint: Phase 2
-- [ ] End-to-end flow works
+**Description:** [What this task accomplishes.]
-### Phase 3: Polish
-- [ ] Task 5: ...
-- [ ] Task 6: ...
+**Rationale:** [Why this approach over the alternatives.]
-### Checkpoint: Complete
-- [ ] All acceptance criteria met
-- [ ] Ready for review
+**Acceptance criteria:**
+- [ ] [Specific, testable condition]
-## Testing Strategy
-[How to verify: which test commands to run per module, what cases to cover,
-manual verification steps, lint/format checks. Consult each module's core
-memory for the exact commands.]
+**Verification:**
+- [ ] Relevant tests pass (module-specific command).
+
+**Dependencies:** None
+
+**Files likely touched:**
+- `path/to/file`
+
+**Estimated scope:** [XS: 1 file | S: 1-2 files | M: 3-5 files | L: 5+ files]
+
+**Code sketch (optional):** [Short contract-level example, only if the shape
+is non-obvious.]
+
+## Task 2: [Short descriptive title]
+
+[Same structure as Task 1.]
+
+## Task 3: [Short descriptive title]
+
+[Same structure as Task 1.]
+
+### Checkpoint: After Tasks 1-3
+- [ ] Relevant tests pass (module-specific command).
+- [ ] The relevant build or compilation passes, if applicable.
+- [ ] The core flow works end-to-end.
+- [ ] Review with human before proceeding.
+
+## Task 4: [Short descriptive title]
+
+[Same structure as Task 1.]
+
+## Task 5: [Short descriptive title]
+
+[Same structure as Task 1.]
+
+## Verification & Testing
+[How to verify each task and the whole plan: the project's real test, lint,
+build, and run commands (extracted during Required Reading), coverage
+expectations, and manual checks. Consult each module's core memory for the
+exact commands.]
## Parallelization Opportunities
- **Safe to parallelize:** Independent feature slices across separate
- modules, tests for already-implemented features
+ modules, tests for already-implemented features, documentation
- **Must be sequential:** Shared common schema changes, database migrations
- **Needs coordination:** Features that share a contract (define the contract
first, then parallelize)
@@ -259,13 +347,31 @@ When the plan is purely analytical (e.g. a code review or feasibility study
with no implementation), skip the **Approach** and **Task List** sections and
lead with **Findings** instead, keeping the rest of the structure.
+## Common Rationalizations
+
+| Rationalization | Reality |
+|---|---|
+| "I'll figure it out as I go" | That's how you end up with a tangled mess and rework. 10 minutes of planning saves hours. |
+| "The tasks are obvious" | Write them down anyway. Explicit tasks surface hidden dependencies and forgotten edge cases. |
+| "Planning is overhead" | Planning is the task. Implementation without a plan is just typing. |
+| "I can hold it all in my head" | Context windows are finite. Written plans survive session boundaries and compaction. |
+
+## Red Flags
+
+- Delivering prose without a task breakdown
+- Tasks that say "implement the feature" without acceptance criteria
+- No verification steps in the plan
+- All tasks are XL-sized
+- No checkpoints between tasks
+- Dependency order isn't considered
+
## Verification Checklist
-Before starting implementation, confirm:
+Before delivering the plan, confirm:
- [ ] Every task has acceptance criteria
- [ ] Every task has a verification step
- [ ] Task dependencies are identified and ordered correctly
-- [ ] No task touches more than ~5 files
-- [ ] Checkpoints exist between major phases
-- [ ] The human has reviewed and approved the plan
+- [ ] No task is XL or larger — break it down instead
+- [ ] Checkpoints exist after every 2-3 tasks
+- [ ] The plan is ready for human review
diff --git a/.opencode/skills/update-changelog/SKILL.md b/.opencode/skills/update-changelog/SKILL.md
index d456ce5bf9..d482959f94 100644
--- a/.opencode/skills/update-changelog/SKILL.md
+++ b/.opencode/skills/update-changelog/SKILL.md
@@ -477,9 +477,15 @@ There are exactly two types:
release, but the PR is being released elsewhere — the fix may not
actually ship here.
2. **PR is in the milestone, but the issue it closes is in a different
- milestone (or has no milestone).** The PR is being released here, but
- the issue it fixes is being released in a different version (or never
- tracked in a milestone) — the changelog pairing is misleading.
+ milestone.** The PR is being released here, but the issue it fixes is
+ being released in a different version — the changelog pairing is
+ misleading.
+
+ **Exception — issue with no milestone is NOT an anomaly.** Milestones
+ are only required for issues tracked in the "Main" project. A milestone
+ PR that closes an issue with no milestone references an issue from
+ another (probably private) project; that is expected and the issue is
+ not part of this changelog. Do not report it.
**Anything else is not an anomaly.** Other discrepancies (exclusion
labels on in-changelog issues, missing valid issues, unmerged PR
@@ -635,6 +641,10 @@ for pr_num in sorted(changelog_prs):
if get_pr_milestone(pr_num) != MILESTONE: continue
for issue_num in pr.get('closing_issues', []):
issue_ms = get_issue_milestone(issue_num)
+ # No milestone = issue from another (probably private) project —
+ # milestones are only required for the "Main" project. Not an
+ # anomaly, and the issue never belongs in this changelog.
+ if issue_ms is None: continue
if issue_ms != MILESTONE:
anomalies_b.append({
'pr': pr_num,
@@ -657,7 +667,7 @@ with open(OUTPUT, 'w') as f:
f.write('## Summary\n\n')
f.write(f'- **Issue in {MILESTONE}, referenced PR in different milestone or no milestone:** {n_a}\n')
- f.write(f'- **PR in {MILESTONE}, closing issue in different milestone or no milestone:** {n_b}\n')
+ f.write(f'- **PR in {MILESTONE}, closing issue in a different milestone:** {n_b}\n')
f.write(f'- **Total anomalies:** {n_a + n_b}\n\n')
# --- Anomalies section ---
@@ -686,7 +696,7 @@ with open(OUTPUT, 'w') as f:
f.write('\n')
if n_b:
- f.write(f'\n### PR in {MILESTONE}, closing issue in different milestone or no milestone\n\n')
+ f.write(f'\n### PR in {MILESTONE}, closing issue in a different milestone\n\n')
by_pr = {}
for b in anomalies_b:
by_pr.setdefault(b['pr'], []).append(b)
@@ -721,8 +731,11 @@ milestone mismatches between issues and their referenced PRs:
1. **Issue in milestone, referenced PR in different milestone or no milestone** —
the changelog claims a fix here, but the PR is released elsewhere.
-2. **PR in milestone, closing issue in different milestone or no milestone** —
+2. **PR in milestone, closing issue in a different milestone** —
the PR is released here, but the issue it fixes belongs to another version.
+ (An issue with *no* milestone belongs to another, probably private,
+ project — milestones are only required on the "Main" project — so it is
+ neither an anomaly nor a changelog candidate.)
**Rule violations are not in the report** — they are workflow errors the
LLM must fix directly in `CHANGES.md` during step 6a (pre-flight checks).
@@ -799,8 +812,11 @@ self-contained and clickable in any Markdown viewer.
- **Anomaly = milestone mismatch only.** The report contains only milestone
mismatches: (1) the issue is in this milestone but the referenced PR is
in a different milestone (or unassigned), and (2) the PR is in this
- milestone but the issue it closes is in a different milestone (or
- unassigned). These are anomalies because the changelog pairing is
+ milestone but the issue it closes is in a different milestone. An
+ *unassigned* (milestone-less) issue closed by a milestone PR is **not**
+ an anomaly: milestones are required only for the "Main" project, so such
+ issues come from another (probably private) project and are not changelog
+ candidates. These anomalies are reported because the changelog pairing is
*misleading* — the human needs to decide whether the milestone or the
changelog is wrong. All other discrepancies (exclusion labels, missing
valid issues, unmerged PR references, duplicates, stale milestone
diff --git a/.serena/memories/devenv/core.md b/.serena/memories/devenv/core.md
index 0651f872fe..db46542c99 100644
--- a/.serena/memories/devenv/core.md
+++ b/.serena/memories/devenv/core.md
@@ -6,6 +6,7 @@ Compose-based dev environment under `docker/devenv/`, driven by `manage.sh`. Par
- `penpotdev-infra`: shared `postgres`, `minio`, `minio-setup`, `mailer`, `ldap`. File: `docker-compose.infra.yml`.
- `penpotdev-wsN` (N=0,1,…): per-instance `main` + `redis` (Valkey). File: `docker-compose.main.yml`. ws0 (a.k.a. `main`) binds `$PWD`; ws1+ bind clones at `${PENPOT_WORKSPACES_DIR}/wsN/` (default `~/.penpot/penpot_workspaces/`), maintained by the developer.
+- Optional overlay `docker-compose.opencode.yml`: added by `instance-compose` as an extra `-f` only when `PENPOT_OPENCODE_CONFIG_DIR` is set (i.e. `run-devenv --opencode-config-dir DIR` ran in this process). Bind-mounts the host dir at `/home/penpot/.config/opencode` (`:z`). Flag-only, per-call; not read from ambient env. Parser `parse-opencode-config-dir` absolutizes (`~`, realpath) because compose resolves relative bind sources against the compose file's dir. Only instances brought up with the flag get the mount.
- All projects join external network `penpot_shared`. Created idempotently by `ensure-devenv-network`, never removed by lifecycle commands.
## Source-of-truth files
@@ -65,7 +66,7 @@ No `--delete` on the working-tree pass: gitignored caches in the workspace survi
## CLI surface
-- `run-devenv --agentic [--ws main|0|wsN|N] [--sync] [--serena-context CTX]`: bring one instance up. Agentic only — MCP and Serena windows are always created. Default target main. Errors out if the target is already running. `--sync` is rejected on main; on ws1+ it's optional (forced only when the workspace dir does not exist yet).
+- `run-devenv --agentic [--ws main|0|wsN|N] [--sync] [--serena-context CTX] [--opencode-config-dir DIR]`: bring one instance up. Agentic only — MCP and Serena windows are always created. Default target main. Errors out if the target is already running. `--sync` is rejected on main; on ws1+ it's optional (forced only when the workspace dir does not exist yet). `--opencode-config-dir DIR` bind-mounts DIR at `~/.config/opencode` in-container via the optional overlay above; mount applies at container creation, so changing it requires stop + re-run.
- `stop-devenv [--ws main|0|wsN|N] [--all]`: stop instances. Flags mutually exclusive. `--ws N` stops just that workspace. `--ws 0` or no flag stops ws0; shared infra shuts down only if no other instances remain. `--all` stops every ws highest-first then ws0, then infra.
- `run-devenv`: legacy alias, ws0 non-agentic attached.
- `attach-devenv [--ws main|0|wsN|N]`: pure attach. Fails fast if instance/session missing.
diff --git a/CHANGES.md b/CHANGES.md
index 71664033a5..1618253d1b 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -31,18 +31,121 @@
- Fix plugin API addTheme calls failing with the signature shown in the high-level overview [#10074](https://github.com/penpot/penpot/issues/10074) (PR: [#10359](https://github.com/penpot/penpot/pull/10359))
- Fix empty text shape not being deleted on editor exit [#10540](https://github.com/penpot/penpot/issues/10540) (PR: [#10541](https://github.com/penpot/penpot/pull/10541))
- Fix broken token pills showing wrong default state when not selected [#10524](https://github.com/penpot/penpot/issues/10524) (PR: [#10535](https://github.com/penpot/penpot/pull/10535))
-- Replace hyphens with bullets in subscription benefits list [#10547](https://github.com/penpot/penpot/issues/10547) (PR: [#10523](https://github.com/penpot/penpot/pull/10523))
- Fix Chinese (zh-CN) translation showing wrong label for Intersection in board path menu (by @sawirricardo) [#10346](https://github.com/penpot/penpot/issues/10346) (PR: [#10381](https://github.com/penpot/penpot/pull/10381))
+- Fix invalid formulas being accepted in numeric inputs (by @AKnassa) [#9581](https://github.com/penpot/penpot/issues/9581) (PR: [#10659](https://github.com/penpot/penpot/pull/10659))
+- Fix radial gradient handles blowing up in size when rotated on ellipses (by @AKnassa) [#10069](https://github.com/penpot/penpot/issues/10069) (PR: [#10666](https://github.com/penpot/penpot/pull/10666))
+- Fix plugin API validation errors being too generic to diagnose the failure (by @AKnassa) [#10072](https://github.com/penpot/penpot/issues/10072) (PR: [#10667](https://github.com/penpot/penpot/pull/10667))
+- Fix crash with referential integrity error when deleting a component inside a grid (by @Alotor) [#10101](https://github.com/penpot/penpot/issues/10101) (PR: [#10956](https://github.com/penpot/penpot/pull/10956))
+- Fix component copies not preserving rotation when the main component has changes [#10109](https://github.com/penpot/penpot/issues/10109) (PR: [#10574](https://github.com/penpot/penpot/pull/10574))
+- Fix text width and height staying stale after setting growType in the plugin API [#10207](https://github.com/penpot/penpot/issues/10207) (PR: [#9898](https://github.com/penpot/penpot/pull/9898))
+- Fix padding not painted until expanding the 4-sides padding option [#10278](https://github.com/penpot/penpot/issues/10278) (PR: [#10602](https://github.com/penpot/penpot/pull/10602))
+- Fix files with custom fonts breaking with a referential integrity error when moved between teams (by @filipsajdak) [#10496](https://github.com/penpot/penpot/issues/10496) (PR: [#10837](https://github.com/penpot/penpot/pull/10837))
+- Fix clicking overlapping comment bubbles zooming to 20000% without showing the comments [#10526](https://github.com/penpot/penpot/issues/10526) (PR: [#10543](https://github.com/penpot/penpot/pull/10543))
+- Fix user menu subsections in the dashboard not closing when hovering away from the parent option (by @AKnassa) [#10549](https://github.com/penpot/penpot/issues/10549) (PR: [#10639](https://github.com/penpot/penpot/pull/10639))
+- Fix self-hosted env-generated config.js being cached for 7 days so PENPOT_FLAGS changes did not reach already-cached browsers (by @filipsajdak) [#10556](https://github.com/penpot/penpot/issues/10556) (PR: [#11146](https://github.com/penpot/penpot/pull/11146))
+- Fix color of selected text in light theme [#10570](https://github.com/penpot/penpot/issues/10570) (PR: [#10614](https://github.com/penpot/penpot/pull/10614))
+- Fix margin input order being inconsistent with padding inputs and between collapsed and expanded states [#10578](https://github.com/penpot/penpot/issues/10578) (PR: [#10797](https://github.com/penpot/penpot/pull/10797))
+- Fix uncaught DOMException when writing image/svg+xml content to the clipboard (by @AKnassa) [#10596](https://github.com/penpot/penpot/issues/10596) (PR: [#10663](https://github.com/penpot/penpot/pull/10663))
+- Fix tick icons not aligned in the font selector [#10597](https://github.com/penpot/penpot/issues/10597) (PR: [#10774](https://github.com/penpot/penpot/pull/10774))
+- Fix incorrect padding values when multiple shapes are selected [#10598](https://github.com/penpot/penpot/issues/10598) (PR: [#10602](https://github.com/penpot/penpot/pull/10602))
+- Fix integrity errors related to variants not being repaired [#10606](https://github.com/penpot/penpot/issues/10606) (PR: [#10768](https://github.com/penpot/penpot/pull/10768))
+- Fix changing password showing 'Password should be at least 8 characters' error on the old password field (by @AKnassa) [#10626](https://github.com/penpot/penpot/issues/10626) (PR: [#10661](https://github.com/penpot/penpot/pull/10661))
+- Fix stroke caps disappearing when dragging [#10633](https://github.com/penpot/penpot/issues/10633) (PR: [#10634](https://github.com/penpot/penpot/pull/10634))
+- Fix layout padding being saved as string after invalid input in multi-selection, causing persistence errors (by @niwinz) [#10638](https://github.com/penpot/penpot/issues/10638) (PR: [#10758](https://github.com/penpot/penpot/pull/10758))
+- Fix inconsistent theme handling between Penpot and plugins [#10676](https://github.com/penpot/penpot/issues/10676) (PR: [#10677](https://github.com/penpot/penpot/pull/10677))
+- Fix image stroke (strokeImage) support missing in the plugin API Stroke interface [#10682](https://github.com/penpot/penpot/issues/10682) (PR: [#10683](https://github.com/penpot/penpot/pull/10683))
+- Fix SVG images not working as fill in the WebGL renderer [#10705](https://github.com/penpot/penpot/issues/10705) (PR: [#10707](https://github.com/penpot/penpot/pull/10707))
+- Fix background blur not working on text shapes [#10706](https://github.com/penpot/penpot/issues/10706) (PR: [#10712](https://github.com/penpot/penpot/pull/10712))
+- Fix background blur not applying on strokes [#10713](https://github.com/penpot/penpot/issues/10713) (PR: [#10716](https://github.com/penpot/penpot/pull/10716))
+- Fix text shape with empty content breaking workspace updates [#10725](https://github.com/penpot/penpot/issues/10725) (PR: [#10731](https://github.com/penpot/penpot/pull/10731))
+- Fix missing SVG option in the file filters when adding an image fill (by @LuBoys) [#10756](https://github.com/penpot/penpot/issues/10756) (PR: [#10771](https://github.com/penpot/penpot/pull/10771))
+- Update onboarding image [#10779](https://github.com/penpot/penpot/issues/10779) (PR: [#10783](https://github.com/penpot/penpot/pull/10783))
+- Fix main toolbar overlapping the grid edition bar [#10788](https://github.com/penpot/penpot/issues/10788) (PR: [#10789](https://github.com/penpot/penpot/pull/10789))
+- Fix WASM renderer panic when the WebGL context is restored mid-reload [#10810](https://github.com/penpot/penpot/issues/10810) (PR: [#10824](https://github.com/penpot/penpot/pull/10824))
+- Fix nginx frontend forwarding the client Host header to backend/exporter, breaking Istio strict mTLS routing (by @yamila-moreno) [#10835](https://github.com/penpot/penpot/issues/10835) (PR: [#11233](https://github.com/penpot/penpot/pull/11233))
+- Fix tutorial templates with components causing errors [#10839](https://github.com/penpot/penpot/issues/10839)
+- Fix plugin 'Try out' flow crashing when projects have not loaded yet [#10858](https://github.com/penpot/penpot/issues/10858) (PR: [#10859](https://github.com/penpot/penpot/pull/10859))
+- Fix collapsed Fill color section on the design panel for new texts [#10860](https://github.com/penpot/penpot/issues/10860) (PR: [#10972](https://github.com/penpot/penpot/pull/10972))
+- Fix grid item date tooltip in the project view showing 'Will be deleted' instead of creation date (by @0xTHAC0) [#10873](https://github.com/penpot/penpot/issues/10873) (PR: [#11161](https://github.com/penpot/penpot/pull/11161))
+- Merge stop and start measurement shortcut to match current behavior [#10884](https://github.com/penpot/penpot/issues/10884) (PR: [#10906](https://github.com/penpot/penpot/pull/10906))
+- Fix shape size badge displayed twice when a user with Viewer permissions selects a shape [#10893](https://github.com/penpot/penpot/issues/10893) (PR: [#10985](https://github.com/penpot/penpot/pull/10985))
+- Fix main menu being covered by the toolbar [#10902](https://github.com/penpot/penpot/issues/10902) (PR: [#10926](https://github.com/penpot/penpot/pull/10926))
+- Fix font family typography asset persisting across files in newly created text layers [#10925](https://github.com/penpot/penpot/issues/10925) (PR: [#11134](https://github.com/penpot/penpot/pull/11134))
+- Fix error raised when editing justified text [#10944](https://github.com/penpot/penpot/issues/10944) (PR: [#10945](https://github.com/penpot/penpot/pull/10945))
+- Fix MCP WebSocket proxy failing after penpot-mcp container restarts due to stale nginx DNS resolution (by @780Farva) [#10946](https://github.com/penpot/penpot/issues/10946) (PR: [#10947](https://github.com/penpot/penpot/pull/10947))
+- Fix verification email address being unreadable due to low-contrast text on the register success page [#10950](https://github.com/penpot/penpot/issues/10950) (PR: [#10965](https://github.com/penpot/penpot/pull/10965))
+- Fix image swatches displaying a wrong format in the color picker list view [#10951](https://github.com/penpot/penpot/issues/10951) (PR: [#10975](https://github.com/penpot/penpot/pull/10975))
+- Fix text editor crashing when dropping dragged text after selecting all content [#10954](https://github.com/penpot/penpot/issues/10954) (PR: [#10959](https://github.com/penpot/penpot/pull/10959))
+- Fix MCP tokens being usable as API access tokens [#10960](https://github.com/penpot/penpot/issues/10960) (PR: [#10962](https://github.com/penpot/penpot/pull/10962))
+- Add size limit and rate limiting to the send-user-feedback endpoint [#10979](https://github.com/penpot/penpot/issues/10979) (PR: [#10990](https://github.com/penpot/penpot/pull/10990))
+- Fix main menu not keeping alignment when the left sidebar is expanded [#10981](https://github.com/penpot/penpot/issues/10981) (PR: [#10986](https://github.com/penpot/penpot/pull/10986))
+- Fix update-profile-props RPC method accepting undocumented keys [#10991](https://github.com/penpot/penpot/issues/10991) (PR: [#10992](https://github.com/penpot/penpot/pull/10992))
+- Fix import-binfile RPC method schema accepting a file-id parameter [#10993](https://github.com/penpot/penpot/issues/10993) (PR: [#10994](https://github.com/penpot/penpot/pull/10994))
+- Fix assemble-chunks session lookup ignoring the profile-id scope [#11011](https://github.com/penpot/penpot/issues/11011) (PR: [#11012](https://github.com/penpot/penpot/pull/11012))
+- Validate font-id team ownership in create-font-variant [#11013](https://github.com/penpot/penpot/issues/11013) (PR: [#11014](https://github.com/penpot/penpot/pull/11014))
+- Validate team ownership on file library link endpoints [#11015](https://github.com/penpot/penpot/issues/11015) (PR: [#11016](https://github.com/penpot/penpot/pull/11016))
+- Limit object size allocation in the V1 binfile parser [#11017](https://github.com/penpot/penpot/issues/11017) (PR: [#11018](https://github.com/penpot/penpot/pull/11018))
+- Limit recursion depth in the Fressian reader [#11019](https://github.com/penpot/penpot/issues/11019) (PR: [#11020](https://github.com/penpot/penpot/pull/11020))
+- Limit concurrent imports in the import-binfile RPC method [#11023](https://github.com/penpot/penpot/issues/11023) (PR: [#11024](https://github.com/penpot/penpot/pull/11024))
+- Validate content-type on management upload endpoints [#11025](https://github.com/penpot/penpot/issues/11025) (PR: [#11026](https://github.com/penpot/penpot/pull/11026))
+- Fix webhook endpoints allowing unauthorized access via creator-id fallback [#11028](https://github.com/penpot/penpot/issues/11028) (PR: [#11029](https://github.com/penpot/penpot/pull/11029))
+- Escape markdown in user-controlled fields of Mattermost error notifications [#11033](https://github.com/penpot/penpot/issues/11033) (PR: [#11034](https://github.com/penpot/penpot/pull/11034))
+- Enforce file read permission check on asset endpoints [#11035](https://github.com/penpot/penpot/issues/11035) (PR: [#11036](https://github.com/penpot/penpot/pull/11036))
+- Add accumulated storage byte quota for media uploads [#11037](https://github.com/penpot/penpot/issues/11037) (PR: [#11038](https://github.com/penpot/penpot/pull/11038))
+- Add bounding box dimension limit to exports [#11041](https://github.com/penpot/penpot/issues/11041) (PR: [#11042](https://github.com/penpot/penpot/pull/11042))
+- Sanitize embedded scripts in SVG uploads [#11043](https://github.com/penpot/penpot/issues/11043) (PR: [#11044](https://github.com/penpot/penpot/pull/11044))
+- Fix duplicate file ID returning inconsistent error responses [#11045](https://github.com/penpot/penpot/issues/11045) (PR: [#11050](https://github.com/penpot/penpot/pull/11050))
+- Enforce permission checks in WebSocket subscription handlers [#11052](https://github.com/penpot/penpot/issues/11052) (PR: [#11054](https://github.com/penpot/penpot/pull/11054))
+- Fix 'something went wrong' popup when using incremental numerical input interaction [#11053](https://github.com/penpot/penpot/issues/11053) (PR: [#10794](https://github.com/penpot/penpot/pull/10794))
+- Enforce password complexity validation on the backend [#11055](https://github.com/penpot/penpot/issues/11055) (PR: [#11059](https://github.com/penpot/penpot/pull/11059))
+- Normalize string inputs before processing [#11060](https://github.com/penpot/penpot/issues/11060) (PR: [#11061](https://github.com/penpot/penpot/pull/11061))
+- Add cooldown to avoid sending duplicate invitation emails [#11062](https://github.com/penpot/penpot/issues/11062) (PR: [#11063](https://github.com/penpot/penpot/pull/11063))
+- Enable SSRF protection for organization SSO validation [#11064](https://github.com/penpot/penpot/issues/11064) (PR: [#11065](https://github.com/penpot/penpot/pull/11065))
+- Fix clone-file-media-object allowing to clone media objects from files without read access [#11087](https://github.com/penpot/penpot/issues/11087) (PR: [#11090](https://github.com/penpot/penpot/pull/11090))
+- Fix 404 error page logo not visible in dark mode [#11091](https://github.com/penpot/penpot/issues/11091) (PR: [#11167](https://github.com/penpot/penpot/pull/11167))
+- Fix incorrect permission handling when creating an invitation [#11098](https://github.com/penpot/penpot/issues/11098) (PR: [#11099](https://github.com/penpot/penpot/pull/11099))
+- Reject zero or negative total-chunks values in upload sessions [#11103](https://github.com/penpot/penpot/issues/11103) (PR: [#11104](https://github.com/penpot/penpot/pull/11104))
+- Fix import-binfile accepting unsupported version values without validation [#11105](https://github.com/penpot/penpot/issues/11105) (PR: [#11107](https://github.com/penpot/penpot/pull/11107))
+- Fix sessions remaining active on other devices after account deletion [#11114](https://github.com/penpot/penpot/issues/11114) (PR: [#11115](https://github.com/penpot/penpot/pull/11115))
+- Use random UUIDs for share link IDs instead of a predictable scheme [#11116](https://github.com/penpot/penpot/issues/11116) (PR: [#11117](https://github.com/penpot/penpot/pull/11117))
+- Fix plugin manifest fetch hanging indefinitely without timeout [#11119](https://github.com/penpot/penpot/issues/11119) (PR: [#11120](https://github.com/penpot/penpot/pull/11120))
+- Use constant-time comparison for shared key authentication [#11121](https://github.com/penpot/penpot/issues/11121) (PR: [#11122](https://github.com/penpot/penpot/pull/11122))
+- Fix ESC key not closing the comment input box after posting a comment in the workspace [#11128](https://github.com/penpot/penpot/issues/11128) (PR: [#11131](https://github.com/penpot/penpot/pull/11131))
+- Fix token edit modal crashing when resolving tokens with group nodes [#11143](https://github.com/penpot/penpot/issues/11143) (PR: [#11144](https://github.com/penpot/penpot/pull/11144))
+- Fix text editor crashing when pasting into an empty text shape [#11149](https://github.com/penpot/penpot/issues/11149) (PR: [#11150](https://github.com/penpot/penpot/pull/11150))
+- Fix comment avatars appearing on top of rulers when scrolling the canvas (by @filipsajdak) [#11163](https://github.com/penpot/penpot/issues/11163) (PR: [#11168](https://github.com/penpot/penpot/pull/11168))
+- Fix infinite loop of get-teams and get-team-members calls when granting team access from an email link [#11215](https://github.com/penpot/penpot/issues/11215) (PR: [#11223](https://github.com/penpot/penpot/pull/11223))
+- Fix RPC requests bypassing rate limiting with fractional bucket refill intervals [#11253](https://github.com/penpot/penpot/issues/11253) (PR: [#11254](https://github.com/penpot/penpot/pull/11254))
+- Fix tempfile bucket serving objects to any authenticated user instead of only the uploader [#11269](https://github.com/penpot/penpot/issues/11269) (PR: [#11270](https://github.com/penpot/penpot/pull/11270))
+- Fix increasing a value by clicking and dragging in a numeric input [#11274](https://github.com/penpot/penpot/issues/11274) (PR: [#11334](https://github.com/penpot/penpot/pull/11334))
+- Fix notification pill rendering unescaped HTML in the detail section when importing tokens [#11276](https://github.com/penpot/penpot/issues/11276) (PR: [#11275](https://github.com/penpot/penpot/pull/11275))
+- Fix share-link holders reading pages outside the authorized scope via the get-page RPC command [#11281](https://github.com/penpot/penpot/issues/11281) (PR: [#11284](https://github.com/penpot/penpot/pull/11284))
+- Fix incorrect permission handling when managing share links on a file [#11289](https://github.com/penpot/penpot/issues/11289) (PR: [#11290](https://github.com/penpot/penpot/pull/11290))
+- Fix backend session remaining valid after logout when the auth-token cookie is replayed [#11316](https://github.com/penpot/penpot/issues/11316) (PR: [#11317](https://github.com/penpot/penpot/pull/11317))
+- Fix get-team-invitation-token requiring only read permissions [#11358](https://github.com/penpot/penpot/issues/11358) (PR: [#11359](https://github.com/penpot/penpot/pull/11359))
### :sparkles: New features & Enhancements
- Group toolbar drawing tools into shape and free-draw flyouts [#9316](https://github.com/penpot/penpot/issues/9316) (PR: [#9480](https://github.com/penpot/penpot/pull/9480), [#10354](https://github.com/penpot/penpot/pull/10354))
- Add outline stroke to Paths [#9961](https://github.com/penpot/penpot/issues/9961) (PR: [#8677](https://github.com/penpot/penpot/pull/8677))
-- Make throwValidationErrors default to true for v2 manifest plugins [#10401](https://github.com/penpot/penpot/issues/10401) (PR: [#10433](https://github.com/penpot/penpot/pull/10433))
- Add dedicated Line and Arrow drawing tools (by @davidv399) [#9145](https://github.com/penpot/penpot/issues/9145) (PR: [#9146](https://github.com/penpot/penpot/pull/9146))
- Refactor wasm rulers and UI state [#10116](https://github.com/penpot/penpot/issues/10116) (PR: [#10461](https://github.com/penpot/penpot/pull/10461))
- Improve team invitations modal in the dashboard [#10484](https://github.com/penpot/penpot/issues/10484) (PR: [#10459](https://github.com/penpot/penpot/pull/10459))
-
+- Highlight the first matching font in the font list when searching (by @ai-mountain) [#3204](https://github.com/penpot/penpot/issues/3204) (PR: [#9512](https://github.com/penpot/penpot/pull/9512), [#10450](https://github.com/penpot/penpot/pull/10450))
+- Preserve token references when copying and pasting properties instead of resolving them to values (by @AKnassa) [#9582](https://github.com/penpot/penpot/issues/9582) (PR: [#10665](https://github.com/penpot/penpot/pull/10665))
+- Add waitForLayoutUpdate method to the plugin API [#10136](https://github.com/penpot/penpot/issues/10136) (PR: [#9898](https://github.com/penpot/penpot/pull/9898))
+- Show and manage comments while designing in the workspace [#10239](https://github.com/penpot/penpot/issues/10239) (PR: [#10275](https://github.com/penpot/penpot/pull/10275))
+- Simplify MCP server configuration for common MCP clients [#10355](https://github.com/penpot/penpot/issues/10355) (PR: [#10604](https://github.com/penpot/penpot/pull/10604))
+- Remove misleading MCP client JSON snippet from the key-generated modal (by @Shlok1729) [#10399](https://github.com/penpot/penpot/issues/10399) (PR: [#10415](https://github.com/penpot/penpot/pull/10415))
+- Preview font families in the font selector [#10403](https://github.com/penpot/penpot/issues/10403) (PR: [#10411](https://github.com/penpot/penpot/pull/10411))
+- Remember expanded/collapsed state of token sets in the color tokens picker (session scope) [#10551](https://github.com/penpot/penpot/issues/10551) (PR: [#10864](https://github.com/penpot/penpot/pull/10864))
+- Show token sets in reverse order by default in the color tokens picker (by @rhinocap) [#10552](https://github.com/penpot/penpot/issues/10552) (PR: [#10658](https://github.com/penpot/penpot/pull/10658))
+- Add multi-selection and bulk delete support to pages in the workspace sitemap [#10580](https://github.com/penpot/penpot/issues/10580) (PR: [#10581](https://github.com/penpot/penpot/pull/10581))
+- Add a grid/list view toggle for files in the dashboard [#10691](https://github.com/penpot/penpot/issues/10691) (PR: [#10692](https://github.com/penpot/penpot/pull/10692))
+- Migrate Docker images to Docker Hardened Images (DHI) [#10720](https://github.com/penpot/penpot/issues/10720) (PR: [#10732](https://github.com/penpot/penpot/pull/10732), [#10733](https://github.com/penpot/penpot/pull/10733), [#10734](https://github.com/penpot/penpot/pull/10734))
+- Adopt React Aria [#10802](https://github.com/penpot/penpot/issues/10802) (PR: [#10675](https://github.com/penpot/penpot/pull/10675))
+- Add plugin API function for awaiting component updates beyond waitForLayoutUpdate [#10927](https://github.com/penpot/penpot/issues/10927) (PR: [#10964](https://github.com/penpot/penpot/pull/10964))
+- Emit open-workspace-file audit event with file statistics on workspace load [#11106](https://github.com/penpot/penpot/issues/11106) (PR: [#11138](https://github.com/penpot/penpot/pull/11138))
## 2.17.2
### :bug: Bugs fixed
@@ -3053,7 +3156,7 @@ is a number of cores)
- Enable penpot SVG metadata only when exporting complete files [Taiga #1914](https://tree.taiga.io/project/penpot/us/1914?milestone=295883)
- Export to PDF all artboards of one page [Taiga #1895](https://tree.taiga.io/project/penpot/us/1895)
- Go to a undo step clicking on a history element of the list [Taiga #1374](https://tree.taiga.io/project/penpot/us/1374)
-- Increment font size by 10 with shift+arrows [1047](https://github.com/penpot/penpot/issues/1047)
+- Increment font size by 10 with shift+arrows [#1047](https://github.com/penpot/penpot/issues/1047)
- New shortcut to detach components Ctrl+Shift+K [Taiga #1799](https://tree.taiga.io/project/penpot/us/1799)
- Set email inputs to type "email", to aid keyboard entry [Taiga #1921](https://tree.taiga.io/project/penpot/issue/1921)
- Use shift+move to move element orthogonally [#823](https://github.com/penpot/penpot/issues/823)
diff --git a/backend/deps.edn b/backend/deps.edn
index 9fd4b90e66..f10437fb75 100644
--- a/backend/deps.edn
+++ b/backend/deps.edn
@@ -17,7 +17,7 @@
io.prometheus/simpleclient_httpserver {:mvn/version "0.16.0"}
- io.lettuce/lettuce-core {:mvn/version "7.6.0.RELEASE"}
+ io.lettuce/lettuce-core {:mvn/version "7.7.0.RELEASE"}
;; Minimal dependencies required by lettuce, we need to include them
;; explicitly because clojure dependency management does not support
;; yet the BOM format.
@@ -25,7 +25,7 @@
io.micrometer/micrometer-observation {:mvn/version "1.14.2"}
java-http-clj/java-http-clj {:mvn/version "0.4.3"}
- com.google.guava/guava {:mvn/version "33.6.0-jre"}
+ com.google.guava/guava {:mvn/version "33.7.1-jre"}
funcool/yetti
{:git/tag "v11.10"
@@ -40,32 +40,32 @@
nrepl/nrepl {:mvn/version "1.7.0"}
org.postgresql/postgresql {:mvn/version "42.7.13"}
- org.xerial/sqlite-jdbc {:mvn/version "3.53.2.1"}
+ org.xerial/sqlite-jdbc {:mvn/version "3.53.4.0"}
com.zaxxer/HikariCP {:mvn/version "7.1.0"}
- io.whitfin/siphash {:mvn/version "2.0.0"}
+ io.whitfin/siphash {:mvn/version "3.0.0"}
buddy/buddy-hashers {:mvn/version "2.0.167"}
buddy/buddy-sign {:mvn/version "3.6.1-359"}
- org.passay/passay {:mvn/version "1.6.6"}
+ org.passay/passay {:mvn/version "2.0.0"}
com.github.ben-manes.caffeine/caffeine {:mvn/version "3.2.4"}
- org.jsoup/jsoup {:mvn/version "1.23.1"}
+ org.jsoup/jsoup {:mvn/version "1.23.2"}
at.yawk.lz4/lz4-java
- {:mvn/version "1.11.1"}
+ {:mvn/version "1.11.2"}
org.clojars.pntblnk/clj-ldap {:mvn/version "0.0.17"}
dawran6/emoji {:mvn/version "0.2.0"}
- markdown-clj/markdown-clj {:mvn/version "1.12.8"}
+ markdown-clj/markdown-clj {:mvn/version "1.12.9"}
;; Pretty Print specs
pretty-spec/pretty-spec {:mvn/version "0.1.4"}
- software.amazon.awssdk/s3 {:mvn/version "2.50.1"}
- software.amazon.awssdk/sts {:mvn/version "2.50.1"}
+ software.amazon.awssdk/s3 {:mvn/version "2.54.5"}
+ software.amazon.awssdk/sts {:mvn/version "2.54.5"}
com.ladybugdb/lbug {:mvn/version "0.19.1"}
;; Required by Arrow RootAllocator (lbug only pulls arrow-memory-core).
diff --git a/backend/src/app/auth.clj b/backend/src/app/auth.clj
index 69d3f705b6..54ccc04303 100644
--- a/backend/src/app/auth.clj
+++ b/backend/src/app/auth.clj
@@ -14,10 +14,21 @@
:iterations 3
:parallelism 2})
+(def ^:private weak-options
+ {:alg :pbkdf2+sha256
+ :iterations 100})
+
(defn derive-password
[password]
(hashers/derive password default-options))
+(defn derive-password-weak
+ "Derives a password using a fast algorithm (pbkdf2+sha256, 100 iterations).
+ Intended for demo users only — they are already gated behind the
+ `demo-users` config flag which is disabled in production."
+ [password]
+ (hashers/derive password weak-options))
+
(defn verify-password
[attempt password]
(try
diff --git a/backend/src/app/auth/passwords.clj b/backend/src/app/auth/passwords.clj
index e3a3e1df52..d4e8cef200 100644
--- a/backend/src/app/auth/passwords.clj
+++ b/backend/src/app/auth/passwords.clj
@@ -9,7 +9,9 @@
(:require
[app.common.exceptions :as ex])
(:import
- [org.passay CharacterCharacteristicsRule CharacterRule EnglishCharacterData PasswordData]))
+ [org.passay PasswordData]
+ [org.passay.data EnglishCharacterData]
+ [org.passay.rule CharacterCharacteristicsRule CharacterRule]))
(defonce ^:private passay-code->translation-key
{"INSUFFICIENT_LOWERCASE" "errors.weak-password.insufficient-lowercase"
@@ -18,12 +20,13 @@
"INSUFFICIENT_SPECIAL" "errors.weak-password.insufficient-special"})
(defonce ^:private character-characteristics-rule
- (doto (CharacterCharacteristicsRule.)
- (.setRules [(CharacterRule. EnglishCharacterData/LowerCase 1)
+ (CharacterCharacteristicsRule.
+ 4
+ (into-array org.passay.rule.CharacterRule
+ [(CharacterRule. EnglishCharacterData/LowerCase 1)
(CharacterRule. EnglishCharacterData/UpperCase 1)
(CharacterRule. EnglishCharacterData/Digit 1)
- (CharacterRule. EnglishCharacterData/Special 1)])
- (.setNumberOfCharacteristics 4)))
+ (CharacterRule. EnglishCharacterData/Special 1)])))
(defn validate-password
"Validates password strength.
diff --git a/backend/src/app/binfile/v3.clj b/backend/src/app/binfile/v3.clj
index 4fd561041f..01e735d364 100644
--- a/backend/src/app/binfile/v3.clj
+++ b/backend/src/app/binfile/v3.clj
@@ -42,6 +42,7 @@
[datoteka.io :as io])
(:import
java.io.File
+ java.io.FilterInputStream
java.io.InputStream
java.io.OutputStreamWriter
java.lang.AutoCloseable
@@ -461,6 +462,31 @@
[^ZipFile input ^ZipEntry entry]
(.getInputStream input entry))
+(defn- size-limiting-stream
+ "Wraps an InputStream to enforce a maximum number of decompressed bytes.
+ Raises :validation :max-file-size-reached when the limit is exceeded."
+ ^InputStream
+ [^InputStream input ^long max-size]
+ (let [counter (atom 0)]
+ (proxy [FilterInputStream] [input]
+ (read
+ ([]
+ (let [b (.read input)]
+ (when (pos? b)
+ (when (> (swap! counter inc) max-size)
+ (ex/raise :type :validation
+ :code :max-file-size-reached
+ :hint (str "stream exceeded max size: " max-size))))
+ b))
+ ([buf off len]
+ (let [n (.read input buf off len)]
+ (when (pos? n)
+ (when (> (swap! counter + (long n)) max-size)
+ (ex/raise :type :validation
+ :code :max-file-size-reached
+ :hint (str "stream exceeded max size: " max-size))))
+ n))))))
+
(defn- zip-entry-reader
[^ZipFile input ^ZipEntry entry]
(-> (zip-entry-stream input entry)
@@ -469,10 +495,12 @@
(defn- zip-entry-storage-content
"Wraps a ZipFile and ZipEntry into a penpot storage compatible
object and avoid creating temporal objects"
- [input entry]
- (let [hash (delay (->> entry
- (zip-entry-stream input)
- (sto.impl/calculate-hash)))]
+ [input entry & {:keys [max-size]}]
+ (let [stream-fn (fn []
+ (cond-> (zip-entry-stream input entry)
+ max-size (size-limiting-stream max-size)))
+ hash (delay (->> (stream-fn)
+ (sto.impl/calculate-hash)))]
(reify
sto.impl/IContentObject
(get-size [_]
@@ -489,7 +517,7 @@
(throw (UnsupportedOperationException. "not implemented")))
(make-input-stream [_ _]
- (zip-entry-stream input entry))
+ (stream-fn))
(make-output-stream [_ _]
(throw (UnsupportedOperationException. "not implemented"))))))
@@ -884,9 +912,9 @@
ext (cmedia/mtype->extension (:content-type object))
path (str "objects/" id ext)
- content (->> path
- (get-zip-entry input)
- (zip-entry-storage-content input))]
+ content (zip-entry-storage-content input
+ (get-zip-entry input path)
+ :max-size (::bfc/import-max-object-size cfg))]
(when (not= (:size object) (sto/get-size content))
(ex/raise :type :validation
@@ -896,6 +924,15 @@
:expected-size (:size object)
:found-size (sto/get-size content)))
+ (when-let [max (::bfc/import-max-object-size cfg)]
+ (when (> (sto/get-size content) max)
+ (ex/raise :type :validation
+ :code :max-file-size-reached
+ :hint (str "storage object exceeds maximum size: " (sto/get-size content))
+ :path path
+ :max max
+ :found (sto/get-size content))))
+
(when-let [hash (get object :hash)]
(when (not= hash (sto/get-hash content))
(ex/raise :type :validation
@@ -1117,6 +1154,15 @@
(let [manifest (-> (read-manifest input)
(validate-manifest))
entries (read-zip-entries input)
+
+ _ (when-let [max (::bfc/import-max-zip-entries cfg)]
+ (when (> (count entries) max)
+ (ex/raise :type :validation
+ :code :too-many-zip-entries
+ :hint (str "zip file has too many entries: " (count entries))
+ :max max
+ :found (count entries))))
+
cfg (-> cfg
(assoc ::entries entries)
(assoc ::manifest manifest)
diff --git a/backend/src/app/config.clj b/backend/src/app/config.clj
index 2abeaaffbc..6f69047382 100644
--- a/backend/src/app/config.clj
+++ b/backend/src/app/config.clj
@@ -94,7 +94,11 @@
;; SSRF protection
:ssrf-allowed-hosts #{}
- :ssrf-extra-blocked-cidrs #{}})
+ :ssrf-extra-blocked-cidrs #{}
+
+ ;; Binfile import limits
+ :binfile-import-max-object-size (* 1024 1024 100) ;; 100 MiB
+ :binfile-import-max-zip-entries (* 500 1000)}) ;; 500,000
(def schema:config
(do #_sm/optional-keys
@@ -151,6 +155,10 @@
[:media-processing-service-uri {:optional true} ::sm/uri]
[:media-processing-service-timeout {:optional true} ::sm/int]
+ ;; Binfile import limits (PENPOT_BINFILE_IMPORT_*)
+ [:binfile-import-max-object-size {:optional true} ::sm/int]
+ [:binfile-import-max-zip-entries {:optional true} ::sm/int]
+
[:deletion-delay {:optional true} ::ct/duration]
[:file-clean-delay {:optional true} ::ct/duration]
[:telemetry-enabled {:optional true} ::sm/boolean]
diff --git a/backend/src/app/db.clj b/backend/src/app/db.clj
index 70ceca3819..8f7719d705 100644
--- a/backend/src/app/db.clj
+++ b/backend/src/app/db.clj
@@ -31,8 +31,8 @@
com.zaxxer.hikari.HikariDataSource
com.zaxxer.hikari.HikariPoolMXBean
com.zaxxer.hikari.metrics.prometheus.PrometheusMetricsTrackerFactory
- io.whitfin.siphash.SipHasher
- io.whitfin.siphash.SipHasherContainer
+ io.whitfin.siphash.SipHash
+ io.whitfin.siphash.SipHashContext
java.io.InputStream
java.io.OutputStream
java.sql.Connection
@@ -701,12 +701,12 @@
;; --- Locks
(def ^:private siphash-state
- (SipHasher/container
- (uuid/get-bytes uuid/zero)))
+ (SipHash/context
+ (uuid/get-bytes uuid/zero)))
(defn uuid->hash-code
[o]
- (.hash ^SipHasherContainer siphash-state
+ (.hash ^SipHashContext siphash-state
^bytes (uuid/get-bytes o)))
(defn- xact-check-param
diff --git a/backend/src/app/http/debug.clj b/backend/src/app/http/debug.clj
index 9daaeb28af..1908cbd045 100644
--- a/backend/src/app/http/debug.clj
+++ b/backend/src/app/http/debug.clj
@@ -370,7 +370,9 @@
::bfc/overwrite false
::bfc/profile-id profile-id
::bfc/project-id project-id
- ::bfc/input path)]
+ ::bfc/input path
+ ::bfc/import-max-object-size (cf/get :binfile-import-max-object-size)
+ ::bfc/import-max-zip-entries (cf/get :binfile-import-max-zip-entries))]
(bf.v3/import-files! cfg)
{::yres/status 200
::yres/headers {"content-type" "text/plain"}
@@ -626,7 +628,9 @@
::bfc/profile-id profile-id
::bfc/project-id project-id
::bfc/input path
- ::bfc/features (cfeat/get-team-enabled-features cf/flags team))]
+ ::bfc/features (cfeat/get-team-enabled-features cf/flags team)
+ ::bfc/import-max-object-size (cf/get :binfile-import-max-object-size)
+ ::bfc/import-max-zip-entries (cf/get :binfile-import-max-zip-entries))]
(if (= format :binfile-v3)
(bf.v3/import-files! cfg)
diff --git a/backend/src/app/main.clj b/backend/src/app/main.clj
index a17170fb1e..b6f70d953c 100644
--- a/backend/src/app/main.clj
+++ b/backend/src/app/main.clj
@@ -400,6 +400,8 @@
:delete-object
(ig/ref :app.tasks.delete-object/handler)
+ :demo-purge
+ (ig/ref :app.tasks.demo-purge/handler)
:process-webhook-event
(ig/ref ::webhooks/process-event-handler)
:run-webhook
@@ -437,6 +439,9 @@
:app.tasks.delete-object/handler
{::db/pool (ig/ref ::db/pool)}
+ :app.tasks.demo-purge/handler
+ {::db/pool (ig/ref ::db/pool)}
+
:app.tasks.file-gc/handler
{::db/pool (ig/ref ::db/pool)
::sto/storage (ig/ref ::sto/storage)}
diff --git a/backend/src/app/rpc/commands/binfile.clj b/backend/src/app/rpc/commands/binfile.clj
index 839305f623..a1537dc501 100644
--- a/backend/src/app/rpc/commands/binfile.clj
+++ b/backend/src/app/rpc/commands/binfile.clj
@@ -103,7 +103,9 @@
(assoc ::bfc/project-id project-id)
(assoc ::bfc/profile-id profile-id)
(assoc ::bfc/team-id (:id team))
- (assoc ::bfc/name name))
+ (assoc ::bfc/name name)
+ (assoc ::bfc/import-max-object-size (cf/get :binfile-import-max-object-size))
+ (assoc ::bfc/import-max-zip-entries (cf/get :binfile-import-max-zip-entries)))
input-path (:path file)
owned? (some? upload-id)
diff --git a/backend/src/app/rpc/commands/comments.clj b/backend/src/app/rpc/commands/comments.clj
index 118543dd38..037e4494b2 100644
--- a/backend/src/app/rpc/commands/comments.clj
+++ b/backend/src/app/rpc/commands/comments.clj
@@ -231,8 +231,11 @@
::sm/params schema:get-comment-threads}
[cfg {:keys [::rpc/profile-id file-id share-id] :as params}]
(db/run! cfg (fn [{:keys [::db/conn] :as cfg}]
- (files/check-comment-permissions! cfg profile-id file-id share-id)
- (get-comment-threads conn profile-id file-id))))
+ (let [perms (files/check-comment-permissions! cfg profile-id file-id share-id)
+ threads (get-comment-threads conn profile-id file-id)]
+ (if (= :share-link (:type perms))
+ (filterv #(contains? (:pages perms) (:page-id %)) threads)
+ threads)))))
(defn- get-comment-threads-sql
[where]
@@ -329,9 +332,15 @@
::sm/params schema:get-comment-thread}
[cfg {:keys [::rpc/profile-id file-id id share-id] :as params}]
(db/run! cfg (fn [{:keys [::db/conn] :as cfg}]
- (files/check-comment-permissions! cfg profile-id file-id share-id)
- (some-> (db/exec-one! conn [sql:get-comment-thread profile-id file-id id])
- (decode-row)))))
+ (let [perms (files/check-comment-permissions! cfg profile-id file-id share-id)
+ thread (some-> (db/exec-one! conn [sql:get-comment-thread profile-id file-id id])
+ (decode-row))]
+ (when (and thread (= :share-link (:type perms)))
+ (when-not (contains? (:pages perms) (:page-id thread))
+ (ex/raise :type :not-found
+ :code :object-not-found
+ :hint "not found")))
+ thread))))
;; --- COMMAND: Retrieve Comments
@@ -348,8 +357,13 @@
::sm/params schema:get-comments}
[cfg {:keys [::rpc/profile-id thread-id share-id]}]
(db/run! cfg (fn [{:keys [::db/conn] :as cfg}]
- (let [{:keys [file-id]} (get-comment-thread conn thread-id)]
- (files/check-comment-permissions! cfg profile-id file-id share-id)
+ (let [{:keys [file-id page-id]} (get-comment-thread conn thread-id)
+ perms (files/check-comment-permissions! cfg profile-id file-id share-id)]
+ (when (and (= :share-link (:type perms))
+ (not (contains? (:pages perms) page-id)))
+ (ex/raise :type :not-found
+ :code :object-not-found
+ :hint "not found"))
(get-comments conn thread-id)))))
(def sql:get-comments
diff --git a/backend/src/app/rpc/commands/demo.clj b/backend/src/app/rpc/commands/demo.clj
index 3459410248..3ac726128f 100644
--- a/backend/src/app/rpc/commands/demo.clj
+++ b/backend/src/app/rpc/commands/demo.clj
@@ -7,9 +7,9 @@
(ns app.rpc.commands.demo
"A demo specific mutations."
(:require
- [app.auth :refer [derive-password]]
+ [app.auth :refer [derive-password-weak]]
[app.common.exceptions :as ex]
- [app.common.time :as ct]
+ [app.common.uuid :as uuid]
[app.config :as cf]
[app.db :as db]
[app.loggers.audit :as audit]
@@ -17,6 +17,7 @@
[app.rpc.commands.auth :as auth]
[app.rpc.doc :as-alias doc]
[app.util.services :as sv]
+ [app.worker :as wrk]
[buddy.core.codecs :as bc]
[buddy.core.nonce :as bn]))
@@ -34,8 +35,8 @@
:code :demo-users-not-allowed
:hint "Demo users are disabled by config."))
- (let [sem (System/currentTimeMillis)
- email (str "demo-" sem ".demo@example.com")
+ (let [sem (uuid/next)
+ email (str "demo-" sem "@demo.example.com")
fullname (str "Demo User " sem)
password (-> (bn/random-bytes 16)
@@ -46,13 +47,17 @@
:fullname fullname
:is-active true
:is-demo true
- :deleted-at (ct/in-future (cf/get-deletion-delay))
- :password (derive-password password)
+ :password (derive-password-weak password)
:props {}}
profile (db/tx-run! cfg (fn [cfg]
(->> (auth/create-profile cfg params)
(auth/create-profile-rels cfg))))]
+
+ (wrk/submit! (-> cfg
+ (assoc ::wrk/task :demo-purge)
+ (assoc ::wrk/delay (cf/get-deletion-delay))
+ (assoc ::wrk/params {:profile-id (:id profile)})))
+
(with-meta {:email email
:password password}
{::audit/profile-id (:id profile)})))
-
diff --git a/backend/src/app/rpc/commands/files.clj b/backend/src/app/rpc/commands/files.clj
index e6a6e71012..366ba96499 100644
--- a/backend/src/app/rpc/commands/files.clj
+++ b/backend/src/app/rpc/commands/files.clj
@@ -95,18 +95,23 @@
(def check-read-permissions!
(perms/make-check-fn has-read-permissions?))
-;; A user has comment permissions if she has read permissions, or
-;; explicit comment permissions through the share-id
+;; A user has comment permissions if:
+;; - For :membership type: they have read permissions OR explicit comment permissions
+;; - For :share-link type: they must have explicit comment permissions (who-comment=all)
+;; This prevents share-link holders with who-comment=team from bypassing the restriction
(defn check-comment-permissions!
[cfg profile-id file-id share-id]
- (let [perms (perms/get-file-read-permissions cfg profile-id file-id share-id)
- can-read (has-read-permissions? perms)
- can-comment (has-comment-permissions? perms)]
- (when-not (or can-read can-comment)
+ (let [perms (perms/get-file-read-permissions cfg profile-id file-id share-id)
+ allowed? (if (= :share-link (:type perms))
+ (has-comment-permissions? perms)
+ (or (has-read-permissions? perms)
+ (has-comment-permissions? perms)))]
+ (when-not allowed?
(ex/raise :type :not-found
:code :object-not-found
- :hint "not found"))))
+ :hint "not found"))
+ perms))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; QUERY COMMANDS
diff --git a/backend/src/app/rpc/commands/management.clj b/backend/src/app/rpc/commands/management.clj
index 99d822314e..7725320e12 100644
--- a/backend/src/app/rpc/commands/management.clj
+++ b/backend/src/app/rpc/commands/management.clj
@@ -426,7 +426,9 @@
(assoc ::bfc/project-id project-id)
(assoc ::bfc/profile-id profile-id)
(assoc ::bfc/input template)
- (assoc ::bfc/features (cfeat/get-team-enabled-features cf/flags team)))
+ (assoc ::bfc/features (cfeat/get-team-enabled-features cf/flags team))
+ (assoc ::bfc/import-max-object-size (cf/get :binfile-import-max-object-size))
+ (assoc ::bfc/import-max-zip-entries (cf/get :binfile-import-max-zip-entries)))
result (if (= format :binfile-v3)
(bf.v3/import-files! cfg)
diff --git a/backend/src/app/rpc/commands/profile.clj b/backend/src/app/rpc/commands/profile.clj
index 97050edf8b..a803050c71 100644
--- a/backend/src/app/rpc/commands/profile.clj
+++ b/backend/src/app/rpc/commands/profile.clj
@@ -141,9 +141,7 @@
(defn get-profile
"Get profile by id. Throws not-found exception if no profile found."
[conn id & {:as opts}]
- ;; NOTE: We need to set ::db/remove-deleted to false because demo profiles
- ;; are created with a set deleted-at value
- (-> (db/get-by-id conn :profile id (assoc opts ::db/remove-deleted false))
+ (-> (db/get-by-id conn :profile id opts)
(decode-row)))
;; --- MUTATION: Update Profile (own)
diff --git a/backend/src/app/rpc/commands/teams.clj b/backend/src/app/rpc/commands/teams.clj
index 47dacbe574..5266feb4b5 100644
--- a/backend/src/app/rpc/commands/teams.clj
+++ b/backend/src/app/rpc/commands/teams.clj
@@ -944,8 +944,10 @@
::sm/params schema:delete-team-member
::db/transaction true}
[{:keys [::db/conn ::mbus/msgbus] :as cfg} {:keys [::rpc/profile-id team-id member-id] :as params}]
- (let [team (get-team conn :profile-id profile-id :team-id team-id)
- perms (get-permissions conn profile-id team-id)]
+ (let [team (get-team conn :profile-id profile-id :team-id team-id)
+ perms (get-permissions conn profile-id team-id)
+ members (get-team-members conn team-id)
+ member (d/seek #(= member-id (:id %)) members)]
(when-not (or (:is-owner perms)
(:is-admin perms))
(ex/raise :type :validation
@@ -955,6 +957,15 @@
(ex/raise :type :validation
:code :cant-remove-yourself))
+ (when-not member
+ (ex/raise :type :not-found
+ :code :member-does-not-exist))
+
+ (when (and (:is-owner member)
+ (not (:is-owner perms)))
+ (ex/raise :type :validation
+ :code :cant-remove-owner))
+
(db/delete! conn :team-profile-rel {:profile-id member-id
:team-id team-id})
diff --git a/backend/src/app/rpc/commands/viewer.clj b/backend/src/app/rpc/commands/viewer.clj
index bc3205adf4..988cb26f5f 100644
--- a/backend/src/app/rpc/commands/viewer.clj
+++ b/backend/src/app/rpc/commands/viewer.clj
@@ -56,7 +56,7 @@
(assoc :can-read true)))
(defn- get-view-only-bundle
- [{:keys [::db/conn] :as cfg} {:keys [profile-id file-id ::perms] :as params}]
+ [{:keys [::db/conn] :as cfg} {:keys [profile-id file-id share-id ::perms] :as params}]
(let [file (bfc/get-file cfg file-id)
project (db/get conn :project
@@ -89,16 +89,18 @@
(mapv (fn [{:keys [id] :as lib}]
(merge lib (bfc/get-file cfg id)))))
- links (->> (db/query conn :share-link {:file-id file-id})
- (mapv (fn [row]
- (-> row
- (update :pages db/decode-pgarray #{})
- ;; NOTE: the flags are deprecated but are still present
- ;; on the table on old rows. The flags are pgarray and
- ;; for avoid decoding it (because they are no longer used
- ;; on frontend) we just dissoc the column attribute from
- ;; row.
- (dissoc :flags)))))
+ links (cond->> (->> (db/query conn :share-link {:file-id file-id})
+ (mapv (fn [row]
+ (-> row
+ (update :pages db/decode-pgarray #{})
+ ;; NOTE: the flags are deprecated but are still present
+ ;; on the table on old rows. The flags are pgarray and
+ ;; for avoid decoding it (because they are no longer used
+ ;; on frontend) we just dissoc the column attribute from
+ ;; row.
+ (dissoc :flags)))))
+ (= :share-link (:type perms))
+ (filterv #(= (:id %) share-id)))
fonts (db/query conn :team-font-variant
{:team-id (:id team)
diff --git a/backend/src/app/rpc/management/nitrate.clj b/backend/src/app/rpc/management/nitrate.clj
index 64d687ec10..69d17ca701 100644
--- a/backend/src/app/rpc/management/nitrate.clj
+++ b/backend/src/app/rpc/management/nitrate.clj
@@ -1045,3 +1045,18 @@ RETURNING id, deleted_at;")
(update acc :created conj email)))))
{:created [] :skipped []}
emails)))))
+
+;; ---- API: get-air-gapped
+
+(def ^:private schema:get-air-gapped-result
+ [:map
+ [:air-gapped ::sm/boolean]])
+
+(sv/defmethod ::get-air-gapped
+ "Returns whether this Penpot instance runs in air-gapped mode."
+ {::doc/added "2.18"
+ ::sm/params [:map]
+ ::sm/result schema:get-air-gapped-result
+ ::rpc/auth false}
+ [_cfg _params]
+ {:air-gapped (contains? cf/flags :air-gapped-conf)})
diff --git a/backend/src/app/tasks/demo_purge.clj b/backend/src/app/tasks/demo_purge.clj
new file mode 100644
index 0000000000..429816c053
--- /dev/null
+++ b/backend/src/app/tasks/demo_purge.clj
@@ -0,0 +1,41 @@
+;; This Source Code Form is subject to the terms of the Mozilla Public
+;; License, v. 2.0. If a copy of the MPL was not distributed with this
+;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
+;;
+;; Copyright (c) KALEIDOS INC Sucursal en España SL
+
+(ns app.tasks.demo-purge
+ "Task handler for delayed demo profile deletion. Submitted at demo
+ creation time with a delay matching the configured deletion-delay."
+ (:require
+ [app.common.logging :as l]
+ [app.common.time :as ct]
+ [app.db :as db]
+ [app.worker :as wrk]
+ [integrant.core :as ig]))
+
+(defmethod ig/assert-key ::handler
+ [_ params]
+ (assert (db/pool? (::db/pool params)) "expected a valid database pool"))
+
+(defmethod ig/init-key ::handler
+ [_ cfg]
+ (fn [{:keys [props]}]
+ (let [profile-id (get props :profile-id)
+ now (ct/now)]
+
+ (l/trc :hint "demo-purge" :profile-id (str profile-id))
+
+ ;; Mark the profile for immediate deletion
+ (db/tx-run! cfg
+ (fn [{:keys [::db/conn] :as cfg}]
+ (db/update! conn :profile
+ {:deleted-at now}
+ {:id profile-id}
+ {::db/return-keys false})
+ (wrk/submit!
+ (-> cfg
+ (assoc ::wrk/task :delete-object)
+ (assoc ::wrk/params {:object :profile
+ :deleted-at now
+ :id profile-id}))))))))
diff --git a/backend/src/app/tasks/objects_gc.clj b/backend/src/app/tasks/objects_gc.clj
index a72459e432..399bc50beb 100644
--- a/backend/src/app/tasks/objects_gc.clj
+++ b/backend/src/app/tasks/objects_gc.clj
@@ -13,6 +13,7 @@
[app.db :as db]
[app.features.fdata :as fdata]
[app.storage :as sto]
+ [app.tasks.delete-object :as dobj]
[integrant.core :as ig]))
(def ^:private sql:get-profiles
@@ -33,6 +34,11 @@
;; Mark as deleted the storage object
(some->> photo-id (sto/touch-object! storage))
+ ;; Cascade soft-delete to owned teams, projects, files, etc.
+ (dobj/delete-object cfg {:object :profile
+ :id id
+ :deleted-at timestamp})
+
(let [affected (-> (db/delete! conn :profile {:id id})
(db/get-update-count))]
(+ total affected)))
diff --git a/backend/src/app/util/ssrf.clj b/backend/src/app/util/ssrf.clj
index e2c5fdd25d..0096eabb1c 100644
--- a/backend/src/app/util/ssrf.clj
+++ b/backend/src/app/util/ssrf.clj
@@ -5,7 +5,12 @@
;; Copyright (c) KALEIDOS SUBSIDIARY SL
(ns app.util.ssrf
- "URL/host validation to prevent Server-Side Request Forgery."
+ "URL/host validation to prevent Server-Side Request Forgery.
+
+ The blocklist covers the standard JVM InetAddress classifications plus
+ explicit ranges: IPv6 ULA, IPv4-mapped loopback, cloud metadata,
+ operator-supplied CIDRs and the IPv6 transition mechanisms NAT64, 6to4
+ and Teredo."
(:require
[app.common.exceptions :as ex]
[app.common.logging :as l]
@@ -122,6 +127,20 @@
;; Check the embedded IPv4 is loopback (127.x.x.x)
(= (bit-and (aget bs 12) 0xFF) 127))))
+(defn- transition-prefix
+ "Classify a 16-byte IPv6 address into its transition mechanism:
+ :nat64 (64:ff9b::/96), :6to4 (2002::/16), :teredo (2001:0000::/32) or nil."
+ [^bytes bs]
+ (let [b0 (bit-and (aget bs 0) 0xFF)
+ b1 (bit-and (aget bs 1) 0xFF)
+ b2 (bit-and (aget bs 2) 0xFF)
+ b3 (bit-and (aget bs 3) 0xFF)]
+ (cond
+ (and (= b0 0x00) (= b1 0x64) (= b2 0xFF) (= b3 0x9B)) :nat64
+ (and (= b0 0x20) (= b1 0x02)) :6to4
+ (and (= b0 0x20) (= b1 0x01) (= b2 0x00) (= b3 0x00)) :teredo
+ :else nil)))
+
(defn- blocked-address?
"Check if an InetAddress should be blocked. Returns true if blocked."
[^InetAddress addr]
@@ -141,12 +160,15 @@
;; Cloud metadata IPs (exact match)
(contains? cloud-metadata-ips (.getHostAddress addr))
- ;; Extra blocked CIDRs (IPv4 only)
+ ;; Extra blocked CIDRs (IPv4 only) and IPv6 transition mechanisms
(let [bs (.getAddress addr)]
(if (= (alength bs) 4)
(or (some #(in-cidr4? bs %) extra-blocked-ranges)
(some #(in-cidr4? bs %) extra-blocked-cidrs))
- false))))
+ ;; IPv6 transition mechanisms (NAT64/6to4/Teredo): the range is
+ ;; rejected outright.
+ (boolean (when (= (alength bs) 16)
+ (transition-prefix bs)))))))
(defn resolve-host
"Resolve a hostname to all InetAddress objects. Wraps InetAddress/getAllByName
@@ -163,8 +185,10 @@
- host must resolve to at least one address, and
- **every** resolved address must NOT be in the blocklist
(loopback, link-local, site-local, multicast, any-local,
- cloud-metadata 169.254.169.254, IPv6 ULA fc00::/7, IPv4-mapped
- IPv6 of any blocked IPv4, plus operator-supplied CIDRs).
+ cloud-metadata 169.254.169.254, IPv6 ULA fc00::/7, IPv6 transition
+ mechanisms NAT64 64:ff9b::/96, 6to4 2002::/16 and Teredo
+ 2001:0000::/32, IPv4-mapped IPv6 of any blocked IPv4,
+ plus operator-supplied CIDRs).
When the host is an IP literal (decimal/octal/hex/IPv6) it is
normalized via `com.google.common.net.InetAddresses` before the
check.
diff --git a/backend/test/backend_tests/binfile_test.clj b/backend/test/backend_tests/binfile_test.clj
index 6eb7eff268..1f1caa6182 100644
--- a/backend/test/backend_tests/binfile_test.clj
+++ b/backend/test/backend_tests/binfile_test.clj
@@ -27,6 +27,7 @@
[app.storage :as sto]
[app.storage.tmp :as tmp]
[backend-tests.helpers :as th]
+ [backend-tests.storage-test :as stt]
[clojure.test :as t]
[cuerdas.core :as str]
[datoteka.fs :as fs]
@@ -1883,3 +1884,86 @@
(t/is (some? ext-libs)
"type :link-later should produce external-libraries even with include-libraries=true")
(t/is (pos? (count ext-libs))))))
+
+(t/deftest import-rejects-too-many-zip-entries
+ ;; import must reject ZIP files exceeding max-zip-entries
+ (let [profile (th/create-profile* 1)
+ file (prepare-simple-file profile)
+ output (tmp/tempfile :suffix ".zip")]
+
+ (v3/export-files!
+ (-> th/*system*
+ (assoc ::bfc/ids #{(:id file)})
+ (assoc ::bfc/export-type :detach-libraries))
+ (io/output-stream output))
+
+ ;; Import with max-zip-entries=1 — the exported ZIP has more entries
+ (let [cfg (-> th/*system*
+ (assoc ::bfc/project-id (:default-project-id profile))
+ (assoc ::bfc/profile-id (:id profile))
+ (assoc ::bfc/input output)
+ (assoc ::bfc/import-max-zip-entries 1))
+ out (try
+ (v3/import-files! cfg)
+ :no-error
+ (catch Throwable e
+ (let [d (or (ex-data e) (some-> (ex-cause e) ex-data))]
+ d)))]
+ (t/is (= :validation (:type out)))
+ (t/is (= :too-many-zip-entries (:code out))))))
+
+(defn- prepare-file-with-media
+ "Creates a file with a media object backed by a real storage object,
+ so that v3 export produces objects/ entries."
+ [profile]
+ (let [storage (-> (:app.storage/storage th/*system*)
+ (stt/configure-storage-backend))
+
+ sobject (sto/put-object! storage {::sto/content (sto/content "media-bytes")
+ :content-type "image/svg+xml"
+ :bucket "file-media-object"})
+
+ file (th/create-file* 1 {:profile-id (:id profile)
+ :project-id (:default-project-id profile)
+ :is-shared false})
+
+ mobj (th/create-file-media-object* {:file-id (:id file)
+ :is-local true
+ :media-id (:id sobject)})]
+ (update-file!
+ :file-id (:id file)
+ :profile-id (:id profile)
+ :revn 0
+ :vern 0
+ :changes
+ [{:type :add-media
+ :object mobj}])
+
+ (dissoc file :data)))
+
+(t/deftest import-rejects-oversized-object
+ ;; import must reject storage objects exceeding max-object-size
+ (let [profile (th/create-profile* 1)
+ file (prepare-file-with-media profile)
+ output (tmp/tempfile :suffix ".zip")]
+
+ (v3/export-files!
+ (-> th/*system*
+ (assoc ::bfc/ids #{(:id file)})
+ (assoc ::bfc/export-type :detach-libraries))
+ (io/output-stream output))
+
+ ;; Import with max-object-size=1 — the media object will exceed this
+ (let [cfg (-> th/*system*
+ (assoc ::bfc/project-id (:default-project-id profile))
+ (assoc ::bfc/profile-id (:id profile))
+ (assoc ::bfc/input output)
+ (assoc ::bfc/import-max-object-size 1))
+ out (try
+ (v3/import-files! cfg)
+ :no-error
+ (catch Throwable e
+ (let [d (or (ex-data e) (some-> (ex-cause e) ex-data))]
+ d)))]
+ (t/is (= :validation (:type out)))
+ (t/is (= :max-file-size-reached (:code out))))))
diff --git a/backend/test/backend_tests/db_test.clj b/backend/test/backend_tests/db_test.clj
index 44893529dc..39388dd825 100644
--- a/backend/test/backend_tests/db_test.clj
+++ b/backend/test/backend_tests/db_test.clj
@@ -6,6 +6,7 @@
(ns backend-tests.db-test
(:require
+ [app.common.uuid :as uuid]
[app.db :as db]
[backend-tests.helpers :as th]
[clojure.test :as t])
@@ -41,3 +42,13 @@
(t/testing "maximum pool size is reasonable"
(t/is (pos? (:maximum-pool-size stats))))))
+
+(t/deftest uuid->hash-code-is-deterministic
+ (t/is (= (db/uuid->hash-code uuid/zero)
+ (db/uuid->hash-code uuid/zero))))
+
+(t/deftest uuid->hash-code-returns-long
+ (t/is (instance? Long (db/uuid->hash-code uuid/zero))))
+
+(t/deftest uuid->hash-code-stable-for-zero-uuid
+ (t/is (= 3659997967308761462 (db/uuid->hash-code uuid/zero))))
diff --git a/backend/test/backend_tests/demo_test.clj b/backend/test/backend_tests/demo_test.clj
new file mode 100644
index 0000000000..da1cc342c9
--- /dev/null
+++ b/backend/test/backend_tests/demo_test.clj
@@ -0,0 +1,47 @@
+;; This Source Code Form is subject to the terms of the Mozilla Public
+;; License, v. 2.0. If a copy of the MPL was not distributed with this
+;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
+;;
+;; Copyright (c) KALEIDOS INC Sucursal en España SL
+
+(ns backend-tests.demo-test
+ (:require
+ [app.common.time :as ct]
+ [app.db :as db]
+ [app.rpc.commands.profile :as profile]
+ [app.tasks.demo-purge :as demo-purge]
+ [app.worker :as wrk]
+ [backend-tests.helpers :as th]
+ [clojure.test :as t]
+ [integrant.core :as ig]))
+
+(t/use-fixtures :once th/state-init)
+(t/use-fixtures :each th/database-reset)
+
+(t/deftest demo-profile-created-without-deleted-at
+ (let [profile (th/create-profile* 999 {:is-demo true})]
+ (t/is (true? (:is-demo profile)))
+ (t/is (nil? (:deleted-at profile)))
+ (t/is (some? (:id profile)))))
+
+(t/deftest get-profile-finds-demo-user-without-override
+ (let [profile (th/create-profile* 998 {:is-demo true})
+ found (db/run! th/*pool*
+ (fn [{:keys [::db/conn]}]
+ (profile/get-profile conn (:id profile))))]
+ (t/is (some? found))
+ (t/is (= (:id profile) (:id found)))))
+
+(t/deftest demo-purge-handler-submits-delete-object
+ (let [profile (th/create-profile* 996 {:is-demo true})
+ handler (ig/init-key :app.tasks.demo-purge/handler
+ {::db/pool th/*pool*})
+ submitted (atom nil)]
+ (with-redefs [wrk/submit! (fn [& {:keys [::wrk/task ::wrk/params]}]
+ (reset! submitted {:task task :params params}))]
+ (handler {:props {:profile-id (:id profile)
+ :deleted-at (ct/now)}}))
+ (t/is (= :delete-object (:task @submitted)))
+ (t/is (= :profile (:object (:params @submitted))))
+ (t/is (= (:id profile) (:id (:params @submitted))))
+ (t/is (some? (:deleted-at (:params @submitted))))))
diff --git a/backend/test/backend_tests/passwords_test.clj b/backend/test/backend_tests/passwords_test.clj
new file mode 100644
index 0000000000..75a880a5de
--- /dev/null
+++ b/backend/test/backend_tests/passwords_test.clj
@@ -0,0 +1,51 @@
+;; This Source Code Form is subject to the terms of the Mozilla Public
+;; License, v. 2.0. If a copy of the MPL was not distributed with this
+;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
+;;
+;; Copyright (c) KALEIDOS INC Sucursal en España SL
+
+(ns backend-tests.passwords-test
+ (:require
+ [app.auth.passwords :as passwords]
+ [backend-tests.helpers :as th]
+ [clojure.test :as t]))
+
+(defn- run-validation
+ [password]
+ (try
+ (passwords/validate-password password)
+ nil
+ (catch Throwable e
+ e)))
+
+(t/deftest validate-password-accepts-strong-password
+ (t/is (nil? (run-validation "Str0ng!Pass"))))
+
+(t/deftest validate-password-rejects-too-short-password
+ (let [error (run-validation "Ab1!x")]
+ (t/is (th/ex-of-code? error :weak-password))
+ (t/is (= ["errors.weak-password.too-short"] (:details (ex-data error))))))
+
+(t/deftest validate-password-rejects-missing-lowercase
+ (let [error (run-validation "ABCDEFG1!")]
+ (t/is (th/ex-of-code? error :weak-password))
+ (t/is (= ["errors.weak-password.insufficient-lowercase"]
+ (:details (ex-data error))))))
+
+(t/deftest validate-password-rejects-missing-uppercase
+ (let [error (run-validation "abcdefg1!")]
+ (t/is (th/ex-of-code? error :weak-password))
+ (t/is (= ["errors.weak-password.insufficient-uppercase"]
+ (:details (ex-data error))))))
+
+(t/deftest validate-password-rejects-missing-digit
+ (let [error (run-validation "Abcdefgh!")]
+ (t/is (th/ex-of-code? error :weak-password))
+ (t/is (= ["errors.weak-password.insufficient-digits"]
+ (:details (ex-data error))))))
+
+(t/deftest validate-password-rejects-missing-special
+ (let [error (run-validation "Abcdefgh1")]
+ (t/is (th/ex-of-code? error :weak-password))
+ (t/is (= ["errors.weak-password.insufficient-special"]
+ (:details (ex-data error))))))
\ No newline at end of file
diff --git a/backend/test/backend_tests/rpc_comment_test.clj b/backend/test/backend_tests/rpc_comment_test.clj
index ee5c6245e7..ea64723545 100644
--- a/backend/test/backend_tests/rpc_comment_test.clj
+++ b/backend/test/backend_tests/rpc_comment_test.clj
@@ -285,3 +285,196 @@
(let [threads (th/db-query :comment-thread {:file-id (:id file-1)})]
(t/is (= 0 (count threads)))))))))
+
+(t/deftest share-link-who-comment-team-cannot-comment
+ (let [owner (th/create-profile* 1 {:is-active true})
+ outsider (th/create-profile* 2 {:is-active true})
+
+ team (th/create-team* 1 {:profile-id (:id owner)})
+ project (th/create-project* 1 {:team-id (:id team)
+ :profile-id (:id owner)})
+ file (th/create-file* 1 {:profile-id (:id owner)
+ :project-id (:id project)})
+ page-id (get-in file [:data :pages 0])
+
+ share (th/command! {::th/type :create-share-link
+ ::rpc/profile-id (:id owner)
+ :file-id (:id file)
+ :pages #{page-id}
+ :who-comment "team"
+ :who-inspect "all"})
+ share-id (get-in share [:result :id])]
+
+ (t/testing "outsider with who-comment=team share-link cannot get-comment-threads"
+ (let [out (th/command! {::th/type :get-comment-threads
+ ::rpc/profile-id (:id outsider)
+ :file-id (:id file)
+ :share-id share-id})]
+ (t/is (not (th/success? out)))
+ (t/is (= :not-found (th/ex-type (:error out))))))
+
+ (t/testing "outsider with who-comment=team share-link cannot create-comment-thread"
+ (let [out (th/command! {::th/type :create-comment-thread
+ ::rpc/profile-id (:id outsider)
+ :file-id (:id file)
+ :page-id page-id
+ :position (gpt/point 0)
+ :content "outsider comment"
+ :frame-id uuid/zero
+ :share-id share-id})]
+ (t/is (not (th/success? out)))
+ (t/is (= :not-found (th/ex-type (:error out))))))))
+
+(t/deftest share-link-who-comment-all-can-comment
+ (let [owner (th/create-profile* 1 {:is-active true})
+ outsider (th/create-profile* 2 {:is-active true})
+
+ team (th/create-team* 1 {:profile-id (:id owner)})
+ project (th/create-project* 1 {:team-id (:id team)
+ :profile-id (:id owner)})
+ file (th/create-file* 1 {:profile-id (:id owner)
+ :project-id (:id project)})
+ page-id (get-in file [:data :pages 0])
+
+ share (th/command! {::th/type :create-share-link
+ ::rpc/profile-id (:id owner)
+ :file-id (:id file)
+ :pages #{page-id}
+ :who-comment "all"
+ :who-inspect "all"})
+ share-id (get-in share [:result :id])]
+
+ (t/testing "outsider with who-comment=all share-link can get-comment-threads"
+ (let [out (th/command! {::th/type :get-comment-threads
+ ::rpc/profile-id (:id outsider)
+ :file-id (:id file)
+ :share-id share-id})]
+ (t/is (th/success? out))))
+
+ (t/testing "outsider with who-comment=all share-link can create-comment-thread"
+ (let [out (th/command! {::th/type :create-comment-thread
+ ::rpc/profile-id (:id outsider)
+ :file-id (:id file)
+ :page-id page-id
+ :position (gpt/point 0)
+ :content "outsider comment"
+ :frame-id uuid/zero
+ :share-id share-id})]
+ (t/is (th/success? out))))))
+
+(t/deftest share-link-page-scope-enforced
+ (let [owner (th/create-profile* 1 {:is-active true})
+ outsider (th/create-profile* 2 {:is-active true})
+
+ team (th/create-team* 1 {:profile-id (:id owner)})
+ project (th/create-project* 1 {:team-id (:id team)
+ :profile-id (:id owner)})
+ file (th/create-file* 1 {:profile-id (:id owner)
+ :project-id (:id project)})
+
+ page-a (get-in file [:data :pages 0])
+ page-b (uuid/random)
+
+ _ (th/command! {::th/type :update-file
+ ::rpc/profile-id (:id owner)
+ :id (:id file)
+ :session-id (uuid/random)
+ :revn 0
+ :vern 0
+ :changes [{:type :add-page
+ :id page-b
+ :page {:id page-b
+ :name "Page B"
+ :options {}
+ :objects {}}}]})
+
+ thread-a (th/command! {::th/type :create-comment-thread
+ ::rpc/profile-id (:id owner)
+ :file-id (:id file)
+ :page-id page-a
+ :position (gpt/point 0)
+ :content "comment on page A"
+ :frame-id uuid/zero})
+ thread-b (th/command! {::th/type :create-comment-thread
+ ::rpc/profile-id (:id owner)
+ :file-id (:id file)
+ :page-id page-b
+ :position (gpt/point 0)
+ :content "comment on page B"
+ :frame-id uuid/zero})
+
+ thread-a-id (get-in thread-a [:result :id])
+ thread-b-id (get-in thread-b [:result :id])
+
+ share (th/command! {::th/type :create-share-link
+ ::rpc/profile-id (:id owner)
+ :file-id (:id file)
+ :pages #{page-a}
+ :who-comment "all"
+ :who-inspect "all"})
+ share-id (get-in share [:result :id])]
+
+ (t/testing "share-link holder can get-comment-threads for shared page only"
+ (let [out (th/command! {::th/type :get-comment-threads
+ ::rpc/profile-id (:id outsider)
+ :file-id (:id file)
+ :share-id share-id})
+ result (:result out)]
+ (t/is (th/success? out))
+ (t/is (= 1 (count result)))
+ (t/is (= page-a (:page-id (first result))))))
+
+ (t/testing "share-link holder cannot get-comment-thread for unshared page"
+ (let [out (th/command! {::th/type :get-comment-thread
+ ::rpc/profile-id (:id outsider)
+ :file-id (:id file)
+ :id thread-b-id
+ :share-id share-id})]
+ (t/is (not (th/success? out)))
+ (t/is (= :not-found (th/ex-type (:error out))))))
+
+ (t/testing "share-link holder can get-comment-thread for shared page"
+ (let [out (th/command! {::th/type :get-comment-thread
+ ::rpc/profile-id (:id outsider)
+ :file-id (:id file)
+ :id thread-a-id
+ :share-id share-id})]
+ (t/is (th/success? out))))
+
+ (t/testing "share-link holder cannot get-comments for thread on unshared page"
+ (let [out (th/command! {::th/type :get-comments
+ ::rpc/profile-id (:id outsider)
+ :thread-id thread-b-id
+ :share-id share-id})]
+ (t/is (not (th/success? out)))
+ (t/is (= :not-found (th/ex-type (:error out))))))))
+
+(t/deftest membership-can-still-comment
+ (let [owner (th/create-profile* 1 {:is-active true})
+ member (th/create-profile* 2 {:is-active true})
+
+ team (th/create-team* 1 {:profile-id (:id owner)})
+ _ (th/create-team-role* {:team-id (:id team)
+ :profile-id (:id member)
+ :role :editor})
+ project (th/create-project* 1 {:team-id (:id team)
+ :profile-id (:id owner)})
+ file (th/create-file* 1 {:profile-id (:id owner)
+ :project-id (:id project)})
+ page-id (get-in file [:data :pages 0])]
+
+ (t/testing "team member can get-comment-threads without share-id"
+ (let [out (th/command! {::th/type :get-comment-threads
+ ::rpc/profile-id (:id member)
+ :file-id (:id file)})]
+ (t/is (th/success? out))))
+
+ (t/testing "team member can create-comment-thread without share-id"
+ (let [out (th/command! {::th/type :create-comment-thread
+ ::rpc/profile-id (:id member)
+ :file-id (:id file)
+ :page-id page-id
+ :position (gpt/point 0)
+ :content "member comment"
+ :frame-id uuid/zero})]
+ (t/is (th/success? out))))))
diff --git a/backend/test/backend_tests/rpc_demo_test.clj b/backend/test/backend_tests/rpc_demo_test.clj
new file mode 100644
index 0000000000..d990ec8a32
--- /dev/null
+++ b/backend/test/backend_tests/rpc_demo_test.clj
@@ -0,0 +1,40 @@
+;; This Source Code Form is subject to the terms of the Mozilla Public
+;; License, v. 2.0. If a copy of the MPL was not distributed with this
+;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
+;;
+;; Copyright (c) KALEIDOS INC Sucursal en España SL
+
+(ns backend-tests.rpc-demo-test
+ (:require
+ [app.auth :as auth]
+ [app.config :as cf]
+ [backend-tests.helpers :as th]
+ [clojure.test :as t]))
+
+(t/use-fixtures :once th/state-init)
+(t/use-fixtures :each th/database-reset)
+
+;; Capture the real verifier before the shared test fixture replaces it.
+(def verify-password* auth/verify-password)
+
+(t/deftest weak-password-hash-verifies
+ (let [password "DemoPassword123!"
+ hashed (auth/derive-password-weak password)]
+ (t/is (:valid (verify-password* password hashed)))))
+
+(t/deftest create-demo-profile-uses-unique-uuid-email
+ (with-redefs [cf/flags (conj cf/flags :demo-users)]
+ (let [first-result (th/command! {::th/type :create-demo-profile})
+ second-result (th/command! {::th/type :create-demo-profile})
+ first-profile (:result first-result)
+ second-profile (:result second-result)]
+ (t/is (nil? (:error first-result)))
+ (t/is (nil? (:error second-result)))
+ (t/is (re-matches #"demo-[0-9a-fA-F-]+@demo\.example\.com"
+ (:email first-profile)))
+ (t/is (not= (:email first-profile) (:email second-profile))))))
+
+(t/deftest create-demo-profile-requires-feature-flag
+ (with-redefs [cf/flags (disj cf/flags :demo-users)]
+ (let [{:keys [error]} (th/command! {::th/type :create-demo-profile})]
+ (t/is (th/ex-of-code? error :demo-users-not-allowed)))))
diff --git a/backend/test/backend_tests/rpc_font_test.clj b/backend/test/backend_tests/rpc_font_test.clj
index 68a05bb298..eb9f6cc69d 100644
--- a/backend/test/backend_tests/rpc_font_test.clj
+++ b/backend/test/backend_tests/rpc_font_test.clj
@@ -59,8 +59,13 @@
(let [out (th/command! {::th/type :create-upload-session
::rpc/profile-id (:id prof)
:total-chunks total-chunks})]
- (t/is (nil? (:error out)))
- (:session-id (:result out))))
+ (let [session-id (:session-id (:result out))]
+ (t/is (nil? (:error out))
+ (str "create-upload-session failed: "
+ (some-> (:error out) ex-data)))
+ (t/is (uuid? session-id)
+ (str "create-upload-session returned an invalid session-id: " session-id))
+ session-id)))
(defn- upload-font-chunked!
"Splits `font-bytes` into chunks of `chunk-size` bytes, creates an upload
@@ -68,14 +73,15 @@
[prof ^bytes font-bytes mtype chunk-size]
(let [chunks (split-bytes-into-chunks font-bytes chunk-size)
session-id (create-upload-session! prof (count chunks))]
- (doseq [[idx chunk-data] (map-indexed vector chunks)]
- (let [mfile (make-chunk-mfile chunk-data mtype)
- out (th/command! {::th/type :upload-chunk
- ::rpc/profile-id (:id prof)
- :session-id session-id
- :index idx
- :content mfile})]
- (t/is (nil? (:error out)))))
+ (when (uuid? session-id)
+ (doseq [[idx chunk-data] (map-indexed vector chunks)]
+ (let [mfile (make-chunk-mfile chunk-data mtype)
+ out (th/command! {::th/type :upload-chunk
+ ::rpc/profile-id (:id prof)
+ :session-id session-id
+ :index idx
+ :content mfile})]
+ (t/is (nil? (:error out))))))
session-id))
(defn- assert-font-variant-result
@@ -613,43 +619,42 @@
;; N2-07: A user with edit permissions on their own team must not be
;; able to create a font variant using a font-id that already belongs
;; to another team (BOLA / CWE-639).
- (with-mocks [mock {:target 'app.rpc.quotes/check! :return nil}]
- (let [prof1 (th/create-profile* 1 {:is-active true})
- prof2 (th/create-profile* 2 {:is-active true})
- team1 (:default-team-id prof1)
- team2 (:default-team-id prof2)
- font-id (uuid/custom 10 999)
- data (-> (io/resource "backend_tests/test_files/font-1.ttf")
- (io/read*))]
+ (let [prof1 (th/create-profile* 1 {:is-active true})
+ prof2 (th/create-profile* 2 {:is-active true})
+ team1 (:default-team-id prof1)
+ team2 (:default-team-id prof2)
+ font-id (uuid/custom 10 999)
+ data (-> (io/resource "backend_tests/test_files/font-1.ttf")
+ (io/read*))]
- ;; prof1 creates a font variant in team1 with font-id
- (let [session-id (upload-font-chunked! prof1 data "font/ttf" (* 4 1024 1024))
- params {::th/type :create-font-variant
- ::rpc/profile-id (:id prof1)
- :team-id team1
- :font-id font-id
- :font-family "SharedFont"
- :font-weight 400
- :font-style "normal"
- :uploads {"font/ttf" session-id}}
- out (th/command! params)]
- (t/is (nil? (:error out))))
+ ;; prof1 creates a font variant in team1 with font-id
+ (let [session-id (upload-font-chunked! prof1 data "font/ttf" (* 4 1024 1024))
+ params {::th/type :create-font-variant
+ ::rpc/profile-id (:id prof1)
+ :team-id team1
+ :font-id font-id
+ :font-family "SharedFont"
+ :font-weight 400
+ :font-style "normal"
+ :uploads {"font/ttf" session-id}}
+ out (th/command! params)]
+ (t/is (nil? (:error out))))
- ;; prof2 tries to create a variant using the same font-id but
- ;; in team2, which must be rejected because font-id belongs to team1
- (let [session-id (upload-font-chunked! prof2 data "font/ttf" (* 4 1024 1024))
- params {::th/type :create-font-variant
- ::rpc/profile-id (:id prof2)
- :team-id team2
- :font-id font-id
- :font-family "SharedFont"
- :font-weight 700
- :font-style "normal"
- :uploads {"font/ttf" session-id}}
- out (th/command! params)]
- (t/is (some? (:error out)))
- (t/is (= :not-found (-> out :error ex-data :type)))
- (t/is (= :object-not-found (-> out :error ex-data :code)))))))
+ ;; prof2 tries to create a variant using the same font-id but
+ ;; in team2, which must be rejected because font-id belongs to team1
+ (let [session-id (upload-font-chunked! prof2 data "font/ttf" (* 4 1024 1024))
+ params {::th/type :create-font-variant
+ ::rpc/profile-id (:id prof2)
+ :team-id team2
+ :font-id font-id
+ :font-family "SharedFont"
+ :font-weight 700
+ :font-style "normal"
+ :uploads {"font/ttf" session-id}}
+ out (th/command! params)]
+ (t/is (some? (:error out)))
+ (t/is (= :not-found (-> out :error ex-data :type)))
+ (t/is (= :object-not-found (-> out :error ex-data :code))))))
(t/deftest get-font-variants-nonexistent-file
(let [prof (th/create-profile* 1 {:is-active true})
diff --git a/backend/test/backend_tests/rpc_management_nitrate_test.clj b/backend/test/backend_tests/rpc_management_nitrate_test.clj
index aa4c4e4b05..7857bdc1a5 100644
--- a/backend/test/backend_tests/rpc_management_nitrate_test.clj
+++ b/backend/test/backend_tests/rpc_management_nitrate_test.clj
@@ -194,6 +194,15 @@
(string? (get version k)))))
(t/is (= cf/version version))))
+(t/deftest get-air-gapped
+ (let [out (th/management-command! {::th/type :get-air-gapped})]
+ (t/is (th/success? out))
+ (t/is (false? (-> out :result :air-gapped))))
+ (binding [cf/flags (conj cf/flags :air-gapped-conf)]
+ (let [out (th/management-command! {::th/type :get-air-gapped})]
+ (t/is (th/success? out))
+ (t/is (true? (-> out :result :air-gapped))))))
+
(t/deftest get-teams-returns-only-owned-non-default-non-deleted
(with-mocks [nitrate-mock {:target 'app.nitrate/call :return nil}]
(let [profile (th/create-profile* 1 {:is-active true})
diff --git a/backend/test/backend_tests/rpc_profile_test.clj b/backend/test/backend_tests/rpc_profile_test.clj
index 5cec931165..95d9d079c5 100644
--- a/backend/test/backend_tests/rpc_profile_test.clj
+++ b/backend/test/backend_tests/rpc_profile_test.clj
@@ -424,6 +424,38 @@
(let [count-after (:count (th/db-exec-one! ["SELECT count(*) FROM http_session_v2 WHERE profile_id = ?" (:id prof)]))]
(t/is (= 0 count-after)))))
+(t/deftest profile-deletion-via-gc-cascades
+ (let [prof (th/create-profile* 1)
+ file (th/create-file* 1 {:profile-id (:id prof)
+ :project-id (:default-project-id prof)
+ :is-shared false})
+ team-id (:default-team-id prof)
+ project-id (:default-project-id prof)
+ file-id (:id file)
+
+ deleted-at (ct/minus (ct/now) (ct/duration {:days 1}))]
+
+ (th/db-update! :profile
+ {:deleted-at deleted-at}
+ {:id (:id prof)})
+
+ (let [team-before (th/db-get :team {:id team-id} {::db/remove-deleted false})]
+ (t/is (nil? (:deleted-at team-before))))
+
+ (let [result (th/run-task! :objects-gc {:min-age 0})]
+ (t/is (pos? (:processed result))))
+
+ (let [profile-after (th/db-get :profile {:id (:id prof)} {::db/remove-deleted false})]
+ (t/is (nil? profile-after)))
+
+ (let [team-after (th/db-get :team {:id team-id} {::db/remove-deleted false})]
+ (t/is (nil? team-after)))
+
+ (let [project-after (th/db-get :project {:id project-id} {::db/remove-deleted false})]
+ (t/is (nil? project-after)))
+
+ (let [file-after (th/db-get :file {:id file-id} {::db/remove-deleted false})]
+ (t/is (nil? file-after)))))
(t/deftest email-blacklist-1
(t/is (false? (email.blacklist/enabled? th/*system*)))
diff --git a/backend/test/backend_tests/rpc_team_test.clj b/backend/test/backend_tests/rpc_team_test.clj
index 0b105839e4..ccb176af83 100644
--- a/backend/test/backend_tests/rpc_team_test.clj
+++ b/backend/test/backend_tests/rpc_team_test.clj
@@ -1328,3 +1328,83 @@
out (th/command! data)]
(t/is (th/success? out))
(t/is (= 1 (:call-count @mock)))))))
+
+(t/deftest admin-cannot-remove-team-owner
+ (let [owner (th/create-profile* 1 {:is-active true})
+ admin (th/create-profile* 2 {:is-active true})
+ team (th/create-team* 1 {:profile-id (:id owner)})]
+
+ (th/create-team-role* {:team-id (:id team)
+ :profile-id (:id admin)
+ :role :admin})
+
+ (let [out (th/command! {::th/type :delete-team-member
+ ::rpc/profile-id (:id admin)
+ :team-id (:id team)
+ :member-id (:id owner)})]
+ (t/is (not (th/success? out)))
+ (t/is (th/ex-of-type? (:error out) :validation))
+ (t/is (th/ex-of-code? (:error out) :cant-remove-owner)))))
+
+(t/deftest owner-can-remove-another-owner
+ (let [owner1 (th/create-profile* 1 {:is-active true})
+ owner2 (th/create-profile* 2 {:is-active true})
+ team (th/create-team* 1 {:profile-id (:id owner1)})]
+
+ (th/create-team-role* {:team-id (:id team)
+ :profile-id (:id owner2)
+ :role :owner})
+
+ (let [out (th/command! {::th/type :delete-team-member
+ ::rpc/profile-id (:id owner1)
+ :team-id (:id team)
+ :member-id (:id owner2)})]
+ (t/is (th/success? out)))))
+
+(t/deftest owner-can-remove-admin
+ (let [owner (th/create-profile* 1 {:is-active true})
+ admin (th/create-profile* 2 {:is-active true})
+ team (th/create-team* 1 {:profile-id (:id owner)})]
+
+ (th/create-team-role* {:team-id (:id team)
+ :profile-id (:id admin)
+ :role :admin})
+
+ (let [out (th/command! {::th/type :delete-team-member
+ ::rpc/profile-id (:id owner)
+ :team-id (:id team)
+ :member-id (:id admin)})]
+ (t/is (th/success? out)))))
+
+(t/deftest admin-can-remove-admin
+ (let [owner (th/create-profile* 1 {:is-active true})
+ admin1 (th/create-profile* 2 {:is-active true})
+ admin2 (th/create-profile* 3 {:is-active true})
+ team (th/create-team* 1 {:profile-id (:id owner)})]
+
+ (th/create-team-role* {:team-id (:id team)
+ :profile-id (:id admin1)
+ :role :admin})
+
+ (th/create-team-role* {:team-id (:id team)
+ :profile-id (:id admin2)
+ :role :admin})
+
+ (let [out (th/command! {::th/type :delete-team-member
+ ::rpc/profile-id (:id admin1)
+ :team-id (:id team)
+ :member-id (:id admin2)})]
+ (t/is (th/success? out)))))
+
+(t/deftest delete-nonexistent-member-returns-not-found
+ (let [owner (th/create-profile* 1 {:is-active true})
+ team (th/create-team* 1 {:profile-id (:id owner)})
+ fake-id (uuid/next)]
+
+ (let [out (th/command! {::th/type :delete-team-member
+ ::rpc/profile-id (:id owner)
+ :team-id (:id team)
+ :member-id fake-id})]
+ (t/is (not (th/success? out)))
+ (t/is (th/ex-of-type? (:error out) :not-found))
+ (t/is (th/ex-of-code? (:error out) :member-does-not-exist)))))
diff --git a/backend/test/backend_tests/rpc_viewer_test.clj b/backend/test/backend_tests/rpc_viewer_test.clj
index a7fcbaec3d..cbf9e4493a 100644
--- a/backend/test/backend_tests/rpc_viewer_test.clj
+++ b/backend/test/backend_tests/rpc_viewer_test.clj
@@ -128,3 +128,80 @@
(let [result (:result out)]
(t/is (contains? result :file))
(t/is (contains? result :project)))))))
+
+(t/deftest share-link-token-disclosure
+ (let [owner (th/create-profile* 1 {:is-active true})
+ proj-id (:default-project-id owner)
+
+ file (th/create-file* 1 {:profile-id (:id owner)
+ :project-id proj-id
+ :is-shared false})
+
+ page-a (get-in file [:data :pages 0])
+ page-b (uuid/random)
+
+ ;; Add a second page to the file
+ _ (th/command! {::th/type :update-file
+ ::rpc/profile-id (:id owner)
+ :id (:id file)
+ :session-id (uuid/random)
+ :revn 0
+ :vern 0
+ :changes [{:type :add-page
+ :id page-b
+ :page {:id page-b
+ :name "Page B"
+ :options {}
+ :objects {}}}]})
+
+ ;; Create Link A: restrictive (no pages, team-only comments/inspect)
+ link-a (th/command! {::th/type :create-share-link
+ ::rpc/profile-id (:id owner)
+ :file-id (:id file)
+ :pages #{}
+ :who-comment "team"
+ :who-inspect "team"})
+ link-a-id (get-in link-a [:result :id])
+
+ ;; Create Link B: permissive (all pages, all can comment/inspect)
+ link-b (th/command! {::th/type :create-share-link
+ ::rpc/profile-id (:id owner)
+ :file-id (:id file)
+ :pages #{page-a page-b}
+ :who-comment "all"
+ :who-inspect "all"})
+ link-b-id (get-in link-b [:result :id])]
+
+ (t/testing "restrictive share-link holder cannot see other share-link tokens"
+ (let [out (th/command! {::th/type :get-view-only-bundle
+ :share-id link-a-id
+ :file-id (:id file)})
+ err (:error out)
+ result (:result out)
+ share-links (:share-links result)]
+
+ ;; Should not error
+ (t/is (nil? err))
+
+ ;; Should only see the share-link used for authentication
+ (t/is (= 1 (count share-links)))
+ (t/is (= link-a-id (:id (first share-links))))
+
+ ;; Should NOT see Link B's token
+ (t/is (not (some #(= link-b-id (:id %)) share-links)))))
+
+ (t/testing "team member still sees all share-links"
+ (let [out (th/command! {::th/type :get-view-only-bundle
+ ::rpc/profile-id (:id owner)
+ :file-id (:id file)})
+ err (:error out)
+ result (:result out)
+ share-links (:share-links result)]
+
+ ;; Should not error
+ (t/is (nil? err))
+
+ ;; Team member should see both share-links
+ (t/is (= 2 (count share-links)))
+ (t/is (some #(= link-a-id (:id %)) share-links))
+ (t/is (some #(= link-b-id (:id %)) share-links))))))
diff --git a/backend/test/backend_tests/util_ssrf_test.clj b/backend/test/backend_tests/util_ssrf_test.clj
index e7bf8fae0d..725a4c9a55 100644
--- a/backend/test/backend_tests/util_ssrf_test.clj
+++ b/backend/test/backend_tests/util_ssrf_test.clj
@@ -80,6 +80,24 @@
(t/is (false? (ssrf/safe-url? "http://[fd00::1]/foo")))
(t/is (false? (ssrf/safe-url? "http://[fc00::1]/foo"))))
+(t/deftest validate-url-blocks-nat64-encoded-metadata
+ ;; 64:ff9b::a9fe:a9fe embeds 169.254.169.254 (cloud metadata)
+ (t/is (false? (ssrf/safe-url? "http://[64:ff9b::a9fe:a9fe]/latest/meta-data/"))))
+
+(t/deftest validate-url-blocks-nat64-encoded-loopback
+ ;; 64:ff9b::7f00:0001 embeds 127.0.0.1
+ (t/is (false? (ssrf/safe-url? "http://[64:ff9b::7f00:1]/foo"))))
+
+(t/deftest validate-url-blocks-6to4-encoded-private
+ ;; 2002:a00:1:: embeds 10.0.0.1; 2002:c0a8:101:: embeds 192.168.1.1
+ (t/is (false? (ssrf/safe-url? "http://[2002:a00:1::1]/foo")))
+ (t/is (false? (ssrf/safe-url? "http://[2002:c0a8:101::1]/foo"))))
+
+(t/deftest validate-url-blocks-teredo-encoded-addresses
+ ;; Teredo server prefix 2001:0000::/32
+ (t/is (false? (ssrf/safe-url?
+ "http://[2001:0000:4136:e378:8000:63bf:3fff:fdd2]/foo"))))
+
(t/deftest validate-url-blocks-encoded-loopback
;; Decimal encoding of 127.0.0.1 = 2130706433
;; InetAddress normalizes this to 127.0.0.1
diff --git a/common/deps.edn b/common/deps.edn
index 36f4b63b16..c5cb94c494 100644
--- a/common/deps.edn
+++ b/common/deps.edn
@@ -17,14 +17,14 @@
org.slf4j/slf4j-api {:mvn/version "2.0.18"}
pl.tkowalcz.tjahzi/log4j2-appender {:mvn/version "0.9.43"}
- selmer/selmer {:mvn/version "1.13.4"}
+ selmer/selmer {:mvn/version "1.13.5"}
criterium/criterium {:mvn/version "0.4.6"}
metosin/jsonista {:mvn/version "1.0.0"
:exclusions [com.fasterxml.jackson.core/jackson-core
com.fasterxml.jackson.core/jackson-databind]}
- com.fasterxml.jackson.core/jackson-core {:mvn/version "2.22.1"}
- com.fasterxml.jackson.core/jackson-databind {:mvn/version "2.22.1"}
+ com.fasterxml.jackson.core/jackson-core {:mvn/version "2.22.2"}
+ com.fasterxml.jackson.core/jackson-databind {:mvn/version "2.22.2"}
metosin/malli {:mvn/version "0.20.1"}
@@ -60,7 +60,7 @@
{:dev
{:extra-deps
{org.clojure/tools.namespace {:mvn/version "1.5.1"}
- thheller/shadow-cljs {:mvn/version "3.4.11"}
+ thheller/shadow-cljs {:mvn/version "3.5.0"}
com.clojure-goes-fast/clj-async-profiler {:mvn/version "2.0.0-beta1"}
com.bhauman/rebel-readline {:mvn/version "0.1.11"}
criterium/criterium {:mvn/version "0.4.6"}
diff --git a/common/package.json b/common/package.json
index c05a294ca5..acc9432642 100644
--- a/common/package.json
+++ b/common/package.json
@@ -4,18 +4,18 @@
"license": "MPL-2.0",
"author": "Kaleidos INC Sucursal en España SL",
"private": true,
- "packageManager": "pnpm@11.20.0+sha512.9a6f330a95b66446ea088faf1521405a8a01f07fde7124cc9958dfed52d4bb436737e65b08f85f37b46fcba375092558ac51262b816844b22f63406ed166bfee",
+ "packageManager": "pnpm@12.0.0+sha512.9e2e3dc3911995868dc94b8175c217c27e95408fa03b4a22749778f2b34f773b77cdd3b39ede8171b22fcd53be6a35342e9fac9948a68ef58df6488ce89a7e67",
"type": "module",
"repository": {
"type": "git",
"url": "https://github.com/penpot/penpot"
},
"devDependencies": {
- "concurrently": "^10.0.4",
+ "concurrently": "^10.0.5",
"nodemon": "^3.1.14",
"prettier": "3.9.6",
"source-map-support": "^0.5.21",
- "ws": "^8.21.2"
+ "ws": "^8.21.3"
},
"dependencies": {
"date-fns": "^4.4.0"
diff --git a/common/pnpm-lock.yaml b/common/pnpm-lock.yaml
index 0f0edb681d..77f173a685 100644
--- a/common/pnpm-lock.yaml
+++ b/common/pnpm-lock.yaml
@@ -1,3 +1,104 @@
+---
+lockfileVersion: '9.0'
+
+importers:
+
+ .:
+ configDependencies: {}
+ packageManagerDependencies:
+ pnpm:
+ specifier: 12.0.0
+ version: 12.0.0
+
+packages:
+
+ '@pnpm/exe.darwin-arm64@12.0.0':
+ resolution: {integrity: sha512-sqeoPfVMIfQhbwzDrKraXY2ynyuWClFqzvfImzAS/yczEru1m5SGvQ9kgFPDvQzJZ9AetedgJeDZC6qYvH8/tQ==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@pnpm/exe.darwin-x64@12.0.0':
+ resolution: {integrity: sha512-Quc3J6c9cGTy+LDgz1cLVgCNOU9IERuyAlDoEj0DCilKqvo50Jx1GV8k74iwn4J9fFSKkm8JrwNvtTDj3uWnUA==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@pnpm/exe.linux-arm64-musl@12.0.0':
+ resolution: {integrity: sha512-EVWd3OTmgsMFhXx69b5JxIzoabG9Ma7m4OeTaf0ZKBzMnfYi8u21NDQo92ToMrdYL5dYDDCHsyYIjXzk+d0HhA==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@pnpm/exe.linux-arm64@12.0.0':
+ resolution: {integrity: sha512-cXHHW8M4rAPsYNkKZO9WVcpLLK55i9EaIsZPfIqUuY2eopd5LqnFyBge54HCh1GC0yCX8ySn0hYIi+4OyAEoDg==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@pnpm/exe.linux-x64-musl@12.0.0':
+ resolution: {integrity: sha512-UcXwMdFjly0mpddkGigHKTxe27IMv2fUK4IWW/MHmJ3yMguxXmkwNlEI4aE+G1HO2TLo20uNEUWD4ymLe/DaCQ==}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@pnpm/exe.linux-x64@12.0.0':
+ resolution: {integrity: sha512-6Rsl+zEWMOmus7v7/9J3OE8EMvHyNAfxYmDfmhQG4J0985OuT3G3Ho9NSGHjkBn4aU4bgklWifRhe1HX8dUSyw==}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@pnpm/exe.win32-arm64@12.0.0':
+ resolution: {integrity: sha512-O5F76A4oVFrpDGdFxEszRIThOSBfjHdH5c006gR+7UTCfiXrukr1XfqPungUI1DXcSR5gb9jBsPQqQZOAoOOxw==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@pnpm/exe.win32-x64@12.0.0':
+ resolution: {integrity: sha512-5dKFajIEWJ1ai+KHXFJvskY6vchbunmLwSUV2ywbLymcmJjfY5XJVpgzPCyIoVCMVG0zHorr66+hM8h8b3aRfQ==}
+ cpu: [x64]
+ os: [win32]
+
+ pnpm@12.0.0:
+ resolution: {integrity: sha512-ni49w5EZlYaNyUuBdcIXwn6VQI+gO0oidJd48rNPdzt3zdOznt6BcbIvzVO+ajU0Lp+smUimjvWN9kiM6Jp+Zw==}
+ engines: {node: '>=18.*'}
+ hasBin: true
+
+snapshots:
+
+ '@pnpm/exe.darwin-arm64@12.0.0':
+ optional: true
+
+ '@pnpm/exe.darwin-x64@12.0.0':
+ optional: true
+
+ '@pnpm/exe.linux-arm64-musl@12.0.0':
+ optional: true
+
+ '@pnpm/exe.linux-arm64@12.0.0':
+ optional: true
+
+ '@pnpm/exe.linux-x64-musl@12.0.0':
+ optional: true
+
+ '@pnpm/exe.linux-x64@12.0.0':
+ optional: true
+
+ '@pnpm/exe.win32-arm64@12.0.0':
+ optional: true
+
+ '@pnpm/exe.win32-x64@12.0.0':
+ optional: true
+
+ pnpm@12.0.0:
+ optionalDependencies:
+ '@pnpm/exe.darwin-arm64': 12.0.0
+ '@pnpm/exe.darwin-x64': 12.0.0
+ '@pnpm/exe.linux-arm64': 12.0.0
+ '@pnpm/exe.linux-arm64-musl': 12.0.0
+ '@pnpm/exe.linux-x64': 12.0.0
+ '@pnpm/exe.linux-x64-musl': 12.0.0
+ '@pnpm/exe.win32-arm64': 12.0.0
+ '@pnpm/exe.win32-x64': 12.0.0
+
+---
lockfileVersion: '9.0'
settings:
@@ -13,8 +114,8 @@ importers:
version: 4.4.0
devDependencies:
concurrently:
- specifier: ^10.0.4
- version: 10.0.4
+ specifier: ^10.0.5
+ version: 10.0.5
nodemon:
specifier: ^3.1.14
version: 3.1.14
@@ -25,8 +126,8 @@ importers:
specifier: ^0.5.21
version: 0.5.21
ws:
- specifier: ^8.21.2
- version: 8.21.2
+ specifier: ^8.21.3
+ version: 8.21.3
packages:
@@ -73,8 +174,8 @@ packages:
resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==}
engines: {node: '>=20'}
- concurrently@10.0.4:
- resolution: {integrity: sha512-trZql+7l/0+WRAsAnEdctr4+iiOS6ZrViI6H8QWcCF9MFS/LT0dKpe8vluB1to6it+OxSI4VospFTIFMW8DJRw==}
+ concurrently@10.0.5:
+ resolution: {integrity: sha512-JaP/CoftUrCcAFW/g//RbgEGwlelnEae6cfBLgH6ZdO6s8jPkn6p9SB9u6pdVxYXoiSnFqseOlHfrEfF82TVOg==}
engines: {node: '>=22'}
hasBin: true
@@ -234,8 +335,8 @@ packages:
resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==}
engines: {node: '>=18'}
- ws@8.21.2:
- resolution: {integrity: sha512-54dMVAo4WIe6SKy3vBgN+9bJZqqQ8IMRevAkOLQALhi49qkkQDQfWdAZ8KQlXiEabw88ARXXdUrlvtbKQX+aKw==}
+ ws@8.21.3:
+ resolution: {integrity: sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==}
engines: {node: '>=10.0.0'}
peerDependencies:
bufferutil: ^4.0.1
@@ -303,7 +404,7 @@ snapshots:
strip-ansi: 7.2.0
wrap-ansi: 9.0.2
- concurrently@10.0.4:
+ concurrently@10.0.5:
dependencies:
chalk: 5.6.2
rxjs: 7.8.2
@@ -439,7 +540,7 @@ snapshots:
string-width: 7.2.0
strip-ansi: 7.2.0
- ws@8.21.2: {}
+ ws@8.21.3: {}
y18n@5.0.8: {}
diff --git a/docker/devenv/Dockerfile b/docker/devenv/Dockerfile
index 5a493a862f..fb9e54fb63 100644
--- a/docker/devenv/Dockerfile
+++ b/docker/devenv/Dockerfile
@@ -66,7 +66,7 @@ RUN set -ex; \
FROM base AS setup-node
-ENV NODE_VERSION=v24.19.0 \
+ENV NODE_VERSION=v24.20.0 \
PATH=/opt/node/bin:$PATH
RUN set -eux; \
diff --git a/docker/devenv/docker-compose.opencode.yml b/docker/devenv/docker-compose.opencode.yml
new file mode 100644
index 0000000000..1af29e3749
--- /dev/null
+++ b/docker/devenv/docker-compose.opencode.yml
@@ -0,0 +1,10 @@
+# Optional compose overlay, included by manage.sh's instance-compose ONLY
+# when PENPOT_OPENCODE_CONFIG_DIR is set (run-devenv --opencode-config-dir
+# DIR). Bind-mounts a host directory over the container's opencode global
+# config dir (~/.config/opencode) so personal agents/prompts/skills kept in
+# a separate repo are available inside the devenv without committing them
+# here. Without the flag this file is never referenced.
+services:
+ main:
+ volumes:
+ - "${PENPOT_OPENCODE_CONFIG_DIR}:/home/penpot/.config/opencode:z"
diff --git a/docker/images/Dockerfile.exporter b/docker/images/Dockerfile.exporter
index 97189bc5be..46fbb0041d 100644
--- a/docker/images/Dockerfile.exporter
+++ b/docker/images/Dockerfile.exporter
@@ -1,4 +1,4 @@
-FROM dhi.io/node:24.19.0-debian13-dev
+FROM dhi.io/node:24.20.0-debian13-dev
LABEL maintainer="Penpot "
ENV LANG=en_US.UTF-8 \
diff --git a/docker/images/Dockerfile.mcp b/docker/images/Dockerfile.mcp
index 8d943c7e27..bad957b07c 100644
--- a/docker/images/Dockerfile.mcp
+++ b/docker/images/Dockerfile.mcp
@@ -1,4 +1,4 @@
-FROM dhi.io/node:24.18.1-debian13-dev AS build
+FROM dhi.io/node:24.20.0-debian13-dev AS build
LABEL maintainer="Penpot "
ENV DEBIAN_FRONTEND=noninteractive
diff --git a/docker/images/Dockerfile.media-processor b/docker/images/Dockerfile.media-processor
index bc83e9e5a5..3a1c15e9ae 100644
--- a/docker/images/Dockerfile.media-processor
+++ b/docker/images/Dockerfile.media-processor
@@ -3,7 +3,7 @@ LABEL maintainer="Penpot "
ENV LANG=en_US.UTF-8 \
LC_ALL=en_US.UTF-8 \
- NODE_VERSION=v24.18.0 \
+ NODE_VERSION=v24.20.0 \
DEBIAN_FRONTEND=noninteractive \
PATH=/opt/node/bin:$PATH
diff --git a/docs/package.json b/docs/package.json
index 9af9a87dba..7d498ee015 100644
--- a/docs/package.json
+++ b/docs/package.json
@@ -29,7 +29,7 @@
"@11ty/eleventy-plugin-rss": "^3.0.0",
"@11ty/eleventy-plugin-syntaxhighlight": "^5.0.2",
"@tigersway/eleventy-plugin-ancestry": "^1.0.3",
- "@types/markdown-it": "14.1.2",
+ "@types/markdown-it": "14.2.0",
"elasticlunr": "^0.9.5",
"eleventy-plugin-metagen": "^1.8.4",
"eleventy-plugin-nesting-toc": "^1.3.0",
@@ -39,5 +39,5 @@
"markdown-it-anchor": "^9.2.1",
"markdown-it-plantuml": "^1.4.1"
},
- "packageManager": "pnpm@11.20.0+sha512.9a6f330a95b66446ea088faf1521405a8a01f07fde7124cc9958dfed52d4bb436737e65b08f85f37b46fcba375092558ac51262b816844b22f63406ed166bfee"
+ "packageManager": "pnpm@12.0.0+sha512.9e2e3dc3911995868dc94b8175c217c27e95408fa03b4a22749778f2b34f773b77cdd3b39ede8171b22fcd53be6a35342e9fac9948a68ef58df6488ce89a7e67"
}
diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml
index c557631422..5938203566 100644
--- a/docs/pnpm-lock.yaml
+++ b/docs/pnpm-lock.yaml
@@ -1,3 +1,104 @@
+---
+lockfileVersion: '9.0'
+
+importers:
+
+ .:
+ configDependencies: {}
+ packageManagerDependencies:
+ pnpm:
+ specifier: 12.0.0
+ version: 12.0.0
+
+packages:
+
+ '@pnpm/exe.darwin-arm64@12.0.0':
+ resolution: {integrity: sha512-sqeoPfVMIfQhbwzDrKraXY2ynyuWClFqzvfImzAS/yczEru1m5SGvQ9kgFPDvQzJZ9AetedgJeDZC6qYvH8/tQ==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@pnpm/exe.darwin-x64@12.0.0':
+ resolution: {integrity: sha512-Quc3J6c9cGTy+LDgz1cLVgCNOU9IERuyAlDoEj0DCilKqvo50Jx1GV8k74iwn4J9fFSKkm8JrwNvtTDj3uWnUA==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@pnpm/exe.linux-arm64-musl@12.0.0':
+ resolution: {integrity: sha512-EVWd3OTmgsMFhXx69b5JxIzoabG9Ma7m4OeTaf0ZKBzMnfYi8u21NDQo92ToMrdYL5dYDDCHsyYIjXzk+d0HhA==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@pnpm/exe.linux-arm64@12.0.0':
+ resolution: {integrity: sha512-cXHHW8M4rAPsYNkKZO9WVcpLLK55i9EaIsZPfIqUuY2eopd5LqnFyBge54HCh1GC0yCX8ySn0hYIi+4OyAEoDg==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@pnpm/exe.linux-x64-musl@12.0.0':
+ resolution: {integrity: sha512-UcXwMdFjly0mpddkGigHKTxe27IMv2fUK4IWW/MHmJ3yMguxXmkwNlEI4aE+G1HO2TLo20uNEUWD4ymLe/DaCQ==}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@pnpm/exe.linux-x64@12.0.0':
+ resolution: {integrity: sha512-6Rsl+zEWMOmus7v7/9J3OE8EMvHyNAfxYmDfmhQG4J0985OuT3G3Ho9NSGHjkBn4aU4bgklWifRhe1HX8dUSyw==}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@pnpm/exe.win32-arm64@12.0.0':
+ resolution: {integrity: sha512-O5F76A4oVFrpDGdFxEszRIThOSBfjHdH5c006gR+7UTCfiXrukr1XfqPungUI1DXcSR5gb9jBsPQqQZOAoOOxw==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@pnpm/exe.win32-x64@12.0.0':
+ resolution: {integrity: sha512-5dKFajIEWJ1ai+KHXFJvskY6vchbunmLwSUV2ywbLymcmJjfY5XJVpgzPCyIoVCMVG0zHorr66+hM8h8b3aRfQ==}
+ cpu: [x64]
+ os: [win32]
+
+ pnpm@12.0.0:
+ resolution: {integrity: sha512-ni49w5EZlYaNyUuBdcIXwn6VQI+gO0oidJd48rNPdzt3zdOznt6BcbIvzVO+ajU0Lp+smUimjvWN9kiM6Jp+Zw==}
+ engines: {node: '>=18.*'}
+ hasBin: true
+
+snapshots:
+
+ '@pnpm/exe.darwin-arm64@12.0.0':
+ optional: true
+
+ '@pnpm/exe.darwin-x64@12.0.0':
+ optional: true
+
+ '@pnpm/exe.linux-arm64-musl@12.0.0':
+ optional: true
+
+ '@pnpm/exe.linux-arm64@12.0.0':
+ optional: true
+
+ '@pnpm/exe.linux-x64-musl@12.0.0':
+ optional: true
+
+ '@pnpm/exe.linux-x64@12.0.0':
+ optional: true
+
+ '@pnpm/exe.win32-arm64@12.0.0':
+ optional: true
+
+ '@pnpm/exe.win32-x64@12.0.0':
+ optional: true
+
+ pnpm@12.0.0:
+ optionalDependencies:
+ '@pnpm/exe.darwin-arm64': 12.0.0
+ '@pnpm/exe.darwin-x64': 12.0.0
+ '@pnpm/exe.linux-arm64': 12.0.0
+ '@pnpm/exe.linux-arm64-musl': 12.0.0
+ '@pnpm/exe.linux-x64': 12.0.0
+ '@pnpm/exe.linux-x64-musl': 12.0.0
+ '@pnpm/exe.win32-arm64': 12.0.0
+ '@pnpm/exe.win32-x64': 12.0.0
+
+---
lockfileVersion: '9.0'
settings:
@@ -24,8 +125,8 @@ importers:
specifier: ^1.0.3
version: 1.0.3(@11ty/eleventy@3.1.6)
'@types/markdown-it':
- specifier: 14.1.2
- version: 14.1.2
+ specifier: 14.2.0
+ version: 14.2.0
elasticlunr:
specifier: ^0.9.5
version: 0.9.5
@@ -46,7 +147,7 @@ importers:
version: 15.0.0
markdown-it-anchor:
specifier: ^9.2.1
- version: 9.2.1(@types/markdown-it@14.1.2)(markdown-it@15.0.0)
+ version: 9.2.1(@types/markdown-it@14.2.0)(markdown-it@15.0.0)
markdown-it-plantuml:
specifier: ^1.4.1
version: 1.4.1
@@ -64,8 +165,8 @@ packages:
engines: {node: '>=18'}
hasBin: true
- '@11ty/eleventy-fetch@5.1.2':
- resolution: {integrity: sha512-YxDARdR3S9UT4gOGRWgGNyokYT9jkCAjJge3OVKFdNMv1cyvWg1NHCvj9NVvK9XHenCLFy3cwvM/YYpZZTZopw==}
+ '@11ty/eleventy-fetch@5.1.3':
+ resolution: {integrity: sha512-4HS6QB/mVWTVlE6kjCKPkjkC1Z0YOqizJaHR05zK+E7a2b4EUC3T+wLktIy7wEl76ZoarkY45EKLmTw1XuR8fQ==}
engines: {node: '>=18'}
'@11ty/eleventy-navigation@1.0.5':
@@ -102,8 +203,8 @@ packages:
resolution: {integrity: sha512-oI7m8pa7/IAU/3lqRU9vjBbs20iKFo7x+1K9kT3aVira6scc1X9MjBdgLCHzLJeJ7iB6wydioA+kr9/qPnvmlQ==}
engines: {node: '>=18'}
- '@rgrove/parse-xml@4.2.0':
- resolution: {integrity: sha512-UuBOt7BOsKVOkFXRe4Ypd/lADuNIfqJXv8GvHqtXaTYXPPKkj2nS2zPllVsrtRjcomDhIJVBnZwfmlI222WH8g==}
+ '@rgrove/parse-xml@4.2.3':
+ resolution: {integrity: sha512-Jhlb+0zYez1T1yXUQs3F1qAtFuJljBVNdy9TKmLDauAXkxsOXopKYOyQ5Wm6SvP3fycav0GviX4Y15WWhGetMw==}
engines: {node: '>=14.0.0'}
'@sindresorhus/slugify@2.2.1':
@@ -122,8 +223,8 @@ packages:
'@types/linkify-it@5.0.0':
resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==}
- '@types/markdown-it@14.1.2':
- resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==}
+ '@types/markdown-it@14.2.0':
+ resolution: {integrity: sha512-NoQ2yGlLWj4wpxMs+TYmRKk3thDrQ97agr7sFqfLsAlvoS8SNQuTrlObhFqG9iugdTtgOE9jpJ6FNM4ZGsa5xQ==}
'@types/mdurl@2.0.0':
resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==}
@@ -135,8 +236,8 @@ packages:
resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==}
engines: {node: '>=0.4.0'}
- acorn@8.17.0:
- resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==}
+ acorn@8.18.0:
+ resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==}
engines: {node: '>=0.4.0'}
hasBin: true
@@ -150,8 +251,8 @@ packages:
argparse@2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
- argparse@3.0.0:
- resolution: {integrity: sha512-BOp5NMrHqKxmq/OLr+clzzrRxgOKSLkcjmkWuChp7Irqwn4s74WjOBPIgWfA/HMcBnVkZ5XEuf9uUqzlpfCQ6A==}
+ argparse@3.0.1:
+ resolution: {integrity: sha512-nM4mHF/KM1v59ZNKX7zfusQz5wUAxR511YG8Vo6TyiV4aqhu++rbJW4v04xsWhpSsHFj66flT8P7znVpyO20xQ==}
asap@2.0.6:
resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==}
@@ -165,8 +266,8 @@ packages:
bcp-47-normalize@2.3.0:
resolution: {integrity: sha512-8I/wfzqQvttUFz7HVJgIZ7+dj3vUaIyIxYXaTRP1YWoSDfzt6TUmxaKZeuXR62qBmYr+nvuWINFRl6pZ5DlN4Q==}
- bcp-47@2.1.0:
- resolution: {integrity: sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==}
+ bcp-47@2.1.1:
+ resolution: {integrity: sha512-KLw+H/gd2p4zly1X7Yh/qziuyae5/w/QFnvTng9eZL5fvszL7Whl3MBoWF8yxL7ksUjBfOD+OxkytiqbBpG+Fw==}
binary-extensions@2.3.0:
resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
@@ -363,8 +464,8 @@ packages:
resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==}
engines: {node: '>= 0.8'}
- flatted@3.4.2:
- resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==}
+ flatted@3.4.4:
+ resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==}
fresh@2.0.0:
resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==}
@@ -439,12 +540,12 @@ packages:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'}
- iso-639-1@3.1.5:
- resolution: {integrity: sha512-gXkz5+KN7HrG0Q5UGqSMO2qB9AsbEeyLP54kF1YrMsIxmu+g4BdB7rflReZTSTZGpfj8wywu6pfPBCylPIzGQA==}
+ iso-639-1@3.1.6:
+ resolution: {integrity: sha512-ZFar/L4ngX7wZh2QX+Fiftmuf0igWJsrJtfizrovWifF1gAWkfmRa5Z1m0LQZbm0hKCHRDYhLRSLFrSqNe4EJA==}
engines: {node: '>=6.0'}
- js-yaml@3.15.0:
- resolution: {integrity: sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog==}
+ js-yaml@3.15.1:
+ resolution: {integrity: sha512-S99WuO3HlhO3XN41EtYUNl9zzXjoJx7QvmipxsJVxtCBT0YHEFy+iOJhjSvrmV12nYhWpZaM8lPHkJm0yUMbag==}
hasBin: true
js-yaml@4.3.1:
@@ -469,8 +570,8 @@ packages:
linkify-it@6.1.0:
resolution: {integrity: sha512-wJ/TwpSDTLepCrQoYWYIExIKg5Zchex2Nn5yk2mFnB+6PtdkHtyLx742md9csRjjOnGkKIS/RrbY7l8D6gT9Vw==}
- liquidjs@10.28.0:
- resolution: {integrity: sha512-b6tmBXYMQTuGPnM5vB0CuZMo5kvmKMtSB/gvUWP6RFn2pIB5s+bJkBfIyJnattkc5bgeAiflrZVptx3iaLLioQ==}
+ liquidjs@10.29.0:
+ resolution: {integrity: sha512-pCVOhs6FLAR8su3ItJ07diN26t6W5dHQRnmTMy8HPyTFuv1+oSCVJIGp5pGjfQyOZfh50KswvKtMTp6p4JEIdw==}
engines: {node: '>=16'}
hasBin: true
@@ -598,8 +699,8 @@ packages:
resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==}
engines: {node: '>=8.6'}
- picomatch@4.0.4:
- resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==}
+ picomatch@4.0.7:
+ resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==}
engines: {node: '>=12'}
please-upgrade-node@3.2.0:
@@ -634,8 +735,8 @@ packages:
resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==}
engines: {node: '>=6'}
- range-parser@1.2.1:
- resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
+ range-parser@1.3.0:
+ resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==}
engines: {node: '>= 0.6'}
readdirp@3.6.0:
@@ -652,8 +753,8 @@ packages:
semver-compare@1.0.0:
resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==}
- semver@7.8.4:
- resolution: {integrity: sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==}
+ semver@7.8.5:
+ resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==}
engines: {node: '>=10'}
hasBin: true
@@ -729,8 +830,8 @@ packages:
resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==}
engines: {node: '>=18'}
- ws@8.21.0:
- resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==}
+ ws@8.21.3:
+ resolution: {integrity: sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==}
engines: {node: '>=10.0.0'}
peerDependencies:
bufferutil: ^4.0.1
@@ -746,7 +847,7 @@ snapshots:
'@11ty/dependency-tree-esm@2.0.4':
dependencies:
'@11ty/eleventy-utils': 2.0.7
- acorn: 8.17.0
+ acorn: 8.18.0
dependency-graph: 1.0.0
normalize-path: 3.0.0
@@ -767,18 +868,18 @@ snapshots:
send: 1.2.1
ssri: 11.0.0
urlpattern-polyfill: 10.1.0
- ws: 8.21.0
+ ws: 8.21.3
transitivePeerDependencies:
- bufferutil
- supports-color
- utf-8-validate
- '@11ty/eleventy-fetch@5.1.2':
+ '@11ty/eleventy-fetch@5.1.3':
dependencies:
'@11ty/eleventy-utils': 2.0.7
- '@rgrove/parse-xml': 4.2.0
+ '@rgrove/parse-xml': 4.2.3
debug: 4.4.3
- flatted: 3.4.2
+ flatted: 3.4.4
p-queue: 6.6.2
transitivePeerDependencies:
- supports-color
@@ -829,21 +930,21 @@ snapshots:
entities: 6.0.1
filesize: 10.1.6
gray-matter: 4.0.3
- iso-639-1: 3.1.5
+ iso-639-1: 3.1.6
js-yaml: 4.3.1
kleur: 4.1.5
- liquidjs: 10.28.0
+ liquidjs: 10.29.0
luxon: 3.7.2
markdown-it: 14.3.0
minimist: 1.2.8
moo: 0.5.2
node-retrieve-globals: 6.0.1
nunjucks: 3.2.4(chokidar@3.6.0)
- picomatch: 4.0.4
+ picomatch: 4.0.7
please-upgrade-node: 3.2.0
posthtml: 0.16.7
posthtml-match-helper: 2.0.3(posthtml@0.16.7)
- semver: 7.8.4
+ semver: 7.8.5
slugify: 1.6.9
tinyglobby: 0.2.17
transitivePeerDependencies:
@@ -867,7 +968,7 @@ snapshots:
minimatch: 3.1.5
slash: 3.0.0
- '@rgrove/parse-xml@4.2.0': {}
+ '@rgrove/parse-xml@4.2.3': {}
'@sindresorhus/slugify@2.2.1':
dependencies:
@@ -884,7 +985,7 @@ snapshots:
'@types/linkify-it@5.0.0': {}
- '@types/markdown-it@14.1.2':
+ '@types/markdown-it@14.2.0':
dependencies:
'@types/linkify-it': 5.0.0
'@types/mdurl': 2.0.0
@@ -895,9 +996,9 @@ snapshots:
acorn-walk@8.3.5:
dependencies:
- acorn: 8.17.0
+ acorn: 8.18.0
- acorn@8.17.0: {}
+ acorn@8.18.0: {}
anymatch@3.1.3:
dependencies:
@@ -910,7 +1011,7 @@ snapshots:
argparse@2.0.1: {}
- argparse@3.0.0: {}
+ argparse@3.0.1: {}
asap@2.0.6: {}
@@ -920,10 +1021,10 @@ snapshots:
bcp-47-normalize@2.3.0:
dependencies:
- bcp-47: 2.1.0
+ bcp-47: 2.1.1
bcp-47-match: 2.0.3
- bcp-47@2.1.0:
+ bcp-47@2.1.1:
dependencies:
is-alphabetical: 2.0.1
is-alphanumerical: 2.0.1
@@ -1060,7 +1161,7 @@ snapshots:
eleventy-plugin-youtube-embed@1.13.2:
dependencies:
- '@11ty/eleventy-fetch': 5.1.2
+ '@11ty/eleventy-fetch': 5.1.3
deepmerge: 4.3.1
lite-youtube-embed: 0.3.4
string-replace-async: 3.0.2
@@ -1096,7 +1197,7 @@ snapshots:
esm-import-transformer@3.0.5:
dependencies:
- acorn: 8.17.0
+ acorn: 8.18.0
esprima@4.0.1: {}
@@ -1110,9 +1211,9 @@ snapshots:
dependencies:
is-extendable: 0.1.1
- fdir@6.5.0(picomatch@4.0.4):
+ fdir@6.5.0(picomatch@4.0.7):
optionalDependencies:
- picomatch: 4.0.4
+ picomatch: 4.0.7
filesize@10.1.6: {}
@@ -1132,7 +1233,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- flatted@3.4.2: {}
+ flatted@3.4.4: {}
fresh@2.0.0: {}
@@ -1147,7 +1248,7 @@ snapshots:
gray-matter@4.0.3:
dependencies:
- js-yaml: 3.15.0
+ js-yaml: 3.15.1
kind-of: 6.0.3
section-matter: 1.0.0
strip-bom-string: 1.0.0
@@ -1207,9 +1308,9 @@ snapshots:
is-number@7.0.0: {}
- iso-639-1@3.1.5: {}
+ iso-639-1@3.1.6: {}
- js-yaml@3.15.0:
+ js-yaml@3.15.1:
dependencies:
argparse: 1.0.10
esprima: 4.0.1
@@ -1232,7 +1333,7 @@ snapshots:
dependencies:
uc.micro: 3.0.0
- liquidjs@10.28.0:
+ liquidjs@10.29.0:
dependencies:
commander: 10.0.1
@@ -1242,9 +1343,9 @@ snapshots:
luxon@3.7.2: {}
- markdown-it-anchor@9.2.1(@types/markdown-it@14.1.2)(markdown-it@15.0.0):
+ markdown-it-anchor@9.2.1(@types/markdown-it@14.2.0)(markdown-it@15.0.0):
dependencies:
- '@types/markdown-it': 14.1.2
+ '@types/markdown-it': 14.2.0
markdown-it: 15.0.0
markdown-it-plantuml@1.4.1: {}
@@ -1260,7 +1361,7 @@ snapshots:
markdown-it@15.0.0:
dependencies:
- argparse: 3.0.0
+ argparse: 3.0.1
entities: 8.0.0
linkify-it: 6.1.0
mdurl: 2.1.0
@@ -1299,7 +1400,7 @@ snapshots:
node-retrieve-globals@6.0.1:
dependencies:
- acorn: 8.17.0
+ acorn: 8.18.0
acorn-walk: 8.3.5
esm-import-transformer: 3.0.5
@@ -1351,7 +1452,7 @@ snapshots:
picomatch@2.3.2: {}
- picomatch@4.0.4: {}
+ picomatch@4.0.7: {}
please-upgrade-node@3.2.0:
dependencies:
@@ -1380,7 +1481,7 @@ snapshots:
punycode.js@2.3.1: {}
- range-parser@1.2.1: {}
+ range-parser@1.3.0: {}
readdirp@3.6.0:
dependencies:
@@ -1395,7 +1496,7 @@ snapshots:
semver-compare@1.0.0: {}
- semver@7.8.4: {}
+ semver@7.8.5: {}
send@1.2.1:
dependencies:
@@ -1408,7 +1509,7 @@ snapshots:
mime-types: 3.0.2
ms: 2.1.3
on-finished: 2.4.1
- range-parser: 1.2.1
+ range-parser: 1.3.0
statuses: 2.0.2
transitivePeerDependencies:
- supports-color
@@ -1433,8 +1534,8 @@ snapshots:
tinyglobby@0.2.17:
dependencies:
- fdir: 6.5.0(picomatch@4.0.4)
- picomatch: 4.0.4
+ fdir: 6.5.0(picomatch@4.0.7)
+ picomatch: 4.0.7
to-regex-range@5.0.1:
dependencies:
@@ -1458,4 +1559,4 @@ snapshots:
whatwg-mimetype@4.0.0: {}
- ws@8.21.0: {}
+ ws@8.21.3: {}
diff --git a/docs/technical-guide/developer/agentic-devenv.md b/docs/technical-guide/developer/agentic-devenv.md
index 55b03c1492..932f555d6f 100644
--- a/docs/technical-guide/developer/agentic-devenv.md
+++ b/docs/technical-guide/developer/agentic-devenv.md
@@ -148,10 +148,15 @@ automatically, so regular users never run this.
```bash
./manage.sh run-devenv --agentic \
[--ws N] [--sync] [--serena-context CTX] \
+ [--opencode-config-dir DIR] \
[--git-user-name NAME] [--git-user-email EMAIL]
```
Brings one agentic instance up. Errors out if the target is already running.
+`--opencode-config-dir DIR` bind-mounts DIR over the container's
+`~/.config/opencode` so personal agents/prompts/skills kept in a separate
+repository are available to the coding agent; see the
+[Dev environment guide](./devenv.md#personal-opencode-config-inside-the-container).
`--ws N` (N ≥ 1) brings that workspace up independently — workspaces can be
started and stopped in any order. Per-instance ports
diff --git a/docs/technical-guide/developer/devenv.md b/docs/technical-guide/developer/devenv.md
index bbecd6bb39..b5496abe2f 100644
--- a/docs/technical-guide/developer/devenv.md
+++ b/docs/technical-guide/developer/devenv.md
@@ -139,6 +139,27 @@ until you set an identity. The values are applied every time
`run-devenv` brings an instance up (idempotent), so re-running
with different flags is the way to change the in-container identity.
+### Personal opencode config inside the container
+
+`run-devenv --opencode-config-dir DIR` bind-mounts a host directory over the
+container's `~/.config/opencode` (opencode's global config dir). This is how
+you keep personal agents, prompts, and skills in a separate repository and
+use them inside the devenv without committing them here or leaving untracked
+files in the repo:
+
+```bash
+./manage.sh run-devenv --agentic --opencode-config-dir ../penpot-opencode
+```
+
+The path must be an existing directory; `~` is expanded and the value is
+resolved to an absolute path automatically. The mount is applied at container
+creation, so changing it requires stopping and re-running `run-devenv` for
+that instance, and it applies only to instances brought up with the flag —
+other workspaces mount nothing. The directory is shared read-write with the
+container (same UID mapping as the source tree). Opencode's own state
+(sessions, `auth.json`) lives in `~/.local/share/opencode`, which stays in
+the container's data volume regardless of this flag.
+
### Shared state and workers
All instances share one Penpot database and one MinIO bucket; users, teams,
diff --git a/exporter/deps.edn b/exporter/deps.edn
index 9495142719..4d8391f6de 100644
--- a/exporter/deps.edn
+++ b/exporter/deps.edn
@@ -14,7 +14,7 @@
:dev
{:extra-deps
- {thheller/shadow-cljs {:mvn/version "3.4.11"}}}
+ {thheller/shadow-cljs {:mvn/version "3.5.0"}}}
:shadow-cljs
{:main-opts ["-m" "shadow.cljs.devtools.cli"]
diff --git a/exporter/package.json b/exporter/package.json
index 6174fe4257..d17104e0b5 100644
--- a/exporter/package.json
+++ b/exporter/package.json
@@ -4,7 +4,7 @@
"license": "MPL-2.0",
"author": "Kaleidos INC Sucursal en España SL",
"private": true,
- "packageManager": "pnpm@11.20.0+sha512.9a6f330a95b66446ea088faf1521405a8a01f07fde7124cc9958dfed52d4bb436737e65b08f85f37b46fcba375092558ac51262b816844b22f63406ed166bfee",
+ "packageManager": "pnpm@12.0.0+sha512.9e2e3dc3911995868dc94b8175c217c27e95408fa03b4a22749778f2b34f773b77cdd3b39ede8171b22fcd53be6a35342e9fac9948a68ef58df6488ce89a7e67",
"repository": {
"type": "git",
"url": "https://github.com/penpot/penpot"
@@ -21,12 +21,12 @@
"playwright": "1.62.1",
"raw-body": "^4.0.0",
"source-map-support": "^0.5.21",
- "undici": "^8.9.0",
+ "undici": "^8.10.0",
"xml-js": "^1.6.11",
"xregexp": "^5.1.2"
},
"devDependencies": {
- "ws": "^8.21.1"
+ "ws": "^8.21.3"
},
"scripts": {
"clear:shadow-cache": "rm -rf .shadow-cljs && rm -rf target",
diff --git a/exporter/pnpm-lock.yaml b/exporter/pnpm-lock.yaml
index 3764b5fb63..02f1974302 100644
--- a/exporter/pnpm-lock.yaml
+++ b/exporter/pnpm-lock.yaml
@@ -1,3 +1,104 @@
+---
+lockfileVersion: '9.0'
+
+importers:
+
+ .:
+ configDependencies: {}
+ packageManagerDependencies:
+ pnpm:
+ specifier: 12.0.0
+ version: 12.0.0
+
+packages:
+
+ '@pnpm/exe.darwin-arm64@12.0.0':
+ resolution: {integrity: sha512-sqeoPfVMIfQhbwzDrKraXY2ynyuWClFqzvfImzAS/yczEru1m5SGvQ9kgFPDvQzJZ9AetedgJeDZC6qYvH8/tQ==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@pnpm/exe.darwin-x64@12.0.0':
+ resolution: {integrity: sha512-Quc3J6c9cGTy+LDgz1cLVgCNOU9IERuyAlDoEj0DCilKqvo50Jx1GV8k74iwn4J9fFSKkm8JrwNvtTDj3uWnUA==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@pnpm/exe.linux-arm64-musl@12.0.0':
+ resolution: {integrity: sha512-EVWd3OTmgsMFhXx69b5JxIzoabG9Ma7m4OeTaf0ZKBzMnfYi8u21NDQo92ToMrdYL5dYDDCHsyYIjXzk+d0HhA==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@pnpm/exe.linux-arm64@12.0.0':
+ resolution: {integrity: sha512-cXHHW8M4rAPsYNkKZO9WVcpLLK55i9EaIsZPfIqUuY2eopd5LqnFyBge54HCh1GC0yCX8ySn0hYIi+4OyAEoDg==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@pnpm/exe.linux-x64-musl@12.0.0':
+ resolution: {integrity: sha512-UcXwMdFjly0mpddkGigHKTxe27IMv2fUK4IWW/MHmJ3yMguxXmkwNlEI4aE+G1HO2TLo20uNEUWD4ymLe/DaCQ==}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@pnpm/exe.linux-x64@12.0.0':
+ resolution: {integrity: sha512-6Rsl+zEWMOmus7v7/9J3OE8EMvHyNAfxYmDfmhQG4J0985OuT3G3Ho9NSGHjkBn4aU4bgklWifRhe1HX8dUSyw==}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@pnpm/exe.win32-arm64@12.0.0':
+ resolution: {integrity: sha512-O5F76A4oVFrpDGdFxEszRIThOSBfjHdH5c006gR+7UTCfiXrukr1XfqPungUI1DXcSR5gb9jBsPQqQZOAoOOxw==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@pnpm/exe.win32-x64@12.0.0':
+ resolution: {integrity: sha512-5dKFajIEWJ1ai+KHXFJvskY6vchbunmLwSUV2ywbLymcmJjfY5XJVpgzPCyIoVCMVG0zHorr66+hM8h8b3aRfQ==}
+ cpu: [x64]
+ os: [win32]
+
+ pnpm@12.0.0:
+ resolution: {integrity: sha512-ni49w5EZlYaNyUuBdcIXwn6VQI+gO0oidJd48rNPdzt3zdOznt6BcbIvzVO+ajU0Lp+smUimjvWN9kiM6Jp+Zw==}
+ engines: {node: '>=18.*'}
+ hasBin: true
+
+snapshots:
+
+ '@pnpm/exe.darwin-arm64@12.0.0':
+ optional: true
+
+ '@pnpm/exe.darwin-x64@12.0.0':
+ optional: true
+
+ '@pnpm/exe.linux-arm64-musl@12.0.0':
+ optional: true
+
+ '@pnpm/exe.linux-arm64@12.0.0':
+ optional: true
+
+ '@pnpm/exe.linux-x64-musl@12.0.0':
+ optional: true
+
+ '@pnpm/exe.linux-x64@12.0.0':
+ optional: true
+
+ '@pnpm/exe.win32-arm64@12.0.0':
+ optional: true
+
+ '@pnpm/exe.win32-x64@12.0.0':
+ optional: true
+
+ pnpm@12.0.0:
+ optionalDependencies:
+ '@pnpm/exe.darwin-arm64': 12.0.0
+ '@pnpm/exe.darwin-x64': 12.0.0
+ '@pnpm/exe.linux-arm64': 12.0.0
+ '@pnpm/exe.linux-arm64-musl': 12.0.0
+ '@pnpm/exe.linux-x64': 12.0.0
+ '@pnpm/exe.linux-x64-musl': 12.0.0
+ '@pnpm/exe.win32-arm64': 12.0.0
+ '@pnpm/exe.win32-x64': 12.0.0
+
+---
lockfileVersion: '9.0'
settings:
@@ -45,8 +146,8 @@ importers:
specifier: ^0.5.21
version: 0.5.21
undici:
- specifier: ^8.9.0
- version: 8.9.0
+ specifier: ^8.10.0
+ version: 8.10.0
xml-js:
specifier: ^1.6.11
version: 1.6.11
@@ -55,8 +156,8 @@ importers:
version: 5.1.2
devDependencies:
ws:
- specifier: ^8.21.1
- version: 8.21.1
+ specifier: ^8.21.3
+ version: 8.21.3
packages:
@@ -420,15 +521,15 @@ packages:
resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==}
engines: {node: '>=0.6.x'}
- undici@8.9.0:
- resolution: {integrity: sha512-aWZpUj7XoGonMClx4gdDRfgBjqeA+F473aDmROQQbM9n6PRfK/u1q/a0X4wMTgcHfT8H6fpbt98PFuDUwFg2YA==}
+ undici@8.10.0:
+ resolution: {integrity: sha512-HvltHd7avK13QIw/oLe4qoOLyoVSoafqJ2jYOrtMRBkbYT31eiBQ8O0ehRKZiEZCMEyLFQNIADpgCWC5fALvYQ==}
engines: {node: '>=22.19.0'}
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
- ws@8.21.1:
- resolution: {integrity: sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==}
+ ws@8.21.3:
+ resolution: {integrity: sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==}
engines: {node: '>=10.0.0'}
peerDependencies:
bufferutil: ^4.0.1
@@ -802,11 +903,11 @@ snapshots:
tsscmp@1.0.6: {}
- undici@8.9.0: {}
+ undici@8.10.0: {}
util-deprecate@1.0.2: {}
- ws@8.21.1: {}
+ ws@8.21.3: {}
xml-js@1.6.11:
dependencies:
diff --git a/frontend/deps.edn b/frontend/deps.edn
index 5c749f4c80..789020ef56 100644
--- a/frontend/deps.edn
+++ b/frontend/deps.edn
@@ -4,7 +4,7 @@
penpot/common
{:local/root "../common"}
- org.clojure/clojure {:mvn/version "1.12.2"}
+ org.clojure/clojure {:mvn/version "1.12.5"}
binaryage/devtools {:mvn/version "RELEASE"}
metosin/reitit-core {:mvn/version "0.10.1"}
funcool/okulary {:mvn/version "2022.04.11-16"}
@@ -51,7 +51,7 @@
"--enable-native-access=ALL-UNNAMED"]
:extra-deps
- {thheller/shadow-cljs {:mvn/version "3.4.11"}
+ {thheller/shadow-cljs {:mvn/version "3.5.0"}
com.bhauman/rebel-readline {:mvn/version "RELEASE"}
org.clojure/tools.namespace {:mvn/version "RELEASE"}
criterium/criterium {:mvn/version "0.4.6"}}}
diff --git a/frontend/package.json b/frontend/package.json
index 2a257ef13d..c319bcab55 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -4,7 +4,7 @@
"license": "MPL-2.0",
"author": "Kaleidos INC Sucursal en España SL",
"private": true,
- "packageManager": "pnpm@11.20.0+sha512.9a6f330a95b66446ea088faf1521405a8a01f07fde7124cc9958dfed52d4bb436737e65b08f85f37b46fcba375092558ac51262b816844b22f63406ed166bfee",
+ "packageManager": "pnpm@12.0.0+sha512.9e2e3dc3911995868dc94b8175c217c27e95408fa03b4a22749778f2b34f773b77cdd3b39ede8171b22fcd53be6a35342e9fac9948a68ef58df6488ce89a7e67",
"browserslist": [
"defaults"
],
@@ -59,33 +59,33 @@
"@penpot/tokenscript": "link:packages/tokenscript",
"@penpot/ua-parser": "penpot/ua-parser#1.0.0",
"@playwright/test": "1.62.1",
- "@storybook/addon-docs": "10.5.6",
- "@storybook/addon-themes": "10.5.6",
- "@storybook/addon-vitest": "10.5.6",
- "@storybook/react-vite": "10.5.6",
+ "@storybook/addon-docs": "10.5.10",
+ "@storybook/addon-themes": "10.5.10",
+ "@storybook/addon-vitest": "10.5.10",
+ "@storybook/react-vite": "10.5.10",
"@tokens-studio/sd-transforms": "2.0.3",
- "@types/node": "^26.1.2",
- "@vitest/browser": "4.1.10",
- "@vitest/browser-playwright": "4.1.10",
- "@vitest/coverage-v8": "4.1.10",
+ "@types/node": "^26.4.0",
+ "@vitest/browser": "4.1.11",
+ "@vitest/browser-playwright": "4.1.11",
+ "@vitest/coverage-v8": "4.1.11",
"@zip.js/zip.js": "2.8.34",
"autoprefixer": "^10.5.4",
"compression": "^1.8.1",
- "concurrently": "^10.0.4",
+ "concurrently": "^10.0.5",
"date-fns": "^4.4.0",
- "esbuild": "^0.28.1",
- "eventsource-parser": "^3.1.0",
+ "esbuild": "^0.28.2",
+ "eventsource-parser": "^4.1.0",
"express": "^5.1.0",
"fancy-log": "^2.0.0",
"getopts": "^2.3.0",
"gettext-parser": "^9.1.1",
- "highlight.js": "^11.10.0",
+ "highlight.js": "^11.12.0",
"js-beautify": "^2.0.3",
"jsdom": "^30.0.1",
"lodash": "^4.18.1",
"lodash.debounce": "^4.0.8",
"map-stream": "0.0.7",
- "marked": "^18.0.9",
+ "marked": "^18.0.11",
"mkdirp": "^3.0.1",
"mustache": "^4.2.0",
"nodemon": "^3.1.14",
@@ -93,7 +93,7 @@
"opentype.js": "^2.0.0",
"p-limit": "^7.3.1",
"playwright": "1.62.1",
- "postcss": "^8.5.25",
+ "postcss": "^8.5.26",
"postcss-clean": "^1.2.2",
"postcss-modules": "^9.0.1",
"postcss-scss": "^4.0.9",
@@ -103,27 +103,27 @@
"randomcolor": "^0.6.2",
"react": "19.2.8",
"react-dom": "19.2.8",
- "react-error-boundary": "^6.1.2",
+ "react-error-boundary": "^6.1.3",
"react-virtualized": "^9.22.6",
"rimraf": "^6.1.3",
"rxjs": "8.0.0-alpha.14",
- "sass": "^1.102.0",
- "sass-embedded": "^1.100.0",
+ "sass": "^1.103.1",
+ "sass-embedded": "^1.103.1",
"sax": "^1.6.1",
"scheduler": "^0.27.0",
"source-map-support": "^0.5.21",
- "storybook": "10.5.6",
- "style-dictionary": "5.5.0",
+ "storybook": "10.5.10",
+ "style-dictionary": "5.5.2",
"stylelint": "^17.14.1",
"stylelint-config-standard-scss": "^17.0.0",
"stylelint-plugin-logical-css": "^2.1.0",
"stylelint-scss": "^7.2.0",
"svg-sprite": "^2.0.4",
- "tdigest": "^0.1.2",
+ "tdigest": "^0.1.3",
"tinycolor2": "^1.6.0",
"typescript": "^6.0.2",
- "vite": "^8.2.0",
- "vitest": "^4.1.10",
+ "vite": "^8.2.2",
+ "vitest": "^4.1.11",
"wait-on": "^9.1.0",
"watcher": "^2.3.1",
"workerpool": "^10.0.3",
diff --git a/frontend/packages/draft-js/package.json b/frontend/packages/draft-js/package.json
index e2955437f2..682dfeb8d0 100644
--- a/frontend/packages/draft-js/package.json
+++ b/frontend/packages/draft-js/package.json
@@ -4,7 +4,7 @@
"description": "Penpot Draft-JS Wrapper",
"main": "index.js",
"type": "module",
- "packageManager": "pnpm@11.20.0+sha512.9a6f330a95b66446ea088faf1521405a8a01f07fde7124cc9958dfed52d4bb436737e65b08f85f37b46fcba375092558ac51262b816844b22f63406ed166bfee",
+ "packageManager": "pnpm@12.0.0+sha512.9e2e3dc3911995868dc94b8175c217c27e95408fa03b4a22749778f2b34f773b77cdd3b39ede8171b22fcd53be6a35342e9fac9948a68ef58df6488ce89a7e67",
"author": "Andrey Antukh",
"license": "MPL-2.0",
"dependencies": {
diff --git a/frontend/packages/mousetrap/package.json b/frontend/packages/mousetrap/package.json
index 56b3d9abc2..ece42204ef 100644
--- a/frontend/packages/mousetrap/package.json
+++ b/frontend/packages/mousetrap/package.json
@@ -4,7 +4,7 @@
"description": "Simple library for handling keyboard shortcuts",
"main": "index.js",
"type": "module",
- "packageManager": "pnpm@11.20.0+sha512.9a6f330a95b66446ea088faf1521405a8a01f07fde7124cc9958dfed52d4bb436737e65b08f85f37b46fcba375092558ac51262b816844b22f63406ed166bfee",
+ "packageManager": "pnpm@12.0.0+sha512.9e2e3dc3911995868dc94b8175c217c27e95408fa03b4a22749778f2b34f773b77cdd3b39ede8171b22fcd53be6a35342e9fac9948a68ef58df6488ce89a7e67",
"author": "Craig Campbell",
"license": "Apache-2.0 WITH LLVM-exception"
}
diff --git a/frontend/packages/tokenscript/package.json b/frontend/packages/tokenscript/package.json
index c00cc0082a..4689f02e86 100644
--- a/frontend/packages/tokenscript/package.json
+++ b/frontend/packages/tokenscript/package.json
@@ -4,7 +4,7 @@
"description": "",
"main": "index.js",
"type": "module",
- "packageManager": "pnpm@11.20.0+sha512.9a6f330a95b66446ea088faf1521405a8a01f07fde7124cc9958dfed52d4bb436737e65b08f85f37b46fcba375092558ac51262b816844b22f63406ed166bfee",
+ "packageManager": "pnpm@12.0.0+sha512.9e2e3dc3911995868dc94b8175c217c27e95408fa03b4a22749778f2b34f773b77cdd3b39ede8171b22fcd53be6a35342e9fac9948a68ef58df6488ce89a7e67",
"author": "Andrey Antukh",
"license": "MPL-2.0",
"dependencies": {
diff --git a/frontend/packages/ui/package.json b/frontend/packages/ui/package.json
index 9fe6715c77..131a0e6d85 100644
--- a/frontend/packages/ui/package.json
+++ b/frontend/packages/ui/package.json
@@ -20,20 +20,20 @@
"devDependencies": {
"@babel/core": "^8.0.1",
"@babel/preset-react": "^8.0.1",
- "@storybook/react": "10.5.6",
- "@storybook/react-vite": "10.5.6",
+ "@storybook/react": "10.5.10",
+ "@storybook/react-vite": "10.5.10",
"@testing-library/dom": "10.4.1",
"@testing-library/react": "16.3.2",
"@types/react": "^19.2.18",
- "@types/react-dom": "^19.2.4",
- "@vitejs/plugin-react": "^6.0.5",
+ "@types/react-dom": "^19.2.5",
+ "@vitejs/plugin-react": "^6.1.0",
"babel-plugin-react-compiler": "^1.0.0",
"eslint-plugin-import": "2.32.0",
"eslint-plugin-jsx-a11y": "6.10.2",
"eslint-plugin-react": "7.37.5",
"eslint-plugin-react-hooks": "7.1.1",
"react-compiler-runtime": "^1.0.0",
- "storybook": "10.5.6",
+ "storybook": "10.5.10",
"vite-plugin-dts": "^5.0.3"
},
"dependencies": {
diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml
index bf162c0db6..01866c4118 100644
--- a/frontend/pnpm-lock.yaml
+++ b/frontend/pnpm-lock.yaml
@@ -1,3 +1,104 @@
+---
+lockfileVersion: '9.0'
+
+importers:
+
+ .:
+ configDependencies: {}
+ packageManagerDependencies:
+ pnpm:
+ specifier: 12.0.0
+ version: 12.0.0
+
+packages:
+
+ '@pnpm/exe.darwin-arm64@12.0.0':
+ resolution: {integrity: sha512-sqeoPfVMIfQhbwzDrKraXY2ynyuWClFqzvfImzAS/yczEru1m5SGvQ9kgFPDvQzJZ9AetedgJeDZC6qYvH8/tQ==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@pnpm/exe.darwin-x64@12.0.0':
+ resolution: {integrity: sha512-Quc3J6c9cGTy+LDgz1cLVgCNOU9IERuyAlDoEj0DCilKqvo50Jx1GV8k74iwn4J9fFSKkm8JrwNvtTDj3uWnUA==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@pnpm/exe.linux-arm64-musl@12.0.0':
+ resolution: {integrity: sha512-EVWd3OTmgsMFhXx69b5JxIzoabG9Ma7m4OeTaf0ZKBzMnfYi8u21NDQo92ToMrdYL5dYDDCHsyYIjXzk+d0HhA==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@pnpm/exe.linux-arm64@12.0.0':
+ resolution: {integrity: sha512-cXHHW8M4rAPsYNkKZO9WVcpLLK55i9EaIsZPfIqUuY2eopd5LqnFyBge54HCh1GC0yCX8ySn0hYIi+4OyAEoDg==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@pnpm/exe.linux-x64-musl@12.0.0':
+ resolution: {integrity: sha512-UcXwMdFjly0mpddkGigHKTxe27IMv2fUK4IWW/MHmJ3yMguxXmkwNlEI4aE+G1HO2TLo20uNEUWD4ymLe/DaCQ==}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@pnpm/exe.linux-x64@12.0.0':
+ resolution: {integrity: sha512-6Rsl+zEWMOmus7v7/9J3OE8EMvHyNAfxYmDfmhQG4J0985OuT3G3Ho9NSGHjkBn4aU4bgklWifRhe1HX8dUSyw==}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@pnpm/exe.win32-arm64@12.0.0':
+ resolution: {integrity: sha512-O5F76A4oVFrpDGdFxEszRIThOSBfjHdH5c006gR+7UTCfiXrukr1XfqPungUI1DXcSR5gb9jBsPQqQZOAoOOxw==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@pnpm/exe.win32-x64@12.0.0':
+ resolution: {integrity: sha512-5dKFajIEWJ1ai+KHXFJvskY6vchbunmLwSUV2ywbLymcmJjfY5XJVpgzPCyIoVCMVG0zHorr66+hM8h8b3aRfQ==}
+ cpu: [x64]
+ os: [win32]
+
+ pnpm@12.0.0:
+ resolution: {integrity: sha512-ni49w5EZlYaNyUuBdcIXwn6VQI+gO0oidJd48rNPdzt3zdOznt6BcbIvzVO+ajU0Lp+smUimjvWN9kiM6Jp+Zw==}
+ engines: {node: '>=18.*'}
+ hasBin: true
+
+snapshots:
+
+ '@pnpm/exe.darwin-arm64@12.0.0':
+ optional: true
+
+ '@pnpm/exe.darwin-x64@12.0.0':
+ optional: true
+
+ '@pnpm/exe.linux-arm64-musl@12.0.0':
+ optional: true
+
+ '@pnpm/exe.linux-arm64@12.0.0':
+ optional: true
+
+ '@pnpm/exe.linux-x64-musl@12.0.0':
+ optional: true
+
+ '@pnpm/exe.linux-x64@12.0.0':
+ optional: true
+
+ '@pnpm/exe.win32-arm64@12.0.0':
+ optional: true
+
+ '@pnpm/exe.win32-x64@12.0.0':
+ optional: true
+
+ pnpm@12.0.0:
+ optionalDependencies:
+ '@pnpm/exe.darwin-arm64': 12.0.0
+ '@pnpm/exe.darwin-x64': 12.0.0
+ '@pnpm/exe.linux-arm64': 12.0.0
+ '@pnpm/exe.linux-arm64-musl': 12.0.0
+ '@pnpm/exe.linux-x64': 12.0.0
+ '@pnpm/exe.linux-x64-musl': 12.0.0
+ '@pnpm/exe.win32-arm64': 12.0.0
+ '@pnpm/exe.win32-x64': 12.0.0
+
+---
lockfileVersion: '9.0'
settings:
@@ -58,53 +159,53 @@ importers:
specifier: 1.62.1
version: 1.62.1
'@storybook/addon-docs':
- specifier: 10.5.6
- version: 10.5.6(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(esbuild@0.28.1)(rollup@4.61.1)(storybook@10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))
+ specifier: 10.5.10
+ version: 10.5.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(esbuild@0.28.2)(rollup@4.61.1)(storybook@10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))
'@storybook/addon-themes':
- specifier: 10.5.6
- version: 10.5.6(storybook@10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))
+ specifier: 10.5.10
+ version: 10.5.10(storybook@10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))
'@storybook/addon-vitest':
- specifier: 10.5.6
- version: 10.5.6(@vitest/browser-playwright@4.1.10)(@vitest/browser@4.1.10)(@vitest/runner@4.1.10)(react@19.2.8)(storybook@10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(vitest@4.1.10)
+ specifier: 10.5.10
+ version: 10.5.10(@vitest/browser-playwright@4.1.11)(@vitest/browser@4.1.11)(@vitest/runner@4.1.10)(react@19.2.8)(storybook@10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(vitest@4.1.11)
'@storybook/react-vite':
- specifier: 10.5.6
- version: 10.5.6(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rollup@4.61.1)(storybook@10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(supports-color@5.5.0)(typescript@6.0.3)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))
+ specifier: 10.5.10
+ version: 10.5.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(esbuild@0.28.2)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rollup@4.61.1)(storybook@10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(supports-color@5.5.0)(typescript@6.0.3)(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))
'@tokens-studio/sd-transforms':
specifier: 2.0.3
- version: 2.0.3(style-dictionary@5.5.0(tslib@2.8.1))
+ version: 2.0.3(style-dictionary@5.5.2(tslib@2.8.1))
'@types/node':
- specifier: ^26.1.2
- version: 26.1.2
+ specifier: ^26.4.0
+ version: 26.4.0
'@vitest/browser':
- specifier: 4.1.10
- version: 4.1.10(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))(vitest@4.1.10)
+ specifier: 4.1.11
+ version: 4.1.11(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))(vitest@4.1.11)
'@vitest/browser-playwright':
- specifier: 4.1.10
- version: 4.1.10(playwright@1.62.1)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))(vitest@4.1.10)
+ specifier: 4.1.11
+ version: 4.1.11(playwright@1.62.1)(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))(vitest@4.1.11)
'@vitest/coverage-v8':
- specifier: 4.1.10
- version: 4.1.10(@vitest/browser@4.1.10)(vitest@4.1.10)
+ specifier: 4.1.11
+ version: 4.1.11(@vitest/browser@4.1.11)(vitest@4.1.11)
'@zip.js/zip.js':
specifier: 2.8.34
version: 2.8.34(patch_hash=7b556bbd426f152eb086f0126a53900e369a95cf64357c380b7c8d8e940c3d95)
autoprefixer:
specifier: ^10.5.4
- version: 10.5.4(postcss@8.5.25)
+ version: 10.5.4(postcss@8.5.26)
compression:
specifier: ^1.8.1
version: 1.8.1(supports-color@5.5.0)
concurrently:
- specifier: ^10.0.4
- version: 10.0.4
+ specifier: ^10.0.5
+ version: 10.0.5
date-fns:
specifier: ^4.4.0
version: 4.4.0
esbuild:
- specifier: ^0.28.1
- version: 0.28.1
+ specifier: ^0.28.2
+ version: 0.28.2
eventsource-parser:
- specifier: ^3.1.0
- version: 3.1.0
+ specifier: ^4.1.0
+ version: 4.1.0
express:
specifier: ^5.1.0
version: 5.2.1(supports-color@5.5.0)
@@ -118,8 +219,8 @@ importers:
specifier: ^9.1.1
version: 9.1.1
highlight.js:
- specifier: ^11.10.0
- version: 11.11.1
+ specifier: ^11.12.0
+ version: 11.12.0
js-beautify:
specifier: ^2.0.3
version: 2.0.3
@@ -136,8 +237,8 @@ importers:
specifier: 0.0.7
version: 0.0.7
marked:
- specifier: ^18.0.9
- version: 18.0.9
+ specifier: ^18.0.11
+ version: 18.0.11
mkdirp:
specifier: ^3.0.1
version: 3.0.1
@@ -160,17 +261,17 @@ importers:
specifier: 1.62.1
version: 1.62.1
postcss:
- specifier: ^8.5.25
- version: 8.5.25
+ specifier: ^8.5.26
+ version: 8.5.26
postcss-clean:
specifier: ^1.2.2
version: 1.2.2
postcss-modules:
specifier: ^9.0.1
- version: 9.0.1(postcss@8.5.25)
+ version: 9.0.1(postcss@8.5.26)
postcss-scss:
specifier: ^4.0.9
- version: 4.0.9(postcss@8.5.25)
+ version: 4.0.9(postcss@8.5.26)
prettier:
specifier: 3.9.6
version: 3.9.6
@@ -190,8 +291,8 @@ importers:
specifier: 19.2.8
version: 19.2.8(react@19.2.8)
react-error-boundary:
- specifier: ^6.1.2
- version: 6.1.2(react@19.2.8)
+ specifier: ^6.1.3
+ version: 6.1.3(@types/react@19.2.18)(react@19.2.8)
react-virtualized:
specifier: ^9.22.6
version: 9.22.6(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
@@ -202,11 +303,11 @@ importers:
specifier: 8.0.0-alpha.14
version: 8.0.0-alpha.14
sass:
- specifier: ^1.102.0
- version: 1.102.0
+ specifier: ^1.103.1
+ version: 1.103.1
sass-embedded:
- specifier: ^1.100.0
- version: 1.100.0
+ specifier: ^1.103.1
+ version: 1.103.1
sax:
specifier: ^1.6.1
version: 1.6.1
@@ -217,17 +318,17 @@ importers:
specifier: ^0.5.21
version: 0.5.21
storybook:
- specifier: 10.5.6
- version: 10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8)
+ specifier: 10.5.10
+ version: 10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8)
style-dictionary:
- specifier: 5.5.0
- version: 5.5.0(tslib@2.8.1)
+ specifier: 5.5.2
+ version: 5.5.2(tslib@2.8.1)
stylelint:
specifier: ^17.14.1
version: 17.14.1(supports-color@5.5.0)(typescript@6.0.3)
stylelint-config-standard-scss:
specifier: ^17.0.0
- version: 17.0.0(postcss@8.5.25)(stylelint@17.14.1(supports-color@5.5.0)(typescript@6.0.3))
+ version: 17.0.0(postcss@8.5.26)(stylelint@17.14.1(supports-color@5.5.0)(typescript@6.0.3))
stylelint-plugin-logical-css:
specifier: ^2.1.0
version: 2.1.0(stylelint@17.14.1(supports-color@5.5.0)(typescript@6.0.3))
@@ -238,8 +339,8 @@ importers:
specifier: ^2.0.4
version: 2.0.4
tdigest:
- specifier: ^0.1.2
- version: 0.1.2
+ specifier: ^0.1.3
+ version: 0.1.3
tinycolor2:
specifier: ^1.6.0
version: 1.6.0
@@ -247,11 +348,11 @@ importers:
specifier: ^6.0.2
version: 6.0.3
vite:
- specifier: ^8.2.0
- version: 8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0)
+ specifier: ^8.2.2
+ version: 8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1)
vitest:
- specifier: ^4.1.10
- version: 4.1.10(@types/node@26.1.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@vitest/ui@4.1.10)(jsdom@30.0.1(canvas@3.2.3))(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))
+ specifier: ^4.1.11
+ version: 4.1.11(@types/node@26.4.0)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@vitest/ui@4.1.11)(jsdom@30.0.1(canvas@3.2.3))(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))
wait-on:
specifier: ^9.1.0
version: 9.1.0(debug@4.4.3(supports-color@5.5.0))(supports-color@5.5.0)
@@ -279,7 +380,7 @@ importers:
devDependencies:
esbuild:
specifier: ^0.28.1
- version: 0.28.1
+ version: 0.28.2
packages/mousetrap: {}
@@ -308,26 +409,26 @@ importers:
specifier: ^8.0.1
version: 8.0.1(@babel/core@8.0.1)
'@storybook/react':
- specifier: 10.5.6
- version: 10.5.6(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(supports-color@10.2.2)(typescript@6.0.3)
+ specifier: 10.5.10
+ version: 10.5.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(supports-color@10.2.2)(typescript@6.0.3)
'@storybook/react-vite':
- specifier: 10.5.6
- version: 10.5.6(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rollup@4.61.1)(storybook@10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(supports-color@10.2.2)(typescript@6.0.3)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))
+ specifier: 10.5.10
+ version: 10.5.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(esbuild@0.28.2)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rollup@4.61.1)(storybook@10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(supports-color@10.2.2)(typescript@6.0.3)(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))
'@testing-library/dom':
specifier: 10.4.1
version: 10.4.1
'@testing-library/react':
specifier: 16.3.2
- version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
'@types/react':
specifier: ^19.2.18
version: 19.2.18
'@types/react-dom':
- specifier: ^19.2.4
- version: 19.2.4(@types/react@19.2.18)
+ specifier: ^19.2.5
+ version: 19.2.5(@types/react@19.2.18)
'@vitejs/plugin-react':
- specifier: ^6.0.5
- version: 6.0.5(babel-plugin-react-compiler@1.0.0)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))
+ specifier: ^6.1.0
+ version: 6.1.0(babel-plugin-react-compiler@1.0.0)(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))
babel-plugin-react-compiler:
specifier: ^1.0.0
version: 1.0.0
@@ -347,11 +448,11 @@ importers:
specifier: ^1.0.0
version: 1.0.0(react@19.2.8)
storybook:
- specifier: 10.5.6
- version: 10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8)
+ specifier: 10.5.10
+ version: 10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8)
vite-plugin-dts:
specifier: ^5.0.3
- version: 5.0.3(@microsoft/api-extractor@7.56.2(@types/node@26.1.2))(esbuild@0.28.1)(rolldown@1.2.1)(rollup@4.61.1)(supports-color@10.2.2)(typescript@6.0.3)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))
+ version: 5.0.3(@microsoft/api-extractor@7.56.2(@types/node@26.4.0))(esbuild@0.28.2)(rolldown@1.2.1)(rollup@4.61.1)(supports-color@10.2.2)(typescript@6.0.3)(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))
text-editor:
devDependencies:
@@ -360,22 +461,22 @@ importers:
version: 1.62.1
'@types/node':
specifier: ^26.1.2
- version: 26.1.2
+ version: 26.4.0
'@vitest/browser':
specifier: ^4.1.10
- version: 4.1.10(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))(vitest@4.1.10)
+ version: 4.1.11(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))(vitest@4.1.11)
'@vitest/coverage-v8':
specifier: ^4.1.10
- version: 4.1.10(@vitest/browser@4.1.10)(vitest@4.1.10)
+ version: 4.1.11(@vitest/browser@4.1.11)(vitest@4.1.11)
'@vitest/ui':
- specifier: ^4.1.10
- version: 4.1.10(vitest@4.1.10)
+ specifier: ^4.1.11
+ version: 4.1.11(vitest@4.1.11)
canvas:
specifier: ^3.2.3
version: 3.2.3
esbuild:
specifier: ^0.28.0
- version: 0.28.1
+ version: 0.28.2
jsdom:
specifier: ^30.0.1
version: 30.0.1(canvas@3.2.3)
@@ -387,10 +488,10 @@ importers:
version: 3.9.6
vite:
specifier: ^8.2.0
- version: 8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0)
+ version: 8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1)
vitest:
specifier: ^4.1.10
- version: 4.1.10(@types/node@26.1.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@vitest/ui@4.1.10)(jsdom@30.0.1(canvas@3.2.3))(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))
+ version: 4.1.11(@types/node@26.4.0)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@vitest/ui@4.1.11)(jsdom@30.0.1(canvas@3.2.3))(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))
packages:
@@ -704,8 +805,8 @@ packages:
'@dabh/diagnostics@2.0.8':
resolution: {integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==}
- '@emnapi/core@1.11.2':
- resolution: {integrity: sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==}
+ '@emnapi/core@1.11.0':
+ resolution: {integrity: sha512-l9Oo58x0HOP5znGzVhYW9U3e5wVuA4LAZU2AGezTmkhO1CgQRFDhDg4nneHsu/t3WniXg9QrG2nIXL/ZS8ln8Q==}
'@emnapi/core@1.9.2':
resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==}
@@ -713,8 +814,8 @@ packages:
'@emnapi/core@2.0.0-alpha.3':
resolution: {integrity: sha512-AZypUeJ/yByuxyS7BlSNRDOMLMlROYtjYdIAuBmJssVz1UJDSeYxLrdizhXCFYhedC5bqd/ASy8EuNXbVVXp9g==}
- '@emnapi/runtime@1.11.2':
- resolution: {integrity: sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==}
+ '@emnapi/runtime@1.11.0':
+ resolution: {integrity: sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg==}
'@emnapi/runtime@1.9.2':
resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==}
@@ -731,158 +832,158 @@ packages:
'@emnapi/wasi-threads@2.0.1':
resolution: {integrity: sha512-9DsSk+o5NBX0CCJT8s0EROGSGxjR/tKu6aBTaVyq+SjAEQH4XcdcRxPBRzsBLizTTJ49MJjF+jgu3qnO9GLQcQ==}
- '@esbuild/aix-ppc64@0.28.1':
- resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==}
+ '@esbuild/aix-ppc64@0.28.2':
+ resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [aix]
- '@esbuild/android-arm64@0.28.1':
- resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==}
+ '@esbuild/android-arm64@0.28.2':
+ resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==}
engines: {node: '>=18'}
cpu: [arm64]
os: [android]
- '@esbuild/android-arm@0.28.1':
- resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==}
+ '@esbuild/android-arm@0.28.2':
+ resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==}
engines: {node: '>=18'}
cpu: [arm]
os: [android]
- '@esbuild/android-x64@0.28.1':
- resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==}
+ '@esbuild/android-x64@0.28.2':
+ resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==}
engines: {node: '>=18'}
cpu: [x64]
os: [android]
- '@esbuild/darwin-arm64@0.28.1':
- resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==}
+ '@esbuild/darwin-arm64@0.28.2':
+ resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [darwin]
- '@esbuild/darwin-x64@0.28.1':
- resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==}
+ '@esbuild/darwin-x64@0.28.2':
+ resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==}
engines: {node: '>=18'}
cpu: [x64]
os: [darwin]
- '@esbuild/freebsd-arm64@0.28.1':
- resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==}
+ '@esbuild/freebsd-arm64@0.28.2':
+ resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [freebsd]
- '@esbuild/freebsd-x64@0.28.1':
- resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==}
+ '@esbuild/freebsd-x64@0.28.2':
+ resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==}
engines: {node: '>=18'}
cpu: [x64]
os: [freebsd]
- '@esbuild/linux-arm64@0.28.1':
- resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==}
+ '@esbuild/linux-arm64@0.28.2':
+ resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==}
engines: {node: '>=18'}
cpu: [arm64]
os: [linux]
- '@esbuild/linux-arm@0.28.1':
- resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==}
+ '@esbuild/linux-arm@0.28.2':
+ resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==}
engines: {node: '>=18'}
cpu: [arm]
os: [linux]
- '@esbuild/linux-ia32@0.28.1':
- resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==}
+ '@esbuild/linux-ia32@0.28.2':
+ resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==}
engines: {node: '>=18'}
cpu: [ia32]
os: [linux]
- '@esbuild/linux-loong64@0.28.1':
- resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==}
+ '@esbuild/linux-loong64@0.28.2':
+ resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==}
engines: {node: '>=18'}
cpu: [loong64]
os: [linux]
- '@esbuild/linux-mips64el@0.28.1':
- resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==}
+ '@esbuild/linux-mips64el@0.28.2':
+ resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==}
engines: {node: '>=18'}
cpu: [mips64el]
os: [linux]
- '@esbuild/linux-ppc64@0.28.1':
- resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==}
+ '@esbuild/linux-ppc64@0.28.2':
+ resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [linux]
- '@esbuild/linux-riscv64@0.28.1':
- resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==}
+ '@esbuild/linux-riscv64@0.28.2':
+ resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==}
engines: {node: '>=18'}
cpu: [riscv64]
os: [linux]
- '@esbuild/linux-s390x@0.28.1':
- resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==}
+ '@esbuild/linux-s390x@0.28.2':
+ resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==}
engines: {node: '>=18'}
cpu: [s390x]
os: [linux]
- '@esbuild/linux-x64@0.28.1':
- resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==}
+ '@esbuild/linux-x64@0.28.2':
+ resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [linux]
- '@esbuild/netbsd-arm64@0.28.1':
- resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==}
+ '@esbuild/netbsd-arm64@0.28.2':
+ resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [netbsd]
- '@esbuild/netbsd-x64@0.28.1':
- resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==}
+ '@esbuild/netbsd-x64@0.28.2':
+ resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==}
engines: {node: '>=18'}
cpu: [x64]
os: [netbsd]
- '@esbuild/openbsd-arm64@0.28.1':
- resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==}
+ '@esbuild/openbsd-arm64@0.28.2':
+ resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openbsd]
- '@esbuild/openbsd-x64@0.28.1':
- resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==}
+ '@esbuild/openbsd-x64@0.28.2':
+ resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==}
engines: {node: '>=18'}
cpu: [x64]
os: [openbsd]
- '@esbuild/openharmony-arm64@0.28.1':
- resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==}
+ '@esbuild/openharmony-arm64@0.28.2':
+ resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openharmony]
- '@esbuild/sunos-x64@0.28.1':
- resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==}
+ '@esbuild/sunos-x64@0.28.2':
+ resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==}
engines: {node: '>=18'}
cpu: [x64]
os: [sunos]
- '@esbuild/win32-arm64@0.28.1':
- resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==}
+ '@esbuild/win32-arm64@0.28.2':
+ resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [win32]
- '@esbuild/win32-ia32@0.28.1':
- resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==}
+ '@esbuild/win32-ia32@0.28.2':
+ resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==}
engines: {node: '>=18'}
cpu: [ia32]
os: [win32]
- '@esbuild/win32-x64@0.28.1':
- resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==}
+ '@esbuild/win32-x64@0.28.2':
+ resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==}
engines: {node: '>=18'}
cpu: [x64]
os: [win32]
@@ -1311,106 +1412,109 @@ packages:
'@oxc-project/types@0.142.0':
resolution: {integrity: sha512-7W+2q5AKQVU36fkaryontrHn3YDt1RyUYXatw9i5H8ocYe2sPKSFB6eS8WNPeRKiN1qAWWZUPm7gwFzJGrccqQ==}
- '@oxc-resolver/binding-android-arm-eabi@11.24.2':
- resolution: {integrity: sha512-y09e0L0SRI2OA2tUIrjBgoV3eH5hvUKXNkJqXmNo5V2WxIjyC7I7aJfRLMEVpA8yi95f90gFDvO0VMgrDw+vwA==}
+ '@oxc-project/types@0.147.0':
+ resolution: {integrity: sha512-IJ3s6ltHLp45S0bh7phkX+gJO7A1Wuz2EaqpAhb8WjqDwbzMiWKHhyyT42tskaWjEYXtHtVCPpnBJVT9+dcRLg==}
+
+ '@oxc-resolver/binding-android-arm-eabi@11.21.2':
+ resolution: {integrity: sha512-xQoCRv+gKax9KTdwdaQNnAFOai8neay7g3jExDIORzhbrejwGSJaZNTdOJHR5ziLg2joMxOCMOFMo4zuxza2uQ==}
cpu: [arm]
os: [android]
- '@oxc-resolver/binding-android-arm64@11.24.2':
- resolution: {integrity: sha512-cl4icWaZFnLdg8m6qtnh5rBMuGbxc/ptStFHLeCNwr+2cZjkjNwQu/jYRS0CHlnPecOJMpuS5M6/BH+0J/YkEg==}
+ '@oxc-resolver/binding-android-arm64@11.21.2':
+ resolution: {integrity: sha512-HF5oiE2L05yInPYCFD/4uxSrEZW4SuIfn99Y6L1xnJnzl066JR+MJs2rIdstw8A2MPlAKH+13dpFPNycjqzvGg==}
cpu: [arm64]
os: [android]
- '@oxc-resolver/binding-darwin-arm64@11.24.2':
- resolution: {integrity: sha512-At29QEMF6HajbQvgY8K6OXnHD1x9rad74xBEfmCB6ZqCGsdq75aK7tOYcTbOanMy8qdIBrfL3SMr3p/lfSlb9w==}
+ '@oxc-resolver/binding-darwin-arm64@11.21.2':
+ resolution: {integrity: sha512-UX4u49CVCAD8QZNELaW8eMGgMAGwFWYEPbvNsh+3r/gs4NX3KfpiACMVwRQT0EuH3uat9hM5Zl+Ppm9pJD8tgg==}
cpu: [arm64]
os: [darwin]
- '@oxc-resolver/binding-darwin-x64@11.24.2':
- resolution: {integrity: sha512-A5Kqr1EUj4oIL5CF4WRssq/o5P0Y11cwoFouMRmQ7YnC/A8V93nv1nb7aSU8HwcgmXropjLNkVTl4MN87cu28Q==}
+ '@oxc-resolver/binding-darwin-x64@11.21.2':
+ resolution: {integrity: sha512-J9xPx7YBkrRmJ+xl561ztnMWEc1aOyjEIxBiGX1dVb3u7bGSnfObfcZk+Pd+uM0HZAPNsQ1xvD8j52A/uOSqNQ==}
cpu: [x64]
os: [darwin]
- '@oxc-resolver/binding-freebsd-x64@11.24.2':
- resolution: {integrity: sha512-R5xkRBRRz7ceH/P5Jrc6G7FmdUdgpLYyESFAUDVTNQ9K0sGPxcp4ljiwEwEqsvNcQ4sYbMRrWcHHBCu7ksAJVw==}
+ '@oxc-resolver/binding-freebsd-x64@11.21.2':
+ resolution: {integrity: sha512-fRlt7OvSaQkWj6+EDTVxawVxOlqJB2QSnBfkeCyK4RTvsGctbw3BiH2Tb7DzMs7bikc4BRBpvWP5zF9K8b54Zg==}
cpu: [x64]
os: [freebsd]
- '@oxc-resolver/binding-linux-arm-gnueabihf@11.24.2':
- resolution: {integrity: sha512-k/RuYL4L/R58IBn3wT5ma3Wh4k62bp1eYCFRWCmMsasUOqL+H6sW0VGFadEzKWXFFlz+2uIMoeMk9ySSZJHgbg==}
+ '@oxc-resolver/binding-linux-arm-gnueabihf@11.21.2':
+ resolution: {integrity: sha512-gK+vPUcPQITkGwBKpZGrcDHSlU6eDGl7AQacxS2CEKAZIBHWkOVFeJwLZ4tYnA1acJqRM5lt7yYwPCVqGHIJ7A==}
cpu: [arm]
os: [linux]
- '@oxc-resolver/binding-linux-arm-musleabihf@11.24.2':
- resolution: {integrity: sha512-bnHAak3ujYfH5pKk4NieFNbvYvernfoQDgwLddbZ3OtMYrem87/qjlA+u+aKG0oZcqSLGCful/6/CEA+aeAgaA==}
+ '@oxc-resolver/binding-linux-arm-musleabihf@11.21.2':
+ resolution: {integrity: sha512-L/Rgas7SrOKy/z7IH+HxSFRqVO4PuLDKLEGKvnhoCBBq3UJ0YzGBou3qMzaAGgkJwsIvX2pBF+7ojzfUhLiZxQ==}
cpu: [arm]
os: [linux]
- '@oxc-resolver/binding-linux-arm64-gnu@11.24.2':
- resolution: {integrity: sha512-vDT3KHgzYp47gmtNOqL2VNhCyl5Zv643eyxm//A68J8DeUGXrvD1pZFiaT4jSfe+RInfnn1R2yVHye4enx6RnA==}
+ '@oxc-resolver/binding-linux-arm64-gnu@11.21.2':
+ resolution: {integrity: sha512-CUEYvlX1Fk7E9kUMzuswru1J9HLxMwnpDeQGjQuI4ZH+iNCoa2X9T+pvyzrbsgl7WnIeTFTlNlHsRfVdf5g9/g==}
cpu: [arm64]
os: [linux]
libc: [glibc]
- '@oxc-resolver/binding-linux-arm64-musl@11.24.2':
- resolution: {integrity: sha512-+kMlQvbzfyEYtu5FcjE4p+ttBLpKW4d/AsAsuE69BxV6V4twZJeIQZFfD8gh/wqglY0MkPSezWXQH0jBV13MUw==}
+ '@oxc-resolver/binding-linux-arm64-musl@11.21.2':
+ resolution: {integrity: sha512-ViN1ZibQyxwC67GpoP33oo+S9UyUnkog13vzQb9+v9bCNvrVzJuk0MRdacjtv/9xfRMVF/eqHFyl8YOeykI10Q==}
cpu: [arm64]
os: [linux]
libc: [musl]
- '@oxc-resolver/binding-linux-ppc64-gnu@11.24.2':
- resolution: {integrity: sha512-shjfMhmZ3gq9fv/w7bi3PnZlgOPG+2QAOFf0BJF0EgBSIGZ6PMLN2zbGEblTUYB/NKVDRyYhE2ff3dJ1QqNPkA==}
+ '@oxc-resolver/binding-linux-ppc64-gnu@11.21.2':
+ resolution: {integrity: sha512-CU1sCqWnhGqYD5I1HedHk5pujrn7ssDkNB/AEQd/pd3D/EojVSgJUlpbafwIbyhia3PgIfkvdFpRPWSALzVumA==}
cpu: [ppc64]
os: [linux]
libc: [glibc]
- '@oxc-resolver/binding-linux-riscv64-gnu@11.24.2':
- resolution: {integrity: sha512-zGelwFR5oRo+b69k8Lrzun86DyUHzfKN6cnjbR9l7Z7NIRznOE/2ZvPa1IUKqAL2PzAXOdwkfVqNvO1H2RlpAw==}
+ '@oxc-resolver/binding-linux-riscv64-gnu@11.21.2':
+ resolution: {integrity: sha512-jWVyZtIHca4Gb96x7dag+y69vlei7ffjrsveLkmf2ZhqEAz6ZSBnY1GWvgZUaZlwZP62A3xD092BW97Q5VGc+g==}
cpu: [riscv64]
os: [linux]
libc: [glibc]
- '@oxc-resolver/binding-linux-riscv64-musl@11.24.2':
- resolution: {integrity: sha512-qxZ1SWCXJY0eyhAlP6Lmo9F2Nrtx7EkYj9oCgL8apDPCwXwCEDA2U697bbT81JIc2IrVjxO4KX6WU2N+oN9Z4w==}
+ '@oxc-resolver/binding-linux-riscv64-musl@11.21.2':
+ resolution: {integrity: sha512-LF29obFqNgBUgDX7rmUK7M4D0JQG5LxhYzn3xXmECcHU9aQAdWG7NiY052qybtesEdwHQXKNTWYQ7mTsybNvWg==}
cpu: [riscv64]
os: [linux]
libc: [musl]
- '@oxc-resolver/binding-linux-s390x-gnu@11.24.2':
- resolution: {integrity: sha512-sGCecF3cx2DFlH4t/z7ApnOnXqN48p5p5mlHDEnHTAukQa2P+qMVE4CwyWE9W+q/m3QJ7kKfGrIjax31f44oFQ==}
+ '@oxc-resolver/binding-linux-s390x-gnu@11.21.2':
+ resolution: {integrity: sha512-+NYcm+cCHBbtdQQ3A4phQTSuVRYnNHz7wrl9XRAPEovcdoqi0mb1K5ZOl+jN54ZD+q1zz3V0vltbFJmzecJKmw==}
cpu: [s390x]
os: [linux]
libc: [glibc]
- '@oxc-resolver/binding-linux-x64-gnu@11.24.2':
- resolution: {integrity: sha512-k/VlMMcSzMlahb3/fENM4rTlsJ0s3fFROA0KXPBmKggqmTSaE383sl8F3KCOXPLmVsYfW6hCitMhXCEtNeZxxg==}
+ '@oxc-resolver/binding-linux-x64-gnu@11.21.2':
+ resolution: {integrity: sha512-UQqZDdG2r2HhAOsZEgufkIWHPQ886IUyuJQkoZByvzhW8j51R4UNzGBJFkTiTnLhQnggwJRdJgFWK4uY6ZVIMw==}
cpu: [x64]
os: [linux]
libc: [glibc]
- '@oxc-resolver/binding-linux-x64-musl@11.24.2':
- resolution: {integrity: sha512-8hbnZyNi97b/8wapYaIF9+t9GmZKBW2vunaOc3h9HGJptH7b7XpvZqOTBSm/MpTjr7H497BlgOaSfLUdhmy2bw==}
+ '@oxc-resolver/binding-linux-x64-musl@11.21.2':
+ resolution: {integrity: sha512-3Q9PMRjalWkT6NZ4jfujuqTCFwoWErg3y3BnOgb544B8IMw4PktiwWOigMfOHNRLMghZeJ7hpfpZf4CP7rV7Og==}
cpu: [x64]
os: [linux]
libc: [musl]
- '@oxc-resolver/binding-openharmony-arm64@11.24.2':
- resolution: {integrity: sha512-MvyGik3a6pVgZ0t/kWlbmFxFLmXQJwgLsY2eYFHLpy0wGwRbfzeIGgDwQ3kXqE30z+kSXennRkCrT7TUvkptNg==}
+ '@oxc-resolver/binding-openharmony-arm64@11.21.2':
+ resolution: {integrity: sha512-Eljeq3ndtyKhM+Es8LITi4Zl2htzuRZcrPMF3kMCsrILztvU6AjZ3FuEhHHKobPUB9rMpzLpJP5bDqXI7r+iog==}
cpu: [arm64]
os: [openharmony]
- '@oxc-resolver/binding-wasm32-wasi@11.24.2':
- resolution: {integrity: sha512-vHcssMPwO08RTvj/c0iOBz90attxyG3wQJ0dTcyEQK43LRpcdLWZlV5feBhv6Isn6ahbQIzHbCgfa81+RiML0Q==}
+ '@oxc-resolver/binding-wasm32-wasi@11.21.2':
+ resolution: {integrity: sha512-HGDbNsIywqc4LxU38+CTJNnB/6BF7rheWOJ259b4eE0aEnelYblC8x+1tEd63bp31fYne63RQz9Jb4yVnC7Yig==}
engines: {node: '>=14.0.0'}
cpu: [wasm32]
- '@oxc-resolver/binding-win32-arm64-msvc@11.24.2':
- resolution: {integrity: sha512-uokJqro2iBqkFvJdKQLP7d8/BUmFwESQFVmIJUQKj1Xn1a/LysJoe1vmeECLF5b3jsV8CAL5sEMJXX6SdK9Nhg==}
+ '@oxc-resolver/binding-win32-arm64-msvc@11.21.2':
+ resolution: {integrity: sha512-iWx25CBEgH49iE9q5coEGI/jb1jl5kkCY9z6U5Og67xCkQ/WFMDc2J5U78+AE91SUxM2NqSLhJC8/PLfWnImww==}
cpu: [arm64]
os: [win32]
- '@oxc-resolver/binding-win32-x64-msvc@11.24.2':
- resolution: {integrity: sha512-UqGPmo56KDfLlfXFAFIrNflHT8tFxWGEivWg3Zeyp4Uy2NlKN1FGPr6/BxcLGG3+kZ6Wp14g5Uj+n71boqZfiw==}
+ '@oxc-resolver/binding-win32-x64-msvc@11.21.2':
+ resolution: {integrity: sha512-VPoCAhKvCQTlG7vxqaBXcmuvbh77BfnGXj8g0pbvVXpm1F/R8rDVwqIWcEbMzrI1JvJlm8v7T9uMVQb6UctMRg==}
cpu: [x64]
os: [win32]
@@ -1597,36 +1701,72 @@ packages:
resolution: {integrity: sha512-xBaJish5OeGmniDj9cW5PRa/PtmuVU3ziqrbr5xJj901ZDN4TosrVaNZpEiLZAxdfnhAe7uQ7QFWfjPe9d9K2Q==}
engines: {node: '>= 10'}
+ '@rolldown/binding-android-arm-eabi@1.2.6':
+ resolution: {integrity: sha512-b+jTcARdTiFLI6jB4a5XjTm0RWd6KcRfQj/I2356fxUZemiho9zQLxo0RtCuMDAyKcLo6cEltkgbQp6d1+sjjQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm]
+ os: [android]
+
'@rolldown/binding-android-arm64@1.2.1':
resolution: {integrity: sha512-02hOeOSryYxVrOIphmLAsqnCJWxwlzFk+pEt/N/i6OgT3lShHO7xGCU5cpgchRDHboAEbSjzgGh+O/u1GswQmA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [android]
+ '@rolldown/binding-android-arm64@1.2.6':
+ resolution: {integrity: sha512-lkWU8ZJaRk9q3CIEY1Tc7vIFALp3Xw5NfGJo2hQg5oIqNgxWi1zI+IiDEK3r70BF5Dzol1tcXsnzsRc8NLhG+Q==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [android]
+
'@rolldown/binding-darwin-arm64@1.2.1':
resolution: {integrity: sha512-fMsTOnN0OjFm3CyppWPitKnc8UlliVARUULW6cfU6AIqjdtgmSFWSk9vecHzZduv/yMWIHDlRhM1e8Iff9uAfA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [darwin]
+ '@rolldown/binding-darwin-arm64@1.2.6':
+ resolution: {integrity: sha512-dgR56NYnvAszm7Ob1B2/Vn0e8bUQYZH2UjVaMMtMVOCKFSfjhfLmuA/9+O+F+ajUdG6B/bSssrKW6JJYASa8jA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [darwin]
+
'@rolldown/binding-darwin-x64@1.2.1':
resolution: {integrity: sha512-1wjKdz/XLGKHaTNHjQveQ/B23TKx4ItAqm1JbyVuvNPc4Ze0Fb48s49TAd/2zcplPl8okE/UbTgmlVfwT7eFeQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [darwin]
+ '@rolldown/binding-darwin-x64@1.2.6':
+ resolution: {integrity: sha512-vpVxFvUCFioJqug7OTvqptkc4yb8UX0AwfDmJpaR/0sWz+BUmqSVAf7c8JkUgnN8YLspb4a/N6NhTyMAmdyQ7Q==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [darwin]
+
'@rolldown/binding-freebsd-x64@1.2.1':
resolution: {integrity: sha512-Fa0jHR07E7YBN4vOEsbVf2briYNsuOowfLJaXULZM0ldMlaCaj2LJgLMbMe4iacRyZmvR8efFhgR9wKuGclQUg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [freebsd]
+ '@rolldown/binding-freebsd-x64@1.2.6':
+ resolution: {integrity: sha512-h1wG6Y6K3JlRswxsI64qQJqBAy4vrLuHgRbc8CZMGSWTOFRY6ghMApM1NKzB2I0n5xV1fjkE18SuVl2QpLeNpA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [freebsd]
+
'@rolldown/binding-linux-arm-gnueabihf@1.2.1':
resolution: {integrity: sha512-pzkgu1SSHGgRRyRZ4fbmSgmajbVt+epaLP99NDjFft69v/ypfTi6swBMiVdh2EkQ0OSnHE1lZDM7DRGkyAzUpA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [linux]
+ '@rolldown/binding-linux-arm-gnueabihf@1.2.6':
+ resolution: {integrity: sha512-tbCiqub0q2MVWJKgF5PoAlNWCtQydiOYSLIkd8sByqK/6MMYLJRcSXSYodqYtd0O+Fw7QaVmKKlS4oL94YRZ0w==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm]
+ os: [linux]
+
'@rolldown/binding-linux-arm64-gnu@1.2.1':
resolution: {integrity: sha512-QI5SEDY8cbiYWHx0VO4vIc3UlS6a32vXHjU8Qy/17adEmZIPuByJg13UEvo9c/UCiUkdcVWY83C+b+JrwnNyUg==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -1634,6 +1774,13 @@ packages:
os: [linux]
libc: [glibc]
+ '@rolldown/binding-linux-arm64-gnu@1.2.6':
+ resolution: {integrity: sha512-oxK9+baEBPhZG5HB4URY+uU04zJWeZlH6Tb9rB5DK4DF9XR1uXNLXt5Q5ZsugTKayNCNLhkcwz/ye74hRI98dg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
'@rolldown/binding-linux-arm64-musl@1.2.1':
resolution: {integrity: sha512-Sm41FyCeXqmYcERoYOCbGIL5hNfd8w9LQ7Y61Bev48HkcjaJqV/iiVOaiDxjVTRMS+QKrZmD8cfPt4uMVnvM+A==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -1641,6 +1788,13 @@ packages:
os: [linux]
libc: [musl]
+ '@rolldown/binding-linux-arm64-musl@1.2.6':
+ resolution: {integrity: sha512-muWCk27FVBEZtv0MsK8gnfSmgczA8KQ0uRVJbTABKhkRfQc38aUrcb7fhi3BNiyseFmgcRsoMfQsSNJ+DbZdSw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
'@rolldown/binding-linux-ppc64-gnu@1.2.1':
resolution: {integrity: sha512-2x+WhXTGl9yJYPbltW/BSEPTVz9OIWQyER4N+gJEDWkkn904eRcBzELqh/Hf7K0w/ubGbKNMv0ZC+94QK/IFEg==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -1648,6 +1802,13 @@ packages:
os: [linux]
libc: [glibc]
+ '@rolldown/binding-linux-ppc64-gnu@1.2.6':
+ resolution: {integrity: sha512-eWDoSfU7Co2qj3vgB3Dt4lj1mG6CoWbcJQkRMP3XJplyCMtuaq3LHvPFjS9QIPvMGWVadJC04Xiy0IdcVPtnwQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
'@rolldown/binding-linux-s390x-gnu@1.2.1':
resolution: {integrity: sha512-eEjmQpuRQayHPWWnywaWHkFT3ToPbP3RYy42VVd/B9aBGDA+Ol25EIWHxKQST3IiWJjikCWUF7KtbfqwZrzVwQ==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -1655,6 +1816,13 @@ packages:
os: [linux]
libc: [glibc]
+ '@rolldown/binding-linux-s390x-gnu@1.2.6':
+ resolution: {integrity: sha512-2bWNjRSIayvupRKxXUY2tWG9fYdoUlTqWywHRvE8Eq3GvuQ+f2HeIkve697fIt+IQs/PV8yFsdWuhp1aJ1PdnA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
+
'@rolldown/binding-linux-x64-gnu@1.2.1':
resolution: {integrity: sha512-/Orga1fZYkLc/56jBICcHrKchl8Z2UKdDSr3LG9ToWO1lQ6a4Livk9Xz+9WN91zsz5QR3XQz2NNoSDEvP6qadw==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -1662,6 +1830,13 @@ packages:
os: [linux]
libc: [glibc]
+ '@rolldown/binding-linux-x64-gnu@1.2.6':
+ resolution: {integrity: sha512-KekI0gS0wLxe1UBSQSjenBVwou/JkcQPDzBPICGZjxUv9k3RteHDPBQaiOicZUFKRIH2wKEimGwVpnJsbPzu7w==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
'@rolldown/binding-linux-x64-musl@1.2.1':
resolution: {integrity: sha512-xxBJRL+0q0Kce7orznGWLuylHDY65vuARXZRpX+hPdv+DqK2c3NlCsVA98tlWzWNEE7yPqA/1NQ5nnCrj49Y5A==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -1669,12 +1844,25 @@ packages:
os: [linux]
libc: [musl]
+ '@rolldown/binding-linux-x64-musl@1.2.6':
+ resolution: {integrity: sha512-TvtPnfVr+HtyGiDmPK4VWmlNm7QhNNAcK5Q9A7aOXsI8545yCyaoMaicXrFZ72JzeYjaUVk7yT243zT0jzjFKQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
'@rolldown/binding-openharmony-arm64@1.2.1':
resolution: {integrity: sha512-M6AdXIXw3s+/8XpKMzdGDEXGS1S7kwUsy+rcTIUIOx5Ge4nXKCtAFHFV9YKkXvGcC5WMoTjAteLzlsQROVI0Yw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [openharmony]
+ '@rolldown/binding-openharmony-arm64@1.2.6':
+ resolution: {integrity: sha512-iOo0VEay2XFhaCcH0sps5XIimkSuOnNaZrf6+ZkoSOQBJPKNU48RkmJv0/lSpipexu5P+ouFgafe5IGr/DiQfg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [openharmony]
+
'@rolldown/binding-wasm32-wasi@1.2.1':
resolution: {integrity: sha512-/TX0SoRGojHzSAHpfVBbavRVSazg5U3h3Y3VXfcc0cdugq6kxdqw8LPGFiPr+/7gE/60zRcsOY2Vi9b9eT0jww==}
engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0}
@@ -1685,12 +1873,24 @@ packages:
cpu: [arm64]
os: [win32]
+ '@rolldown/binding-win32-arm64-msvc@1.2.6':
+ resolution: {integrity: sha512-y5NTmmasMS455JlOCO4ZM9krIchv3Mvm1crL1iUPGOPgEzSkves9n0SdC5Sjz6+qWDFhd8/JpfWMH8NSWNHe+A==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [win32]
+
'@rolldown/binding-win32-x64-msvc@1.2.1':
resolution: {integrity: sha512-Z4eCmn5QJ/5+azF9knpLWKfVd9aidn0mAe9TpJgvBLId9Ax3t0+JVxBmT25Bv7NBbVW1TZyKjQjQReouMeH5UQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [win32]
+ '@rolldown/binding-win32-x64-msvc@1.2.6':
+ resolution: {integrity: sha512-np8iZSLfXlAD4kWhiyq/u0Yt8oZDtRQ8lGhQaCXo2rl37KNjeU0GjJuwr4P3oeZ++ROfofsKNBqR5LTO8aXyWQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [win32]
+
'@rolldown/pluginutils@1.0.1':
resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==}
@@ -1884,27 +2084,27 @@ packages:
'@standard-schema/spec@1.1.0':
resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
- '@storybook/addon-docs@10.5.6':
- resolution: {integrity: sha512-zyUJBrrpC9NTrmsREaVFNr+9WW6pikJtmRvo7GgZGqthEyhjQKSarHrW0aNWkwae2ep3jp1CZi8vIUVG1Dnp0w==}
+ '@storybook/addon-docs@10.5.10':
+ resolution: {integrity: sha512-06JoK3/a7FWI/6GzuidJP9iHp1/Vejboe6lzS1jW+d8ItpecriBt+oXh1VNmUM7i7PjI6pZnet+j51QnLyeOoQ==}
peerDependencies:
'@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
- storybook: ^10.5.6
+ storybook: ^10.5.10
peerDependenciesMeta:
'@types/react':
optional: true
- '@storybook/addon-themes@10.5.6':
- resolution: {integrity: sha512-fIzu2f6xPh/mtOBUU9TnjSoO3qUIF57AVES9HX4dfhjtbz9lWd+EhNd65nZfmTXxKsS32x/7/aXDTHtuP/ObwQ==}
+ '@storybook/addon-themes@10.5.10':
+ resolution: {integrity: sha512-XNTjmIBwJ0TUcIV11STGY6hcynCy6imgYCDZeDaDyNEQsCoYAlY25fYvWNfrz5jOu1MGACiaA/E0ypk03whDdQ==}
peerDependencies:
- storybook: ^10.5.6
+ storybook: ^10.5.10
- '@storybook/addon-vitest@10.5.6':
- resolution: {integrity: sha512-oxq7Qi4Vujc8Etoi1TZBurMs4RiKoGnvAOCXePOLglXSJMpy95gEb7iu/hvj8E21lV+vVtQYmFvj9Z7gJeMtdg==}
+ '@storybook/addon-vitest@10.5.10':
+ resolution: {integrity: sha512-JNQ9DSkLfxC8qqytBCej91zBExIZ7z97B410U2zgfQPki4HkI9Ffz97a15f5yhVZ79ppIrZ/ssI+WcyWn0ykXQ==}
peerDependencies:
'@vitest/browser': ^3.0.0 || ^4.0.0
'@vitest/browser-playwright': ^4.0.0
'@vitest/runner': ^3.0.0 || ^4.0.0
- storybook: ^10.5.6
+ storybook: ^10.5.10
vitest: ^3.0.0 || ^4.0.0
peerDependenciesMeta:
'@vitest/browser':
@@ -1916,18 +2116,18 @@ packages:
vitest:
optional: true
- '@storybook/builder-vite@10.5.6':
- resolution: {integrity: sha512-Ts8EohKPj8okDPCkueeKVN+IRGNpI3LuddsFGupqraRvK6aRWawDKA28uc0PlsLCLWbMkMsGVw+IpFXfmoLJgQ==}
+ '@storybook/builder-vite@10.5.10':
+ resolution: {integrity: sha512-O4GgIP0tKLRueom3EmU3OaBUHKjNYj+jkOvmTIkn3PYTiWVkCuHqSKEs4ADvRyaQuLH+peHhFe4JtkNC9KbtrQ==}
peerDependencies:
- storybook: ^10.5.6
+ storybook: ^10.5.10
vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0
- '@storybook/csf-plugin@10.5.6':
- resolution: {integrity: sha512-PJLyOmcKe1OZDBw7RaGX/gjuiJuVfS5pVgc4W2RnHYOFpU6F5Bv9+9MqQwp0i7tWZBWc4fsCJudgVqwgjuTROA==}
+ '@storybook/csf-plugin@10.5.10':
+ resolution: {integrity: sha512-TaCLBrqVEr767+w58QDotDUiCTuE5cyRJuRcDlsKQyUIyGBv+lYD3lu8wBiVCYxgIjB/gu9HmqiC+0yx1rHzaw==}
peerDependencies:
esbuild: '*'
rollup: '*'
- storybook: ^10.5.6
+ storybook: ^10.5.10
vite: '*'
webpack: '*'
peerDependenciesMeta:
@@ -1948,40 +2148,40 @@ packages:
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
- '@storybook/react-dom-shim@10.5.6':
- resolution: {integrity: sha512-dV3oOHc5ImggxEqeIiUj4vvnQO5SKScFtqAkxgIWLju1wiSZSIqQ5Q4Mp12Rhs9hQrjF039DueH7f2xJJZfvSw==}
+ '@storybook/react-dom-shim@10.5.10':
+ resolution: {integrity: sha512-rbu62ILo/VE3iXKmu+kWXFpD1H1Lwi0f19q/x7JnDsD2dxKS9w5znLEqPIq2qxpzi/wjjIb2iUP1cRG1d/9W5A==}
peerDependencies:
'@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
'@types/react-dom': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
- storybook: ^10.5.6
+ storybook: ^10.5.10
peerDependenciesMeta:
'@types/react':
optional: true
'@types/react-dom':
optional: true
- '@storybook/react-vite@10.5.6':
- resolution: {integrity: sha512-DCTfNZWhQUH4Zf8LDE4zdLn6+C26QNW0KETdnFUkdrqRADlwS6oExtGWC5f/uP/GDbKb9jrGbC+/ap8nWEH/vQ==}
+ '@storybook/react-vite@10.5.10':
+ resolution: {integrity: sha512-xOztxefUnqKeuyvcnjspqmlDnER4cExL+liltrpdXLPJVqfFNr9lgM49FyEPajzsUVG9W/vHJWjbaQGGu1UsYQ==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
- storybook: ^10.5.6
+ storybook: ^10.5.10
typescript: '>= 4.9.x'
vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0
peerDependenciesMeta:
typescript:
optional: true
- '@storybook/react@10.5.6':
- resolution: {integrity: sha512-dXSdNoc9yAvpa4hiegQhmZPXOKunAxkPX94DxvRw/kM6+wujVFAGlZjYygKrWw357KOjPRK7SO1LRTc70mgrhQ==}
+ '@storybook/react@10.5.10':
+ resolution: {integrity: sha512-4MBV5e1SXIMfPynLHzr+Mp0dwGv/FW1bklWAsS4ynBOAbC98W9p/I9vqBnUctsvE3BJkhzHQQyPwMHL5tTcHVA==}
peerDependencies:
'@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
'@types/react-dom': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
- storybook: ^10.5.6
+ storybook: ^10.5.10
typescript: '>= 4.9.x'
peerDependenciesMeta:
'@types/react':
@@ -2085,14 +2285,19 @@ packages:
'@types/mdx@2.0.14':
resolution: {integrity: sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==}
- '@types/node@26.1.2':
- resolution: {integrity: sha512-Vu4a5UFA9rIIFJ7rB/Vaafh9lrCQszopTCx6KjFboXTGQbPNasehVR5TEiithSDGyd1DEiUByggTZsg8jukeIg==}
+ '@types/node@26.4.0':
+ resolution: {integrity: sha512-faiGnoIrLH/V8cibOMEAZ8pMw6oXqSukl29ra4mN8GdaB2ZewzeaLj+INpV5N+Z1eKWzY+IzaIZH2EIR6YZRNQ==}
'@types/react-dom@19.2.4':
resolution: {integrity: sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==}
peerDependencies:
'@types/react': ^19.2.0
+ '@types/react-dom@19.2.5':
+ resolution: {integrity: sha512-fMPwH9v7r/pp43yUd2/Mbiex5KouJwwR3dzHkhLREUC6764VyDsqxhAxv6OFEYR1RhjOyD1naqba8ECDBe7ZQg==}
+ peerDependencies:
+ '@types/react': ^19.2.0
+
'@types/react@19.2.18':
resolution: {integrity: sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==}
@@ -2102,35 +2307,38 @@ packages:
'@types/triple-beam@1.3.5':
resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==}
- '@vitejs/plugin-react@6.0.5':
- resolution: {integrity: sha512-BOVzne/NL162sMdResB25mUv+vWMF5NoAjNf09TeGlE7ZpszZWSD3winycicLJw72yeVsoCn/2kOhEuCvEShMA==}
+ '@vitejs/plugin-react@6.1.0':
+ resolution: {integrity: sha512-qd2BzUBehkov86WFhg0JkEFEYyCLG9uPCe6qWTY/kRlss9OvJrOF2UbIWT7p+8IzZHkEu0DNGHc4HSv+JdDLsw==}
engines: {node: ^20.19.0 || >=22.12.0}
peerDependencies:
'@rolldown/plugin-babel': ^0.1.7 || ^0.2.0
babel-plugin-react-compiler: ^1.0.0
+ oxc-transform-react: ^0.145.0
vite: ^8.0.0
peerDependenciesMeta:
'@rolldown/plugin-babel':
optional: true
babel-plugin-react-compiler:
optional: true
+ oxc-transform-react:
+ optional: true
- '@vitest/browser-playwright@4.1.10':
- resolution: {integrity: sha512-nMoXGEiRpT7m3W7NsbvrM2aKNwiNHZf+zEpUCvMteGjZFvfT96Q9fh7QyB98dvDWXiKvrLxA7bJ1mCOOv+JQPw==}
+ '@vitest/browser-playwright@4.1.11':
+ resolution: {integrity: sha512-riLBxPqwnJ0lWs2DN2WeUfYeKLoAjbP2Xx8cLQdSddzMi20sksIa6K2mPz79DyMZKKVKH2ksOC2yJvtNcZg8cg==}
peerDependencies:
playwright: 1.62.1
- vitest: 4.1.10
+ vitest: 4.1.11
- '@vitest/browser@4.1.10':
- resolution: {integrity: sha512-UDwuWGwXj646CBx/bQHOaJSX7np0I8JL/UKQYa1e4QrVHH8VdWtx8eaOuf8sy0ShwDgR6NjJAsp5eF6vjF6qng==}
+ '@vitest/browser@4.1.11':
+ resolution: {integrity: sha512-bwMovvAeuTFOK5kIFevw4VEf+1gVEICv4SYK4k3knJOxl6b1zEWud8mYKD73e1B0odAn174h1MofURy2TPWf3w==}
peerDependencies:
- vitest: 4.1.10
+ vitest: 4.1.11
- '@vitest/coverage-v8@4.1.10':
- resolution: {integrity: sha512-IM49HmthevbgAO4anp1hwtoT9wYe59w0LR00gr+eagHE+ZJ5lK4sLPeO0ubgoJcwLk6dehU3R24N+FbEEKDc8g==}
+ '@vitest/coverage-v8@4.1.11':
+ resolution: {integrity: sha512-8MVGEFnJIcdGjcbfKmeq8z0pZHH0JlVtoVZH9Q/qwUp6wyFnEJUBMrw9DCaj+ra3vShGmhavjalMIhPNxZAUcw==}
peerDependencies:
- '@vitest/browser': 4.1.10
- vitest: 4.1.10
+ '@vitest/browser': 4.1.11
+ vitest: 4.1.11
peerDependenciesMeta:
'@vitest/browser':
optional: true
@@ -2138,11 +2346,11 @@ packages:
'@vitest/expect@3.2.4':
resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==}
- '@vitest/expect@4.1.10':
- resolution: {integrity: sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==}
+ '@vitest/expect@4.1.11':
+ resolution: {integrity: sha512-VX2x5vNJXET47KAFzwERI+KRMtTTCSWTfSMKsW7JsUsXV4psq++e3DvZpuTDOpHcxytiDs6p2nhVb2tVDiiUYw==}
- '@vitest/mocker@4.1.10':
- resolution: {integrity: sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==}
+ '@vitest/mocker@4.1.11':
+ resolution: {integrity: sha512-2XJVD55d1o5AZous5CCGKS74g/riOj9odEt2bQpCVZeblHyHdnMeFl4jl0XjU21stf4mbjUkew2eXQZt65g5CQ==}
peerDependencies:
msw: ^2.4.9
vite: ^6.0.0 || ^7.0.0 || ^8.0.0
@@ -2158,22 +2366,28 @@ packages:
'@vitest/pretty-format@4.1.10':
resolution: {integrity: sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==}
+ '@vitest/pretty-format@4.1.11':
+ resolution: {integrity: sha512-yiZzPbGTS9Sr/JpFl8zHrcIkAofNbFV6k21vIgQN/cY/oxZeXhJv5sc/MBJ5jFKWmWs+oJHw0UXLZjmf931+Vw==}
+
'@vitest/runner@4.1.10':
resolution: {integrity: sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==}
- '@vitest/snapshot@4.1.10':
- resolution: {integrity: sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==}
+ '@vitest/runner@4.1.11':
+ resolution: {integrity: sha512-LztvUgdwMNJMIkj3hQnnxiC2Xy1zNxq928W/xhjCLaNCzqTZOudjwbQf6v9IntZGPw132i2Lq2rgTRZHD3JHNw==}
+
+ '@vitest/snapshot@4.1.11':
+ resolution: {integrity: sha512-pN7ikn1ON7h8ee4gIAp4AzyK+zBtJPzVbqOgu5LCEh4VaJVbPQcgYQYJIMGQPXVeJJq1fnfazis7a5pFNPahog==}
'@vitest/spy@3.2.4':
resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==}
- '@vitest/spy@4.1.10':
- resolution: {integrity: sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==}
+ '@vitest/spy@4.1.11':
+ resolution: {integrity: sha512-apNa/prQy2qCeywhnixOHPRCgGNhvg7T4Dapfl1GahLp/R+uhBm5cPyFoNVyqsNd2h1nJxL6BqqdIjiABL60YA==}
- '@vitest/ui@4.1.10':
- resolution: {integrity: sha512-EOUqfXHTXtpSHsyLHH40ts3Ue+hRhSGwzwzMlK0dTEOLSDYyOXLyr5JDGmHQWhN2DYI30gw6dVx3cdgM9FZl+Q==}
+ '@vitest/ui@4.1.11':
+ resolution: {integrity: sha512-r/rwyKoev21mWdRGSEkZOqkQ2BYy68mwjihg9M90nNRbf4NGrgzZ4cj6JNCEwlOGJkbKeMgsjlykvwKUbRr7gw==}
peerDependencies:
- vitest: 4.1.10
+ vitest: 4.1.11
'@vitest/utils@3.2.4':
resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==}
@@ -2181,6 +2395,9 @@ packages:
'@vitest/utils@4.1.10':
resolution: {integrity: sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==}
+ '@vitest/utils@4.1.11':
+ resolution: {integrity: sha512-zTCVGpyFsGWBhllOyKlTw/vnr6D9qxsfSDyfbyZmTyjHw5N/VuvzHpHoQjm2ZJzn4RJgx5w4r7V0er69CmLgPQ==}
+
'@volar/language-core@2.4.28':
resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==}
@@ -2375,7 +2592,7 @@ packages:
engines: {node: ^10 || ^12 || >=14}
hasBin: true
peerDependencies:
- postcss: ^8.5.10
+ postcss: ^8.4.31
available-typed-arrays@1.0.7:
resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
@@ -2607,6 +2824,9 @@ packages:
colorjs.io@0.5.2:
resolution: {integrity: sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==}
+ colorjs.io@0.7.1:
+ resolution: {integrity: sha512-LY7OHnJZxHwT5UlzNa9bbhHHDbzB6yE5+3MIPwJEQKRvSCt/T4G7epsj+9j2BExUIIfXFIJGsIXUKdfrK9Q5tA==}
+
combined-stream@1.0.8:
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
engines: {node: '>= 0.8'}
@@ -2641,8 +2861,8 @@ packages:
concat-map@0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
- concurrently@10.0.4:
- resolution: {integrity: sha512-trZql+7l/0+WRAsAnEdctr4+iiOS6ZrViI6H8QWcCF9MFS/LT0dKpe8vluB1to6it+OxSI4VospFTIFMW8DJRw==}
+ concurrently@10.0.5:
+ resolution: {integrity: sha512-JaP/CoftUrCcAFW/g//RbgEGwlelnEae6cfBLgH6ZdO6s8jPkn6p9SB9u6pdVxYXoiSnFqseOlHfrEfF82TVOg==}
engines: {node: '>=22'}
hasBin: true
@@ -3015,8 +3235,8 @@ packages:
resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==}
engines: {node: '>= 0.4'}
- esbuild@0.28.1:
- resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==}
+ esbuild@0.28.2:
+ resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==}
engines: {node: '>=18'}
hasBin: true
@@ -3102,6 +3322,7 @@ packages:
eslint@9.39.2:
resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options.
hasBin: true
peerDependencies:
jiti: '*'
@@ -3148,9 +3369,9 @@ packages:
resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
engines: {node: '>=0.8.x'}
- eventsource-parser@3.1.0:
- resolution: {integrity: sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==}
- engines: {node: '>=18.0.0'}
+ eventsource-parser@4.1.0:
+ resolution: {integrity: sha512-+DHvQ1wLO//MK+1OZgcuXCbZFKgu3YjKPJt7n98rxX8vezL0ni+7s3ZQiM8bJkUEOk7MsuCycrPLj0FzUNf7Og==}
+ engines: {node: '>=22.12'}
expand-template@2.0.3:
resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==}
@@ -3447,8 +3668,8 @@ packages:
hermes-parser@0.25.1:
resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==}
- highlight.js@11.11.1:
- resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==}
+ highlight.js@11.12.0:
+ resolution: {integrity: sha512-nbfWpyRMcMrPMmDwJB+dhX/eiaPKtc2RB+0QZskqJ3WjRA/FDS0e9hZrx8EC/lbEv8gXy98FcDbNa/dspAaJMg==}
engines: {node: '>=12.0.0'}
hookified@1.15.1:
@@ -3495,7 +3716,7 @@ packages:
resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==}
engines: {node: ^10 || ^12 || >= 14}
peerDependencies:
- postcss: ^8.5.10
+ postcss: ^8.4.31
ieee754@1.2.1:
resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
@@ -3997,8 +4218,8 @@ packages:
map-stream@0.0.7:
resolution: {integrity: sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==}
- marked@18.0.9:
- resolution: {integrity: sha512-/Sa4qiiHZxf0/FQdBBowr9q4r10krCwMvpK48FUBdXdUXScDxiQGR9zCPrFgRVR5LU3iySOiIjy09ZQvADir1w==}
+ marked@18.0.11:
+ resolution: {integrity: sha512-HnslJfsZkRPBDJRHvVtAaWlZHEpSu7u8LgQuJCELjRKuWR+hpq4A7sLq3p8HaI9ypVoXDXxV34CsQJEe1+J5Aw==}
engines: {node: '>= 20'}
hasBin: true
@@ -4110,8 +4331,8 @@ packages:
resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==}
hasBin: true
- nanoid@3.3.16:
- resolution: {integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==}
+ nanoid@3.3.18:
+ resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
@@ -4255,8 +4476,8 @@ packages:
resolution: {integrity: sha512-bkgD4qHlN7WxLdX8bLXdaU54TtQtAIg/ZBAfm0aje/mo3MRDo3P0hZSgr4U7O3xfX+fQmR5AP04JS/TGcZLcFA==}
engines: {node: ^20.19.0 || >=22.12.0}
- oxc-resolver@11.24.2:
- resolution: {integrity: sha512-FY91FiDBj7ls5MsFS9jN3tjz2o0/zsdSsymlakySaBwVJZorHhkWyICLZMKxlu1R9vYo+sd3z1jwb4J8x7bNDw==}
+ oxc-resolver@11.21.2:
+ resolution: {integrity: sha512-w5tLwYN3Zo24w5EeWJjJWZOwhYqTtC8PS2B1tIt7BZUuqTIcU07sQValbDw+rq7+AuAGzOHklgK+ifsy4lpXfw==}
p-limit@3.1.0:
resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
@@ -4341,6 +4562,9 @@ packages:
pend@1.2.0:
resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
+ picocolors@0.2.1:
+ resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==}
+
picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
@@ -4400,31 +4624,31 @@ packages:
resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==}
engines: {node: ^10 || ^12 || >= 14}
peerDependencies:
- postcss: ^8.5.10
+ postcss: ^8.4.31
postcss-modules-local-by-default@4.2.0:
resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==}
engines: {node: ^10 || ^12 || >= 14}
peerDependencies:
- postcss: ^8.5.10
+ postcss: ^8.4.31
postcss-modules-scope@3.2.1:
resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==}
engines: {node: ^10 || ^12 || >= 14}
peerDependencies:
- postcss: ^8.5.10
+ postcss: ^8.4.31
postcss-modules-values@4.0.0:
resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==}
engines: {node: ^10 || ^12 || >= 14}
peerDependencies:
- postcss: ^8.5.10
+ postcss: ^8.4.31
postcss-modules@9.0.1:
resolution: {integrity: sha512-BrSXxWSls23TzqMuplpeMRL5VHnDOLh2H9EiHNTMIdLBFumJcurDIi47TBuvkn9GsoTLAoPjv2wLzAt1wdQ2aQ==}
engines: {node: '>=20.6'}
peerDependencies:
- postcss: ^8.5.10
+ postcss: ^8.4.31
postcss-resolve-nested-selector@0.1.6:
resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==}
@@ -4439,7 +4663,7 @@ packages:
resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==}
engines: {node: '>=12.0'}
peerDependencies:
- postcss: ^8.5.10
+ postcss: ^8.4.31
postcss-selector-parser@7.1.4:
resolution: {integrity: sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==}
@@ -4451,8 +4675,12 @@ packages:
postcss-value-parser@4.2.0:
resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
- postcss@8.5.25:
- resolution: {integrity: sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==}
+ postcss@7.0.39:
+ resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==}
+ engines: {node: '>=6.0.0'}
+
+ postcss@8.5.26:
+ resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==}
engines: {node: ^10 || ^12 || >=14}
prebuild-install@7.1.3:
@@ -4584,10 +4812,14 @@ packages:
peerDependencies:
react: ^19.2.8
- react-error-boundary@6.1.2:
- resolution: {integrity: sha512-3DpCr5HVdZ0caUjYE/kIHBEJN0mNP3ZCgf16c48uJ5TbWjorKVp+YG8W3XqlJ7vJAVNw6wNIImyPXmFydwmyng==}
+ react-error-boundary@6.1.3:
+ resolution: {integrity: sha512-GnSKpCohFi2nQmJCWwP8O8wub7zexlePvpsejvQr35vS5RTouS1+utTNOmyc540yw5vyOXnSL1rBWsCQDmkyUA==}
peerDependencies:
+ '@types/react': ^18.0.0 || ^19.0.0
react: ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
react-is@16.13.1:
resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
@@ -4694,6 +4926,11 @@ packages:
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
+ rolldown@1.2.6:
+ resolution: {integrity: sha512-vMM4q3aixf46GiF1Kok8jDPFsEpXgFWGjUHXNkNHNm+Y2adXAG2dbX91jkti3i0ZRsOlcmbuzAz1poObSHCmUA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+
rollup@4.61.1:
resolution: {integrity: sha512-I4KW6iuRpuu2uHBLraZ1wNZe0DP7lnRha+VJ9tNaYVaVgKhW0aI3h4RYnoRPeql0flHm/Co55b7snEDcOfOJrA==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
@@ -4741,130 +4978,125 @@ packages:
safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
- sass-embedded-all-unknown@1.100.0:
- resolution: {integrity: sha512-auFtXY/kwYILmSVjtBDwyj0axcLbYYiffOKWoaXHnI5bsYwiRbBh3EneR1rpbX2ZIZCrwX93i5pxKLTZF/662Q==}
+ sass-embedded-all-unknown@1.103.1:
+ resolution: {integrity: sha512-MwX2ap06TbImAqlbnH6EndgBBejk6Eq2QB6Ae2hukCn9wmXf9cRu27um3mz3tyB4oJOOku0xfHqFH/+ckYj6YA==}
cpu: ['!arm', '!arm64', '!riscv64', '!x64']
- sass-embedded-android-arm64@1.100.0:
- resolution: {integrity: sha512-W+Ru9JwTnfU0UX3jSZcbqFdtKFMcYdfFwytc57h2DgnqCOIiAqI2E06mABZBZC+r3LwXCBuS5GbXAGeVgvVDkA==}
+ sass-embedded-android-arm64@1.103.1:
+ resolution: {integrity: sha512-jBXWMksyz55XeLOWvQs64BqiG5DcqflmMxcvMoA2oHtQT/7XZ02hBn502qpcF/q8Qd+qqG/hU5ccM+hGXrbQZw==}
engines: {node: '>=14.0.0'}
cpu: [arm64]
os: [android]
- sass-embedded-android-arm@1.100.0:
- resolution: {integrity: sha512-70f3HgX2pFNmzpGQ86n5e6QfWn2fP4QUQGfFQK0P1XH73ZLIzLo2YqygrGKGKeeqtc5eU2Wl1/xQzhzuKnO4kw==}
+ sass-embedded-android-arm@1.103.1:
+ resolution: {integrity: sha512-p36WHpsu5HEo2+NVNbI2Nmb8VgVH0xwOQyzghvZhF7ikGCzEVYI5BP28vHUZlCcgj2TUvMEJKI2lV336a+F/sg==}
engines: {node: '>=14.0.0'}
cpu: [arm]
os: [android]
- sass-embedded-android-riscv64@1.100.0:
- resolution: {integrity: sha512-icU3o0V/uCSytSpf+tX5Lf51BvyQEbLzDUJfUi9etSauYBGHpPKkdtdZH0si4v98phq11Kl8rSV1SggksxF1Hg==}
+ sass-embedded-android-riscv64@1.103.1:
+ resolution: {integrity: sha512-rzrH7RNntk0rx+zCE9xOiAIUt37D1cQKvFfcoX0xiePdGbNHBN8DWKaWN9vaCRfbgKCmxPjevzaqFNI/G/8E1A==}
engines: {node: '>=14.0.0'}
cpu: [riscv64]
os: [android]
- sass-embedded-android-x64@1.100.0:
- resolution: {integrity: sha512-mevF9VQk6gEYByy8+jusaHGmd7Usb2ytX/DsEOd0JtOGCtcf1kh575xJ6OUBDIcJ15uLnbau/0iy1eP6WVBvWA==}
+ sass-embedded-android-x64@1.103.1:
+ resolution: {integrity: sha512-EQglAJXJutuIcqgZf7YOwzao2ND6ow/OgqN+cM48/Qaeb6AimYmZiUJmM9FFcmS3Q2n1k6/2OU3l3Hlin7bFpw==}
engines: {node: '>=14.0.0'}
cpu: [x64]
os: [android]
- sass-embedded-darwin-arm64@1.100.0:
- resolution: {integrity: sha512-1PVlYi61POo93IT/FfrG1mc1tAHxeSTyUALF2aOFmXGWjVXr3bQzEQiBGCOvQbj/ix+5hNyXFXcEMEyKvtUJJA==}
+ sass-embedded-darwin-arm64@1.103.1:
+ resolution: {integrity: sha512-rlaBeCul8pLbDRKdBAxdDxSBwFU5fbX42ci6CxW2Vbs34jWTMQ72+nE2v2KkGGce+JnYbb7UV6xDP/4uDWWi+w==}
engines: {node: '>=14.0.0'}
cpu: [arm64]
os: [darwin]
- sass-embedded-darwin-x64@1.100.0:
- resolution: {integrity: sha512-x97o3JnGyImZNCIVs9wQHJUE5QCvmVIKaH1cwrz/5dK7OT1FpeNiW+u9TUomP9hG6Ekjd8EL8NBHpxTfIhdjmg==}
+ sass-embedded-darwin-x64@1.103.1:
+ resolution: {integrity: sha512-VSKFfhI//AOct6ppFmAaSH7tlW2LOFECMGs77jIoWf0ZjvGch/3sc9lUTTdIaYIOnTS4qpZck+8OcI2D0G92QA==}
engines: {node: '>=14.0.0'}
cpu: [x64]
os: [darwin]
- sass-embedded-linux-arm64@1.100.0:
- resolution: {integrity: sha512-Dwjmj8Z6VRy7rAi53JAdEwIyUjpfl7PhpSc2/LpQPQx+aO5Dp7Spaipkax0ufJl1SoDUdchCsM4y/88YaluorQ==}
+ sass-embedded-linux-arm64@1.103.1:
+ resolution: {integrity: sha512-rC+80/Xr9svo0ka2Zr/sjD+N1zEHTw2Urm/nsEjaVp5HSH2i22jwhTKTIqie2OLl6ti+qdYnbI0sSfxOYRtgrg==}
engines: {node: '>=14.0.0'}
cpu: [arm64]
os: [linux]
libc: glibc
- sass-embedded-linux-arm@1.100.0:
- resolution: {integrity: sha512-9Ul7O1eKrc5YlhwWjkp8tZPSe3UEwSZ1uwUZOQom1HL0pRlBA6F/IlGZYFTLwnHMIP1fc77MMNaBRfc05mKMpw==}
+ sass-embedded-linux-arm@1.103.1:
+ resolution: {integrity: sha512-tJRLPUtBwXHTnBnG7I39gQvCLreuOHLLCMyKHPR1hQ7aFNwiZjADYzKMRQPNMUqti/Os9z+6I7V13FqgQHfuzg==}
engines: {node: '>=14.0.0'}
cpu: [arm]
os: [linux]
libc: glibc
- sass-embedded-linux-musl-arm64@1.100.0:
- resolution: {integrity: sha512-XpACJB2KjSLjf2e9uuvGVdOURsoNrFqgRiihhXyUHK9W0t3LIHb7z5MA/7XGPIT9bWSOO2zyw+rH/FHtDV/Yrg==}
+ sass-embedded-linux-musl-arm64@1.103.1:
+ resolution: {integrity: sha512-jMgG/C/VMo7+ShMFdk0xjJmQmYkj1PbJu/yrQiaQHpuo5pE2G+vnkEgsuM5EM3lTQ4MbMfnf715qy1fkbNPiUQ==}
engines: {node: '>=14.0.0'}
cpu: [arm64]
os: [linux]
libc: musl
- sass-embedded-linux-musl-arm@1.100.0:
- resolution: {integrity: sha512-sl0JgbGloPyJg66XXx5UDSDScZ0oU85DpMQU4JU/sCUCFj1Z8zZ69SJWKTCNE4/jwnce7WI2zPCV5AG+RHOZJw==}
+ sass-embedded-linux-musl-arm@1.103.1:
+ resolution: {integrity: sha512-N8L/kgVzXpnH+8d6ErIzqvb0l8kHODR3OfPaf0Azw6DOLGtEjwDRUbHno+G7iogGzyPOjKsM8OdyqHJj/bpTdw==}
engines: {node: '>=14.0.0'}
cpu: [arm]
os: [linux]
libc: musl
- sass-embedded-linux-musl-riscv64@1.100.0:
- resolution: {integrity: sha512-ShvI0Kx04mwoCARwZ0UjiT97isQvzO80tAt91zmFyHLN9kelc/IrQi940farSm2xQVPCKdeVyeG0ekBsokSpYQ==}
+ sass-embedded-linux-musl-riscv64@1.103.1:
+ resolution: {integrity: sha512-LZm8rEvI6sKU87qPOlODsYeAs7CmWy0B4ShYkjG4OMcGCcV4Ffxn25XW4TFqmruThITQvJ8WT+WGblzdoxYgbA==}
engines: {node: '>=14.0.0'}
cpu: [riscv64]
os: [linux]
libc: musl
- sass-embedded-linux-musl-x64@1.100.0:
- resolution: {integrity: sha512-TDBCRWNuS4RDLQXvRc1gjZlWiWTWaWGp0Bwu/IKwJxov81lsvrCs3TihTyNXtW7V5aoN4Ky3r0QOkNb3mwmBnA==}
+ sass-embedded-linux-musl-x64@1.103.1:
+ resolution: {integrity: sha512-rmKzgk4t6RpaDhSefbbnk5yrA4pk1nHlVhJECGay8yMfzK8eglATeY9fzPgt89xCuQk6rkOiy11e+m8tLYOW5Q==}
engines: {node: '>=14.0.0'}
cpu: [x64]
os: [linux]
libc: musl
- sass-embedded-linux-riscv64@1.100.0:
- resolution: {integrity: sha512-j4ENJGOheO+fm3j/yorLxCjBP6/XskrZx7dTLlT+lXYwN/qqCqoA/gsNLI0McS3DFM6GBwPiffzWsdWS8t6sEQ==}
+ sass-embedded-linux-riscv64@1.103.1:
+ resolution: {integrity: sha512-xydQmtxla31uMrmN6z+mAogVGdEMDmkUElVq2+udomX/TPZDYJBkApEyJl237M2VLWVv29v1N4U4i2Z4xa7SDA==}
engines: {node: '>=14.0.0'}
cpu: [riscv64]
os: [linux]
libc: glibc
- sass-embedded-linux-x64@1.100.0:
- resolution: {integrity: sha512-0vUSN8j0WGtCJIOPh//EmUvYGHW0QOe5iul8qyhPk50MAcw49MA0r34AhftjDdx94ILPF6vApFs0gwHPQRlpVA==}
+ sass-embedded-linux-x64@1.103.1:
+ resolution: {integrity: sha512-Rln1oWm0MWKzzemOgQWrRFzfVBARwS9qxAidZPpCQHSohzPnWizFkmY1CUJad/YJNsA7sscueMdX63OEvxoM8w==}
engines: {node: '>=14.0.0'}
cpu: [x64]
os: [linux]
libc: glibc
- sass-embedded-unknown-all@1.100.0:
- resolution: {integrity: sha512-c+naBgWId4MIpToXcI0DgqetjdAkwTTAxFAuOaBz7HUXLdyG1oZRrEvSsbe41nEdQOKH0vgofVFCeSQgoXOG9A==}
+ sass-embedded-unknown-all@1.103.1:
+ resolution: {integrity: sha512-p7kI4US8+n+YguKczXh+4KcodJnk+8cwv+QFdvMaz3OfPrdHV0EnhPsaVDWD9qXb1XXCEdUhpp6vQwGk3eKc3A==}
os: ['!android', '!darwin', '!linux', '!win32']
- sass-embedded-win32-arm64@1.100.0:
- resolution: {integrity: sha512-iE+yxj+hUXwwbqpHkXxgAWTzeRfcWxJ7SSTQEPMk48lwq3oCrWLlz5sQuWHbuTK/i0GKQfROdP+hOmPi89yjUg==}
+ sass-embedded-win32-arm64@1.103.1:
+ resolution: {integrity: sha512-/0renOj3SpZGu4TA8CZJ6qZbTxGZk1khkPfiBTmV1uFB40ESYM5VsdXNj76P07bsAjIj9X2fCjTafLQFLSd9Nw==}
engines: {node: '>=14.0.0'}
cpu: [arm64]
os: [win32]
- sass-embedded-win32-x64@1.100.0:
- resolution: {integrity: sha512-qI4F8MI7/KYoy9NdjJfhSspG42WPkADSNDvwEV7qWvCSFC83koJssRsKO2/PfY+niZz6BG65Ic/D+A11h959hw==}
+ sass-embedded-win32-x64@1.103.1:
+ resolution: {integrity: sha512-fIg60j9u5YlLUU3W8FvySMR4HHIo9R12HHFQTW7njyQ8nXqgR+t+XfCzGJloQka8g583BlAfu31Q76Ljr5o+9g==}
engines: {node: '>=14.0.0'}
cpu: [x64]
os: [win32]
- sass-embedded@1.100.0:
- resolution: {integrity: sha512-Ut8wlQSk19tm7jMK6mz6cF1+e+E7tUnW2tM02zQDPnOTcVbV8qCQG8UWxZkkNlY50+hV3hqP24OOkUlMz8xBpw==}
- engines: {node: '>=16.0.0'}
- hasBin: true
-
- sass@1.100.0:
- resolution: {integrity: sha512-B5j0rYMlinhhOo9tjQebMVVn0TfyXAF+wB3b2ggZUuJ/is/Y+7+JGjirAMxHZ9Z3hIP98NPfamlAkBHa1lAaXQ==}
+ sass-embedded@1.103.1:
+ resolution: {integrity: sha512-UVIuFZPzz+4DXYbHzQ5gKaKkyP2IH3Sc/WoF63N2V7QIfnC2E9UpQAtiKlCVJTfBe43HRgHDBLnXpZkYAEBsNQ==}
engines: {node: '>=20.19.0'}
hasBin: true
- sass@1.102.0:
- resolution: {integrity: sha512-NSOyTnaQF7rTAEOtI2fwb386vL+akyiQLBZu8Na7hXCb+umJy0GAqlcMIaqACZ6Z1VgTBS4K9PG6B3IdjHGJsw==}
+ sass@1.103.1:
+ resolution: {integrity: sha512-9icZURbP51S6S0QGoyaeqk9uB06GNWxsFYWfH5RgpFgqK5FA8tJcM3AdVxrZEVJ7dz+L87nG95gBKf4VuaMHGw==}
engines: {node: '>=20.19.0'}
hasBin: true
@@ -5035,8 +5267,8 @@ packages:
resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==}
engines: {node: '>= 0.4'}
- storybook@10.5.6:
- resolution: {integrity: sha512-VhYwqxPySa24CVXKoWD6gCZXx9//DTmo43YpusGuAoHDYj5Osjt8wuBRQVeGoaLUWnHiPWv8S+GYHrJEaBM6Rg==}
+ storybook@10.5.10:
+ resolution: {integrity: sha512-Rz8k9ejFHsi7lbtJTaxZlhCUz4GkbJIKEoKDjXeLfr/ZhXip73E6keKxW0KH8iGeKiCqHAbJCV4YIQrxTOLiig==}
hasBin: true
peerDependencies:
'@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
@@ -5136,8 +5368,8 @@ packages:
stubborn-fs@1.2.5:
resolution: {integrity: sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==}
- style-dictionary@5.5.0:
- resolution: {integrity: sha512-AGkOZtAc3OTz99wlzstrmj5OM5BWOW2IbmXD74sf0MXFPi271TGBdywokgd7bS3L0tKOk9M0FR+R9gnbXRSSfg==}
+ style-dictionary@5.5.2:
+ resolution: {integrity: sha512-OPXsfLzy+8YZrUmlgOGDmTlykL8xWLvhb70bHUvBKkPCY75eQabQsl+Jd4JO8nC/uuz/6UdikCHxagiBdUugtw==}
engines: {node: '>=22.0.0'}
hasBin: true
@@ -5145,7 +5377,7 @@ packages:
resolution: {integrity: sha512-x5DVehzJudcwF0od3sGpgkln2PLLranFE7twwbp7dqDINCyZvwzFkMc6TLhNOvazRiVBJYATQLouJY0xPGB8WA==}
engines: {node: '>=20'}
peerDependencies:
- postcss: ^8.5.10
+ postcss: ^8.4.31
stylelint: ^17.0.0
peerDependenciesMeta:
postcss:
@@ -5161,7 +5393,7 @@ packages:
resolution: {integrity: sha512-uLJS6xgOCBw5EMsDW7Ukji8l28qRoMnkRch15s0qwZpskXvWt9oPzMmcYM307m9GN4MxuWLsQh4I6hU9yI53cQ==}
engines: {node: '>=20'}
peerDependencies:
- postcss: ^8.5.10
+ postcss: ^8.4.31
stylelint: ^17.0.0
peerDependenciesMeta:
postcss:
@@ -5248,8 +5480,8 @@ packages:
resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==}
engines: {node: '>=6'}
- tdigest@0.1.2:
- resolution: {integrity: sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==}
+ tdigest@0.1.3:
+ resolution: {integrity: sha512-zbRt+lT+/H4fRItHshczHErVCQnitJk8MfMT24MqFJf3YL7SJJPqGIGeuOdvxXxM/AHFzKBl7WoyaYwqO9s3Kw==}
text-hex@1.0.0:
resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==}
@@ -5517,13 +5749,13 @@ packages:
vite:
optional: true
- vite@8.2.0:
- resolution: {integrity: sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ==}
+ vite@8.2.2:
+ resolution: {integrity: sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
peerDependencies:
'@types/node': ^20.19.0 || >=22.12.0
- '@vitejs/devtools': ^0.4.0
+ '@vitejs/devtools': ^0.4.0 || ^0.5.0
esbuild: ^0.27.0 || ^0.28.0
jiti: '>=1.21.0'
less: ^4.0.0
@@ -5560,20 +5792,20 @@ packages:
yaml:
optional: true
- vitest@4.1.10:
- resolution: {integrity: sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==}
+ vitest@4.1.11:
+ resolution: {integrity: sha512-fhACrNXUidIbGSBr5FlbuBkO7VWC1ZyLl0DO4CU2DrQoAPxX84Ysxs+HeGQpii5lZWV1Q4gBZTTu49mF+A6Edw==}
engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0}
hasBin: true
peerDependencies:
'@edge-runtime/vm': '*'
'@opentelemetry/api': ^1.9.0
'@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0
- '@vitest/browser-playwright': 4.1.10
- '@vitest/browser-preview': 4.1.10
- '@vitest/browser-webdriverio': 4.1.10
- '@vitest/coverage-istanbul': 4.1.10
- '@vitest/coverage-v8': 4.1.10
- '@vitest/ui': 4.1.10
+ '@vitest/browser-playwright': 4.1.11
+ '@vitest/browser-preview': 4.1.11
+ '@vitest/browser-webdriverio': 4.1.11
+ '@vitest/coverage-istanbul': 4.1.11
+ '@vitest/coverage-v8': 4.1.11
+ '@vitest/ui': 4.1.11
happy-dom: '*'
jsdom: '*'
vite: ^6.0.0 || ^7.0.0 || ^8.0.0
@@ -5701,18 +5933,6 @@ packages:
resolution: {integrity: sha512-OTIk8iR8/aCRWBqvxrzxR0hgxWpnYBblY1S5hDWBQfk/VFmJwzmJgQFN3WsoUKHISv2eAwe+PpbUzyL1CKTLXg==}
engines: {node: ^20.17.0 || >=22.9.0}
- ws@8.21.1:
- resolution: {integrity: sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==}
- engines: {node: '>=10.0.0'}
- peerDependencies:
- bufferutil: ^4.0.1
- utf-8-validate: '>=5.0.2'
- peerDependenciesMeta:
- bufferutil:
- optional: true
- utf-8-validate:
- optional: true
-
ws@8.21.2:
resolution: {integrity: sha512-54dMVAo4WIe6SKy3vBgN+9bJZqqQ8IMRevAkOLQALhi49qkkQDQfWdAZ8KQlXiEabw88ARXXdUrlvtbKQX+aKw==}
engines: {node: '>=10.0.0'}
@@ -6241,7 +6461,7 @@ snapshots:
enabled: 2.0.0
kuler: 2.0.0
- '@emnapi/core@1.11.2':
+ '@emnapi/core@1.11.0':
dependencies:
'@emnapi/wasi-threads': 1.2.2
tslib: 2.8.1
@@ -6259,7 +6479,7 @@ snapshots:
tslib: 2.8.1
optional: true
- '@emnapi/runtime@1.11.2':
+ '@emnapi/runtime@1.11.0':
dependencies:
tslib: 2.8.1
optional: true
@@ -6289,82 +6509,82 @@ snapshots:
tslib: 2.8.1
optional: true
- '@esbuild/aix-ppc64@0.28.1':
+ '@esbuild/aix-ppc64@0.28.2':
optional: true
- '@esbuild/android-arm64@0.28.1':
+ '@esbuild/android-arm64@0.28.2':
optional: true
- '@esbuild/android-arm@0.28.1':
+ '@esbuild/android-arm@0.28.2':
optional: true
- '@esbuild/android-x64@0.28.1':
+ '@esbuild/android-x64@0.28.2':
optional: true
- '@esbuild/darwin-arm64@0.28.1':
+ '@esbuild/darwin-arm64@0.28.2':
optional: true
- '@esbuild/darwin-x64@0.28.1':
+ '@esbuild/darwin-x64@0.28.2':
optional: true
- '@esbuild/freebsd-arm64@0.28.1':
+ '@esbuild/freebsd-arm64@0.28.2':
optional: true
- '@esbuild/freebsd-x64@0.28.1':
+ '@esbuild/freebsd-x64@0.28.2':
optional: true
- '@esbuild/linux-arm64@0.28.1':
+ '@esbuild/linux-arm64@0.28.2':
optional: true
- '@esbuild/linux-arm@0.28.1':
+ '@esbuild/linux-arm@0.28.2':
optional: true
- '@esbuild/linux-ia32@0.28.1':
+ '@esbuild/linux-ia32@0.28.2':
optional: true
- '@esbuild/linux-loong64@0.28.1':
+ '@esbuild/linux-loong64@0.28.2':
optional: true
- '@esbuild/linux-mips64el@0.28.1':
+ '@esbuild/linux-mips64el@0.28.2':
optional: true
- '@esbuild/linux-ppc64@0.28.1':
+ '@esbuild/linux-ppc64@0.28.2':
optional: true
- '@esbuild/linux-riscv64@0.28.1':
+ '@esbuild/linux-riscv64@0.28.2':
optional: true
- '@esbuild/linux-s390x@0.28.1':
+ '@esbuild/linux-s390x@0.28.2':
optional: true
- '@esbuild/linux-x64@0.28.1':
+ '@esbuild/linux-x64@0.28.2':
optional: true
- '@esbuild/netbsd-arm64@0.28.1':
+ '@esbuild/netbsd-arm64@0.28.2':
optional: true
- '@esbuild/netbsd-x64@0.28.1':
+ '@esbuild/netbsd-x64@0.28.2':
optional: true
- '@esbuild/openbsd-arm64@0.28.1':
+ '@esbuild/openbsd-arm64@0.28.2':
optional: true
- '@esbuild/openbsd-x64@0.28.1':
+ '@esbuild/openbsd-x64@0.28.2':
optional: true
- '@esbuild/openharmony-arm64@0.28.1':
+ '@esbuild/openharmony-arm64@0.28.2':
optional: true
- '@esbuild/sunos-x64@0.28.1':
+ '@esbuild/sunos-x64@0.28.2':
optional: true
- '@esbuild/win32-arm64@0.28.1':
+ '@esbuild/win32-arm64@0.28.2':
optional: true
- '@esbuild/win32-ia32@0.28.1':
+ '@esbuild/win32-ia32@0.28.2':
optional: true
- '@esbuild/win32-x64@0.28.1':
+ '@esbuild/win32-x64@0.28.2':
optional: true
'@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(supports-color@10.2.2))':
@@ -6459,11 +6679,11 @@ snapshots:
dependencies:
'@swc/helpers': 0.5.23
- '@joshwooding/vite-plugin-react-docgen-typescript@0.7.0(typescript@6.0.3)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))':
+ '@joshwooding/vite-plugin-react-docgen-typescript@0.7.0(typescript@6.0.3)(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))':
dependencies:
glob: 13.0.6
react-docgen-typescript: 2.4.0(typescript@6.0.3)
- vite: 8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0)
+ vite: 8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1)
optionalDependencies:
typescript: 6.0.3
@@ -6628,24 +6848,24 @@ snapshots:
'@types/react': 19.2.18
react: 19.2.8
- '@microsoft/api-extractor-model@7.32.2(@types/node@26.1.2)':
+ '@microsoft/api-extractor-model@7.32.2(@types/node@26.4.0)':
dependencies:
'@microsoft/tsdoc': 0.16.0
'@microsoft/tsdoc-config': 0.18.1
- '@rushstack/node-core-library': 5.19.1(@types/node@26.1.2)
+ '@rushstack/node-core-library': 5.19.1(@types/node@26.4.0)
transitivePeerDependencies:
- '@types/node'
optional: true
- '@microsoft/api-extractor@7.56.2(@types/node@26.1.2)':
+ '@microsoft/api-extractor@7.56.2(@types/node@26.4.0)':
dependencies:
- '@microsoft/api-extractor-model': 7.32.2(@types/node@26.1.2)
+ '@microsoft/api-extractor-model': 7.32.2(@types/node@26.4.0)
'@microsoft/tsdoc': 0.16.0
'@microsoft/tsdoc-config': 0.18.1
- '@rushstack/node-core-library': 5.19.1(@types/node@26.1.2)
+ '@rushstack/node-core-library': 5.19.1(@types/node@26.4.0)
'@rushstack/rig-package': 0.6.0
- '@rushstack/terminal': 0.21.0(@types/node@26.1.2)
- '@rushstack/ts-command-line': 5.2.0(@types/node@26.1.2)
+ '@rushstack/terminal': 0.21.0(@types/node@26.4.0)
+ '@rushstack/ts-command-line': 5.2.0(@types/node@26.4.0)
diff: 8.0.4
lodash: 4.18.1
minimatch: 10.2.5
@@ -6668,10 +6888,10 @@ snapshots:
'@microsoft/tsdoc@0.16.0':
optional: true
- '@napi-rs/wasm-runtime@1.2.2(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)':
+ '@napi-rs/wasm-runtime@1.2.2(@emnapi/core@1.11.0)(@emnapi/runtime@1.11.0)':
dependencies:
- '@emnapi/core': 1.11.2
- '@emnapi/runtime': 1.11.2
+ '@emnapi/core': 1.11.0
+ '@emnapi/runtime': 1.11.0
'@tybys/wasm-util': 0.10.3
optional: true
@@ -6769,67 +6989,70 @@ snapshots:
'@oxc-project/types@0.127.0': {}
- '@oxc-project/types@0.142.0': {}
-
- '@oxc-resolver/binding-android-arm-eabi@11.24.2':
+ '@oxc-project/types@0.142.0':
optional: true
- '@oxc-resolver/binding-android-arm64@11.24.2':
+ '@oxc-project/types@0.147.0': {}
+
+ '@oxc-resolver/binding-android-arm-eabi@11.21.2':
optional: true
- '@oxc-resolver/binding-darwin-arm64@11.24.2':
+ '@oxc-resolver/binding-android-arm64@11.21.2':
optional: true
- '@oxc-resolver/binding-darwin-x64@11.24.2':
+ '@oxc-resolver/binding-darwin-arm64@11.21.2':
optional: true
- '@oxc-resolver/binding-freebsd-x64@11.24.2':
+ '@oxc-resolver/binding-darwin-x64@11.21.2':
optional: true
- '@oxc-resolver/binding-linux-arm-gnueabihf@11.24.2':
+ '@oxc-resolver/binding-freebsd-x64@11.21.2':
optional: true
- '@oxc-resolver/binding-linux-arm-musleabihf@11.24.2':
+ '@oxc-resolver/binding-linux-arm-gnueabihf@11.21.2':
optional: true
- '@oxc-resolver/binding-linux-arm64-gnu@11.24.2':
+ '@oxc-resolver/binding-linux-arm-musleabihf@11.21.2':
optional: true
- '@oxc-resolver/binding-linux-arm64-musl@11.24.2':
+ '@oxc-resolver/binding-linux-arm64-gnu@11.21.2':
optional: true
- '@oxc-resolver/binding-linux-ppc64-gnu@11.24.2':
+ '@oxc-resolver/binding-linux-arm64-musl@11.21.2':
optional: true
- '@oxc-resolver/binding-linux-riscv64-gnu@11.24.2':
+ '@oxc-resolver/binding-linux-ppc64-gnu@11.21.2':
optional: true
- '@oxc-resolver/binding-linux-riscv64-musl@11.24.2':
+ '@oxc-resolver/binding-linux-riscv64-gnu@11.21.2':
optional: true
- '@oxc-resolver/binding-linux-s390x-gnu@11.24.2':
+ '@oxc-resolver/binding-linux-riscv64-musl@11.21.2':
optional: true
- '@oxc-resolver/binding-linux-x64-gnu@11.24.2':
+ '@oxc-resolver/binding-linux-s390x-gnu@11.21.2':
optional: true
- '@oxc-resolver/binding-linux-x64-musl@11.24.2':
+ '@oxc-resolver/binding-linux-x64-gnu@11.21.2':
optional: true
- '@oxc-resolver/binding-openharmony-arm64@11.24.2':
+ '@oxc-resolver/binding-linux-x64-musl@11.21.2':
optional: true
- '@oxc-resolver/binding-wasm32-wasi@11.24.2':
+ '@oxc-resolver/binding-openharmony-arm64@11.21.2':
+ optional: true
+
+ '@oxc-resolver/binding-wasm32-wasi@11.21.2':
dependencies:
- '@emnapi/core': 1.11.2
- '@emnapi/runtime': 1.11.2
- '@napi-rs/wasm-runtime': 1.2.2(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)
+ '@emnapi/core': 1.11.0
+ '@emnapi/runtime': 1.11.0
+ '@napi-rs/wasm-runtime': 1.2.2(@emnapi/core@1.11.0)(@emnapi/runtime@1.11.0)
optional: true
- '@oxc-resolver/binding-win32-arm64-msvc@11.24.2':
+ '@oxc-resolver/binding-win32-arm64-msvc@11.21.2':
optional: true
- '@oxc-resolver/binding-win32-x64-msvc@11.24.2':
+ '@oxc-resolver/binding-win32-x64-msvc@11.21.2':
optional: true
'@parcel/watcher-android-arm64@2.6.0':
@@ -6960,42 +7183,81 @@ snapshots:
'@resvg/resvg-js-win32-ia32-msvc': 2.6.2
'@resvg/resvg-js-win32-x64-msvc': 2.6.2
+ '@rolldown/binding-android-arm-eabi@1.2.6':
+ optional: true
+
'@rolldown/binding-android-arm64@1.2.1':
optional: true
+ '@rolldown/binding-android-arm64@1.2.6':
+ optional: true
+
'@rolldown/binding-darwin-arm64@1.2.1':
optional: true
+ '@rolldown/binding-darwin-arm64@1.2.6':
+ optional: true
+
'@rolldown/binding-darwin-x64@1.2.1':
optional: true
+ '@rolldown/binding-darwin-x64@1.2.6':
+ optional: true
+
'@rolldown/binding-freebsd-x64@1.2.1':
optional: true
+ '@rolldown/binding-freebsd-x64@1.2.6':
+ optional: true
+
'@rolldown/binding-linux-arm-gnueabihf@1.2.1':
optional: true
+ '@rolldown/binding-linux-arm-gnueabihf@1.2.6':
+ optional: true
+
'@rolldown/binding-linux-arm64-gnu@1.2.1':
optional: true
+ '@rolldown/binding-linux-arm64-gnu@1.2.6':
+ optional: true
+
'@rolldown/binding-linux-arm64-musl@1.2.1':
optional: true
+ '@rolldown/binding-linux-arm64-musl@1.2.6':
+ optional: true
+
'@rolldown/binding-linux-ppc64-gnu@1.2.1':
optional: true
+ '@rolldown/binding-linux-ppc64-gnu@1.2.6':
+ optional: true
+
'@rolldown/binding-linux-s390x-gnu@1.2.1':
optional: true
+ '@rolldown/binding-linux-s390x-gnu@1.2.6':
+ optional: true
+
'@rolldown/binding-linux-x64-gnu@1.2.1':
optional: true
+ '@rolldown/binding-linux-x64-gnu@1.2.6':
+ optional: true
+
'@rolldown/binding-linux-x64-musl@1.2.1':
optional: true
+ '@rolldown/binding-linux-x64-musl@1.2.6':
+ optional: true
+
'@rolldown/binding-openharmony-arm64@1.2.1':
optional: true
+ '@rolldown/binding-openharmony-arm64@1.2.6':
+ optional: true
+
'@rolldown/binding-wasm32-wasi@1.2.1':
dependencies:
'@emnapi/core': 2.0.0-alpha.3
@@ -7006,9 +7268,15 @@ snapshots:
'@rolldown/binding-win32-arm64-msvc@1.2.1':
optional: true
+ '@rolldown/binding-win32-arm64-msvc@1.2.6':
+ optional: true
+
'@rolldown/binding-win32-x64-msvc@1.2.1':
optional: true
+ '@rolldown/binding-win32-x64-msvc@1.2.6':
+ optional: true
+
'@rolldown/pluginutils@1.0.1': {}
'@rollup/pluginutils@5.4.0(rollup@4.61.1)':
@@ -7096,7 +7364,7 @@ snapshots:
'@rtsao/scc@1.1.0': {}
- '@rushstack/node-core-library@5.19.1(@types/node@26.1.2)':
+ '@rushstack/node-core-library@5.19.1(@types/node@26.4.0)':
dependencies:
ajv: 8.20.0
ajv-draft-04: 1.0.0(ajv@8.20.0)
@@ -7107,12 +7375,12 @@ snapshots:
resolve: 1.22.12
semver: 7.5.4
optionalDependencies:
- '@types/node': 26.1.2
+ '@types/node': 26.4.0
optional: true
- '@rushstack/problem-matcher@0.1.1(@types/node@26.1.2)':
+ '@rushstack/problem-matcher@0.1.1(@types/node@26.4.0)':
optionalDependencies:
- '@types/node': 26.1.2
+ '@types/node': 26.4.0
optional: true
'@rushstack/rig-package@0.6.0':
@@ -7121,18 +7389,18 @@ snapshots:
strip-json-comments: 3.1.1
optional: true
- '@rushstack/terminal@0.21.0(@types/node@26.1.2)':
+ '@rushstack/terminal@0.21.0(@types/node@26.4.0)':
dependencies:
- '@rushstack/node-core-library': 5.19.1(@types/node@26.1.2)
- '@rushstack/problem-matcher': 0.1.1(@types/node@26.1.2)
+ '@rushstack/node-core-library': 5.19.1(@types/node@26.4.0)
+ '@rushstack/problem-matcher': 0.1.1(@types/node@26.4.0)
supports-color: 8.1.1
optionalDependencies:
- '@types/node': 26.1.2
+ '@types/node': 26.4.0
optional: true
- '@rushstack/ts-command-line@5.2.0(@types/node@26.1.2)':
+ '@rushstack/ts-command-line@5.2.0(@types/node@26.4.0)':
dependencies:
- '@rushstack/terminal': 0.21.0(@types/node@26.1.2)
+ '@rushstack/terminal': 0.21.0(@types/node@26.4.0)
'@types/argparse': 1.0.38
argparse: 1.0.10
string-argv: 0.3.2
@@ -7149,15 +7417,15 @@ snapshots:
'@standard-schema/spec@1.1.0': {}
- '@storybook/addon-docs@10.5.6(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(esbuild@0.28.1)(rollup@4.61.1)(storybook@10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))':
+ '@storybook/addon-docs@10.5.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(esbuild@0.28.2)(rollup@4.61.1)(storybook@10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))':
dependencies:
'@mdx-js/react': 3.1.1(@types/react@19.2.18)(react@19.2.8)
- '@storybook/csf-plugin': 10.5.6(esbuild@0.28.1)(rollup@4.61.1)(storybook@10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))
+ '@storybook/csf-plugin': 10.5.10(esbuild@0.28.2)(rollup@4.61.1)(storybook@10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))
'@storybook/icons': 2.1.0(react@19.2.8)
- '@storybook/react-dom-shim': 10.5.6(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))
+ '@storybook/react-dom-shim': 10.5.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))
react: 19.2.8
react-dom: 19.2.8(react@19.2.8)
- storybook: 10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8)
+ storybook: 10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8)
ts-dedent: 2.3.0
optionalDependencies:
'@types/react': 19.2.18
@@ -7168,43 +7436,43 @@ snapshots:
- vite
- webpack
- '@storybook/addon-themes@10.5.6(storybook@10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))':
+ '@storybook/addon-themes@10.5.10(storybook@10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))':
dependencies:
- storybook: 10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8)
+ storybook: 10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8)
ts-dedent: 2.3.0
- '@storybook/addon-vitest@10.5.6(@vitest/browser-playwright@4.1.10)(@vitest/browser@4.1.10)(@vitest/runner@4.1.10)(react@19.2.8)(storybook@10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(vitest@4.1.10)':
+ '@storybook/addon-vitest@10.5.10(@vitest/browser-playwright@4.1.11)(@vitest/browser@4.1.11)(@vitest/runner@4.1.10)(react@19.2.8)(storybook@10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(vitest@4.1.11)':
dependencies:
'@storybook/global': 5.0.0
'@storybook/icons': 2.1.0(react@19.2.8)
- storybook: 10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8)
+ storybook: 10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8)
optionalDependencies:
- '@vitest/browser': 4.1.10(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))(vitest@4.1.10)
- '@vitest/browser-playwright': 4.1.10(playwright@1.62.1)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))(vitest@4.1.10)
+ '@vitest/browser': 4.1.11(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))(vitest@4.1.11)
+ '@vitest/browser-playwright': 4.1.11(playwright@1.62.1)(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))(vitest@4.1.11)
'@vitest/runner': 4.1.10
- vitest: 4.1.10(@types/node@26.1.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@vitest/ui@4.1.10)(jsdom@30.0.1(canvas@3.2.3))(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))
+ vitest: 4.1.11(@types/node@26.4.0)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@vitest/ui@4.1.11)(jsdom@30.0.1(canvas@3.2.3))(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))
transitivePeerDependencies:
- react
- '@storybook/builder-vite@10.5.6(esbuild@0.28.1)(rollup@4.61.1)(storybook@10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))':
+ '@storybook/builder-vite@10.5.10(esbuild@0.28.2)(rollup@4.61.1)(storybook@10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))':
dependencies:
- '@storybook/csf-plugin': 10.5.6(esbuild@0.28.1)(rollup@4.61.1)(storybook@10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))
- storybook: 10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8)
+ '@storybook/csf-plugin': 10.5.10(esbuild@0.28.2)(rollup@4.61.1)(storybook@10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))
+ storybook: 10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8)
ts-dedent: 2.3.0
- vite: 8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0)
+ vite: 8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1)
transitivePeerDependencies:
- esbuild
- rollup
- webpack
- '@storybook/csf-plugin@10.5.6(esbuild@0.28.1)(rollup@4.61.1)(storybook@10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))':
+ '@storybook/csf-plugin@10.5.10(esbuild@0.28.2)(rollup@4.61.1)(storybook@10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))':
dependencies:
- storybook: 10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8)
+ storybook: 10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8)
unplugin: 2.3.11
optionalDependencies:
- esbuild: 0.28.1
+ esbuild: 0.28.2
rollup: 4.61.1
- vite: 8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0)
+ vite: 8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1)
'@storybook/global@5.0.0': {}
@@ -7212,30 +7480,39 @@ snapshots:
dependencies:
react: 19.2.8
- '@storybook/react-dom-shim@10.5.6(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))':
+ '@storybook/react-dom-shim@10.5.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))':
dependencies:
react: 19.2.8
react-dom: 19.2.8(react@19.2.8)
- storybook: 10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8)
+ storybook: 10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8)
optionalDependencies:
'@types/react': 19.2.18
'@types/react-dom': 19.2.4(@types/react@19.2.18)
- '@storybook/react-vite@10.5.6(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rollup@4.61.1)(storybook@10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(supports-color@10.2.2)(typescript@6.0.3)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))':
+ '@storybook/react-dom-shim@10.5.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))':
dependencies:
- '@joshwooding/vite-plugin-react-docgen-typescript': 0.7.0(typescript@6.0.3)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))
+ react: 19.2.8
+ react-dom: 19.2.8(react@19.2.8)
+ storybook: 10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8)
+ optionalDependencies:
+ '@types/react': 19.2.18
+ '@types/react-dom': 19.2.5(@types/react@19.2.18)
+
+ '@storybook/react-vite@10.5.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(esbuild@0.28.2)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rollup@4.61.1)(storybook@10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(supports-color@5.5.0)(typescript@6.0.3)(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))':
+ dependencies:
+ '@joshwooding/vite-plugin-react-docgen-typescript': 0.7.0(typescript@6.0.3)(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))
'@rollup/pluginutils': 5.4.0(rollup@4.61.1)
- '@storybook/builder-vite': 10.5.6(esbuild@0.28.1)(rollup@4.61.1)(storybook@10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))
- '@storybook/react': 10.5.6(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(supports-color@10.2.2)(typescript@6.0.3)
+ '@storybook/builder-vite': 10.5.10(esbuild@0.28.2)(rollup@4.61.1)(storybook@10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))
+ '@storybook/react': 10.5.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(supports-color@5.5.0)(typescript@6.0.3)
empathic: 2.0.1
magic-string: 0.30.21
react: 19.2.8
- react-docgen: 8.0.3(supports-color@10.2.2)
+ react-docgen: 8.0.3(supports-color@5.5.0)
react-dom: 19.2.8(react@19.2.8)
resolve: 1.22.12
- storybook: 10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8)
+ storybook: 10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8)
tsconfig-paths: 4.2.0
- vite: 8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0)
+ vite: 8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1)
optionalDependencies:
typescript: 6.0.3
transitivePeerDependencies:
@@ -7246,21 +7523,21 @@ snapshots:
- supports-color
- webpack
- '@storybook/react-vite@10.5.6(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rollup@4.61.1)(storybook@10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(supports-color@5.5.0)(typescript@6.0.3)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))':
+ '@storybook/react-vite@10.5.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(esbuild@0.28.2)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rollup@4.61.1)(storybook@10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(supports-color@10.2.2)(typescript@6.0.3)(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))':
dependencies:
- '@joshwooding/vite-plugin-react-docgen-typescript': 0.7.0(typescript@6.0.3)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))
+ '@joshwooding/vite-plugin-react-docgen-typescript': 0.7.0(typescript@6.0.3)(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))
'@rollup/pluginutils': 5.4.0(rollup@4.61.1)
- '@storybook/builder-vite': 10.5.6(esbuild@0.28.1)(rollup@4.61.1)(storybook@10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))
- '@storybook/react': 10.5.6(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(supports-color@5.5.0)(typescript@6.0.3)
+ '@storybook/builder-vite': 10.5.10(esbuild@0.28.2)(rollup@4.61.1)(storybook@10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))
+ '@storybook/react': 10.5.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(supports-color@10.2.2)(typescript@6.0.3)
empathic: 2.0.1
magic-string: 0.30.21
react: 19.2.8
- react-docgen: 8.0.3(supports-color@5.5.0)
+ react-docgen: 8.0.3(supports-color@10.2.2)
react-dom: 19.2.8(react@19.2.8)
resolve: 1.22.12
- storybook: 10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8)
+ storybook: 10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8)
tsconfig-paths: 4.2.0
- vite: 8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0)
+ vite: 8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1)
optionalDependencies:
typescript: 6.0.3
transitivePeerDependencies:
@@ -7271,15 +7548,15 @@ snapshots:
- supports-color
- webpack
- '@storybook/react@10.5.6(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(supports-color@10.2.2)(typescript@6.0.3)':
+ '@storybook/react@10.5.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(supports-color@5.5.0)(typescript@6.0.3)':
dependencies:
'@storybook/global': 5.0.0
- '@storybook/react-dom-shim': 10.5.6(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))
+ '@storybook/react-dom-shim': 10.5.10(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))
react: 19.2.8
- react-docgen: 8.0.3(supports-color@10.2.2)
+ react-docgen: 8.0.3(supports-color@5.5.0)
react-docgen-typescript: 2.4.0(typescript@6.0.3)
react-dom: 19.2.8(react@19.2.8)
- storybook: 10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8)
+ storybook: 10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8)
optionalDependencies:
'@types/react': 19.2.18
'@types/react-dom': 19.2.4(@types/react@19.2.18)
@@ -7287,18 +7564,18 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@storybook/react@10.5.6(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(supports-color@5.5.0)(typescript@6.0.3)':
+ '@storybook/react@10.5.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))(supports-color@10.2.2)(typescript@6.0.3)':
dependencies:
'@storybook/global': 5.0.0
- '@storybook/react-dom-shim': 10.5.6(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))
+ '@storybook/react-dom-shim': 10.5.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8))
react: 19.2.8
- react-docgen: 8.0.3(supports-color@5.5.0)
+ react-docgen: 8.0.3(supports-color@10.2.2)
react-docgen-typescript: 2.4.0(typescript@6.0.3)
react-dom: 19.2.8(react@19.2.8)
- storybook: 10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8)
+ storybook: 10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8)
optionalDependencies:
'@types/react': 19.2.18
- '@types/react-dom': 19.2.4(@types/react@19.2.18)
+ '@types/react-dom': 19.2.5(@types/react@19.2.18)
typescript: 6.0.3
transitivePeerDependencies:
- supports-color
@@ -7327,7 +7604,7 @@ snapshots:
picocolors: 1.1.1
redent: 3.0.0
- '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
+ '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
dependencies:
'@babel/runtime': 7.29.7
'@testing-library/dom': 10.4.1
@@ -7335,13 +7612,13 @@ snapshots:
react-dom: 19.2.8(react@19.2.8)
optionalDependencies:
'@types/react': 19.2.18
- '@types/react-dom': 19.2.4(@types/react@19.2.18)
+ '@types/react-dom': 19.2.5(@types/react@19.2.18)
'@testing-library/user-event@14.6.3(@testing-library/dom@10.4.1)':
dependencies:
'@testing-library/dom': 10.4.1
- '@tokens-studio/sd-transforms@2.0.3(style-dictionary@5.5.0(tslib@2.8.1))':
+ '@tokens-studio/sd-transforms@2.0.3(style-dictionary@5.5.2(tslib@2.8.1))':
dependencies:
'@bundled-es-modules/deepmerge': 4.3.2
'@bundled-es-modules/postcss-calc-ast-parser': 0.1.6
@@ -7349,7 +7626,7 @@ snapshots:
colorjs.io: 0.5.2
expr-eval-fork: 3.0.3
is-mergeable-object: 1.1.1
- style-dictionary: 5.5.0(tslib@2.8.1)
+ style-dictionary: 5.5.2(tslib@2.8.1)
'@tokens-studio/tokenscript-interpreter@0.26.0':
dependencies:
@@ -7412,13 +7689,18 @@ snapshots:
'@types/mdx@2.0.14': {}
- '@types/node@26.1.2':
+ '@types/node@26.4.0':
dependencies:
undici-types: 8.3.0
'@types/react-dom@19.2.4(@types/react@19.2.18)':
dependencies:
'@types/react': 19.2.18
+ optional: true
+
+ '@types/react-dom@19.2.5(@types/react@19.2.18)':
+ dependencies:
+ '@types/react': 19.2.18
'@types/react@19.2.18':
dependencies:
@@ -7428,47 +7710,47 @@ snapshots:
'@types/triple-beam@1.3.5': {}
- '@vitejs/plugin-react@6.0.5(babel-plugin-react-compiler@1.0.0)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))':
+ '@vitejs/plugin-react@6.1.0(babel-plugin-react-compiler@1.0.0)(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))':
dependencies:
'@rolldown/pluginutils': 1.0.1
- vite: 8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0)
+ vite: 8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1)
optionalDependencies:
babel-plugin-react-compiler: 1.0.0
- '@vitest/browser-playwright@4.1.10(playwright@1.62.1)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))(vitest@4.1.10)':
+ '@vitest/browser-playwright@4.1.11(playwright@1.62.1)(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))(vitest@4.1.11)':
dependencies:
- '@vitest/browser': 4.1.10(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))(vitest@4.1.10)
- '@vitest/mocker': 4.1.10(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))
+ '@vitest/browser': 4.1.11(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))(vitest@4.1.11)
+ '@vitest/mocker': 4.1.11(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))
playwright: 1.62.1
tinyrainbow: 3.1.1
- vitest: 4.1.10(@types/node@26.1.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@vitest/ui@4.1.10)(jsdom@30.0.1(canvas@3.2.3))(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))
+ vitest: 4.1.11(@types/node@26.4.0)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@vitest/ui@4.1.11)(jsdom@30.0.1(canvas@3.2.3))(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))
transitivePeerDependencies:
- bufferutil
- msw
- utf-8-validate
- vite
- '@vitest/browser@4.1.10(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))(vitest@4.1.10)':
+ '@vitest/browser@4.1.11(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))(vitest@4.1.11)':
dependencies:
'@blazediff/core': 1.9.1
- '@vitest/mocker': 4.1.10(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))
- '@vitest/utils': 4.1.10
+ '@vitest/mocker': 4.1.11(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))
+ '@vitest/utils': 4.1.11
magic-string: 0.30.21
pngjs: 7.0.0
sirv: 3.0.2
tinyrainbow: 3.1.1
- vitest: 4.1.10(@types/node@26.1.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@vitest/ui@4.1.10)(jsdom@30.0.1(canvas@3.2.3))(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))
- ws: 8.21.1
+ vitest: 4.1.11(@types/node@26.4.0)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@vitest/ui@4.1.11)(jsdom@30.0.1(canvas@3.2.3))(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))
+ ws: 8.21.2
transitivePeerDependencies:
- bufferutil
- msw
- utf-8-validate
- vite
- '@vitest/coverage-v8@4.1.10(@vitest/browser@4.1.10)(vitest@4.1.10)':
+ '@vitest/coverage-v8@4.1.11(@vitest/browser@4.1.11)(vitest@4.1.11)':
dependencies:
'@bcoe/v8-coverage': 1.0.2
- '@vitest/utils': 4.1.10
+ '@vitest/utils': 4.1.11
ast-v8-to-istanbul: 1.0.5
istanbul-lib-coverage: 3.2.2
istanbul-lib-report: 3.0.1
@@ -7477,9 +7759,9 @@ snapshots:
obug: 2.1.4
std-env: 4.2.0
tinyrainbow: 3.1.1
- vitest: 4.1.10(@types/node@26.1.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@vitest/ui@4.1.10)(jsdom@30.0.1(canvas@3.2.3))(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))
+ vitest: 4.1.11(@types/node@26.4.0)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@vitest/ui@4.1.11)(jsdom@30.0.1(canvas@3.2.3))(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))
optionalDependencies:
- '@vitest/browser': 4.1.10(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))(vitest@4.1.10)
+ '@vitest/browser': 4.1.11(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))(vitest@4.1.11)
'@vitest/expect@3.2.4':
dependencies:
@@ -7489,22 +7771,22 @@ snapshots:
chai: 5.3.3
tinyrainbow: 2.0.0
- '@vitest/expect@4.1.10':
+ '@vitest/expect@4.1.11':
dependencies:
'@standard-schema/spec': 1.1.0
'@types/chai': 5.2.3
- '@vitest/spy': 4.1.10
- '@vitest/utils': 4.1.10
+ '@vitest/spy': 4.1.11
+ '@vitest/utils': 4.1.11
chai: 6.2.2
tinyrainbow: 3.1.1
- '@vitest/mocker@4.1.10(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))':
+ '@vitest/mocker@4.1.11(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))':
dependencies:
- '@vitest/spy': 4.1.10
+ '@vitest/spy': 4.1.11
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
- vite: 8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0)
+ vite: 8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1)
'@vitest/pretty-format@3.2.4':
dependencies:
@@ -7513,16 +7795,27 @@ snapshots:
'@vitest/pretty-format@4.1.10':
dependencies:
tinyrainbow: 3.1.1
+ optional: true
+
+ '@vitest/pretty-format@4.1.11':
+ dependencies:
+ tinyrainbow: 3.1.1
'@vitest/runner@4.1.10':
dependencies:
'@vitest/utils': 4.1.10
pathe: 2.0.3
+ optional: true
- '@vitest/snapshot@4.1.10':
+ '@vitest/runner@4.1.11':
dependencies:
- '@vitest/pretty-format': 4.1.10
- '@vitest/utils': 4.1.10
+ '@vitest/utils': 4.1.11
+ pathe: 2.0.3
+
+ '@vitest/snapshot@4.1.11':
+ dependencies:
+ '@vitest/pretty-format': 4.1.11
+ '@vitest/utils': 4.1.11
magic-string: 0.30.21
pathe: 2.0.3
@@ -7530,18 +7823,18 @@ snapshots:
dependencies:
tinyspy: 4.0.4
- '@vitest/spy@4.1.10': {}
+ '@vitest/spy@4.1.11': {}
- '@vitest/ui@4.1.10(vitest@4.1.10)':
+ '@vitest/ui@4.1.11(vitest@4.1.11)':
dependencies:
- '@vitest/utils': 4.1.10
+ '@vitest/utils': 4.1.11
fflate: 0.8.3
flatted: 3.4.4
pathe: 2.0.3
sirv: 3.0.2
tinyglobby: 0.2.17
tinyrainbow: 3.1.1
- vitest: 4.1.10(@types/node@26.1.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@vitest/ui@4.1.10)(jsdom@30.0.1(canvas@3.2.3))(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))
+ vitest: 4.1.11(@types/node@26.4.0)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@vitest/ui@4.1.11)(jsdom@30.0.1(canvas@3.2.3))(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))
'@vitest/utils@3.2.4':
dependencies:
@@ -7554,6 +7847,13 @@ snapshots:
'@vitest/pretty-format': 4.1.10
convert-source-map: 2.0.0
tinyrainbow: 3.1.1
+ optional: true
+
+ '@vitest/utils@4.1.11':
+ dependencies:
+ '@vitest/pretty-format': 4.1.11
+ convert-source-map: 2.0.0
+ tinyrainbow: 3.1.1
'@volar/language-core@2.4.28':
dependencies:
@@ -7773,13 +8073,13 @@ snapshots:
asynckit@0.4.0: {}
- autoprefixer@10.5.4(postcss@8.5.25):
+ autoprefixer@10.5.4(postcss@8.5.26):
dependencies:
browserslist: 4.28.7
caniuse-lite: 1.0.30001806
fraction.js: 5.3.4
picocolors: 1.1.1
- postcss: 8.5.25
+ postcss: 8.5.26
postcss-value-parser: 4.2.0
available-typed-arrays@1.0.7:
@@ -8029,6 +8329,8 @@ snapshots:
colorjs.io@0.5.2: {}
+ colorjs.io@0.7.1: {}
+
combined-stream@1.0.8:
dependencies:
delayed-stream: 1.0.0
@@ -8061,7 +8363,7 @@ snapshots:
concat-map@0.0.1: {}
- concurrently@10.0.4:
+ concurrently@10.0.5:
dependencies:
chalk: 5.6.2
rxjs: 7.8.2
@@ -8493,34 +8795,34 @@ snapshots:
is-date-object: 1.1.0
is-symbol: 1.1.1
- esbuild@0.28.1:
+ esbuild@0.28.2:
optionalDependencies:
- '@esbuild/aix-ppc64': 0.28.1
- '@esbuild/android-arm': 0.28.1
- '@esbuild/android-arm64': 0.28.1
- '@esbuild/android-x64': 0.28.1
- '@esbuild/darwin-arm64': 0.28.1
- '@esbuild/darwin-x64': 0.28.1
- '@esbuild/freebsd-arm64': 0.28.1
- '@esbuild/freebsd-x64': 0.28.1
- '@esbuild/linux-arm': 0.28.1
- '@esbuild/linux-arm64': 0.28.1
- '@esbuild/linux-ia32': 0.28.1
- '@esbuild/linux-loong64': 0.28.1
- '@esbuild/linux-mips64el': 0.28.1
- '@esbuild/linux-ppc64': 0.28.1
- '@esbuild/linux-riscv64': 0.28.1
- '@esbuild/linux-s390x': 0.28.1
- '@esbuild/linux-x64': 0.28.1
- '@esbuild/netbsd-arm64': 0.28.1
- '@esbuild/netbsd-x64': 0.28.1
- '@esbuild/openbsd-arm64': 0.28.1
- '@esbuild/openbsd-x64': 0.28.1
- '@esbuild/openharmony-arm64': 0.28.1
- '@esbuild/sunos-x64': 0.28.1
- '@esbuild/win32-arm64': 0.28.1
- '@esbuild/win32-ia32': 0.28.1
- '@esbuild/win32-x64': 0.28.1
+ '@esbuild/aix-ppc64': 0.28.2
+ '@esbuild/android-arm': 0.28.2
+ '@esbuild/android-arm64': 0.28.2
+ '@esbuild/android-x64': 0.28.2
+ '@esbuild/darwin-arm64': 0.28.2
+ '@esbuild/darwin-x64': 0.28.2
+ '@esbuild/freebsd-arm64': 0.28.2
+ '@esbuild/freebsd-x64': 0.28.2
+ '@esbuild/linux-arm': 0.28.2
+ '@esbuild/linux-arm64': 0.28.2
+ '@esbuild/linux-ia32': 0.28.2
+ '@esbuild/linux-loong64': 0.28.2
+ '@esbuild/linux-mips64el': 0.28.2
+ '@esbuild/linux-ppc64': 0.28.2
+ '@esbuild/linux-riscv64': 0.28.2
+ '@esbuild/linux-s390x': 0.28.2
+ '@esbuild/linux-x64': 0.28.2
+ '@esbuild/netbsd-arm64': 0.28.2
+ '@esbuild/netbsd-x64': 0.28.2
+ '@esbuild/openbsd-arm64': 0.28.2
+ '@esbuild/openbsd-x64': 0.28.2
+ '@esbuild/openharmony-arm64': 0.28.2
+ '@esbuild/sunos-x64': 0.28.2
+ '@esbuild/win32-arm64': 0.28.2
+ '@esbuild/win32-ia32': 0.28.2
+ '@esbuild/win32-x64': 0.28.2
escalade@3.2.0: {}
@@ -8704,7 +9006,7 @@ snapshots:
events@3.3.0: {}
- eventsource-parser@3.1.0: {}
+ eventsource-parser@4.1.0: {}
expand-template@2.0.3: {}
@@ -9030,7 +9332,7 @@ snapshots:
dependencies:
hermes-estree: 0.25.1
- highlight.js@11.11.1: {}
+ highlight.js@11.12.0: {}
hookified@1.15.1: {}
@@ -9073,9 +9375,9 @@ snapshots:
dependencies:
safer-buffer: 2.1.2
- icss-utils@5.1.0(postcss@8.5.25):
+ icss-utils@5.1.0(postcss@8.5.26):
dependencies:
- postcss: 8.5.25
+ postcss: 8.5.26
ieee754@1.2.1: {}
@@ -9538,8 +9840,8 @@ snapshots:
magicast@0.5.4:
dependencies:
- '@babel/parser': 7.29.7
- '@babel/types': 7.29.7
+ '@babel/parser': 7.29.8
+ '@babel/types': 7.29.8
source-map-js: 1.2.1
make-dir@4.0.0:
@@ -9548,7 +9850,7 @@ snapshots:
map-stream@0.0.7: {}
- marked@18.0.9: {}
+ marked@18.0.11: {}
math-intrinsics@1.1.0: {}
@@ -9639,7 +9941,7 @@ snapshots:
mustache@4.2.0: {}
- nanoid@3.3.16: {}
+ nanoid@3.3.18: {}
napi-build-utils@2.0.0: {}
@@ -9823,27 +10125,27 @@ snapshots:
'@oxc-parser/binding-win32-ia32-msvc': 0.127.0
'@oxc-parser/binding-win32-x64-msvc': 0.127.0
- oxc-resolver@11.24.2:
+ oxc-resolver@11.21.2:
optionalDependencies:
- '@oxc-resolver/binding-android-arm-eabi': 11.24.2
- '@oxc-resolver/binding-android-arm64': 11.24.2
- '@oxc-resolver/binding-darwin-arm64': 11.24.2
- '@oxc-resolver/binding-darwin-x64': 11.24.2
- '@oxc-resolver/binding-freebsd-x64': 11.24.2
- '@oxc-resolver/binding-linux-arm-gnueabihf': 11.24.2
- '@oxc-resolver/binding-linux-arm-musleabihf': 11.24.2
- '@oxc-resolver/binding-linux-arm64-gnu': 11.24.2
- '@oxc-resolver/binding-linux-arm64-musl': 11.24.2
- '@oxc-resolver/binding-linux-ppc64-gnu': 11.24.2
- '@oxc-resolver/binding-linux-riscv64-gnu': 11.24.2
- '@oxc-resolver/binding-linux-riscv64-musl': 11.24.2
- '@oxc-resolver/binding-linux-s390x-gnu': 11.24.2
- '@oxc-resolver/binding-linux-x64-gnu': 11.24.2
- '@oxc-resolver/binding-linux-x64-musl': 11.24.2
- '@oxc-resolver/binding-openharmony-arm64': 11.24.2
- '@oxc-resolver/binding-wasm32-wasi': 11.24.2
- '@oxc-resolver/binding-win32-arm64-msvc': 11.24.2
- '@oxc-resolver/binding-win32-x64-msvc': 11.24.2
+ '@oxc-resolver/binding-android-arm-eabi': 11.21.2
+ '@oxc-resolver/binding-android-arm64': 11.21.2
+ '@oxc-resolver/binding-darwin-arm64': 11.21.2
+ '@oxc-resolver/binding-darwin-x64': 11.21.2
+ '@oxc-resolver/binding-freebsd-x64': 11.21.2
+ '@oxc-resolver/binding-linux-arm-gnueabihf': 11.21.2
+ '@oxc-resolver/binding-linux-arm-musleabihf': 11.21.2
+ '@oxc-resolver/binding-linux-arm64-gnu': 11.21.2
+ '@oxc-resolver/binding-linux-arm64-musl': 11.21.2
+ '@oxc-resolver/binding-linux-ppc64-gnu': 11.21.2
+ '@oxc-resolver/binding-linux-riscv64-gnu': 11.21.2
+ '@oxc-resolver/binding-linux-riscv64-musl': 11.21.2
+ '@oxc-resolver/binding-linux-s390x-gnu': 11.21.2
+ '@oxc-resolver/binding-linux-x64-gnu': 11.21.2
+ '@oxc-resolver/binding-linux-x64-musl': 11.21.2
+ '@oxc-resolver/binding-openharmony-arm64': 11.21.2
+ '@oxc-resolver/binding-wasm32-wasi': 11.21.2
+ '@oxc-resolver/binding-win32-arm64-msvc': 11.21.2
+ '@oxc-resolver/binding-win32-x64-msvc': 11.21.2
p-limit@3.1.0:
dependencies:
@@ -9917,6 +10219,8 @@ snapshots:
pend@1.2.0: {}
+ picocolors@0.2.1: {}
+
picocolors@1.1.1: {}
picomatch@2.3.2: {}
@@ -9958,52 +10262,52 @@ snapshots:
postcss-clean@1.2.2:
dependencies:
clean-css: 4.2.4
- postcss: 8.5.25
+ postcss: 7.0.39
postcss-media-query-parser@0.2.3: {}
- postcss-modules-extract-imports@3.1.0(postcss@8.5.25):
+ postcss-modules-extract-imports@3.1.0(postcss@8.5.26):
dependencies:
- postcss: 8.5.25
+ postcss: 8.5.26
- postcss-modules-local-by-default@4.2.0(postcss@8.5.25):
+ postcss-modules-local-by-default@4.2.0(postcss@8.5.26):
dependencies:
- icss-utils: 5.1.0(postcss@8.5.25)
- postcss: 8.5.25
+ icss-utils: 5.1.0(postcss@8.5.26)
+ postcss: 8.5.26
postcss-selector-parser: 7.1.4
postcss-value-parser: 4.2.0
- postcss-modules-scope@3.2.1(postcss@8.5.25):
+ postcss-modules-scope@3.2.1(postcss@8.5.26):
dependencies:
- postcss: 8.5.25
+ postcss: 8.5.26
postcss-selector-parser: 7.1.4
- postcss-modules-values@4.0.0(postcss@8.5.25):
+ postcss-modules-values@4.0.0(postcss@8.5.26):
dependencies:
- icss-utils: 5.1.0(postcss@8.5.25)
- postcss: 8.5.25
+ icss-utils: 5.1.0(postcss@8.5.26)
+ postcss: 8.5.26
- postcss-modules@9.0.1(postcss@8.5.25):
+ postcss-modules@9.0.1(postcss@8.5.26):
dependencies:
generic-names: 4.0.0
- icss-utils: 5.1.0(postcss@8.5.25)
+ icss-utils: 5.1.0(postcss@8.5.26)
lodash.camelcase: 4.3.0
- postcss: 8.5.25
- postcss-modules-extract-imports: 3.1.0(postcss@8.5.25)
- postcss-modules-local-by-default: 4.2.0(postcss@8.5.25)
- postcss-modules-scope: 3.2.1(postcss@8.5.25)
- postcss-modules-values: 4.0.0(postcss@8.5.25)
+ postcss: 8.5.26
+ postcss-modules-extract-imports: 3.1.0(postcss@8.5.26)
+ postcss-modules-local-by-default: 4.2.0(postcss@8.5.26)
+ postcss-modules-scope: 3.2.1(postcss@8.5.26)
+ postcss-modules-values: 4.0.0(postcss@8.5.26)
string-hash: 1.1.3
postcss-resolve-nested-selector@0.1.6: {}
- postcss-safe-parser@7.0.1(postcss@8.5.25):
+ postcss-safe-parser@7.0.1(postcss@8.5.26):
dependencies:
- postcss: 8.5.25
+ postcss: 8.5.26
- postcss-scss@4.0.9(postcss@8.5.25):
+ postcss-scss@4.0.9(postcss@8.5.26):
dependencies:
- postcss: 8.5.25
+ postcss: 8.5.26
postcss-selector-parser@7.1.4:
dependencies:
@@ -10014,9 +10318,14 @@ snapshots:
postcss-value-parser@4.2.0: {}
- postcss@8.5.25:
+ postcss@7.0.39:
dependencies:
- nanoid: 3.3.16
+ picocolors: 0.2.1
+ source-map: 0.6.1
+
+ postcss@8.5.26:
+ dependencies:
+ nanoid: 3.3.18
picocolors: 1.1.1
source-map-js: 1.2.1
@@ -10189,9 +10498,11 @@ snapshots:
react: 19.2.8
scheduler: 0.27.0
- react-error-boundary@6.1.2(react@19.2.8):
+ react-error-boundary@6.1.3(@types/react@19.2.18)(react@19.2.8):
dependencies:
react: 19.2.8
+ optionalDependencies:
+ '@types/react': 19.2.18
react-is@16.13.1: {}
@@ -10335,6 +10646,28 @@ snapshots:
'@rolldown/binding-wasm32-wasi': 1.2.1
'@rolldown/binding-win32-arm64-msvc': 1.2.1
'@rolldown/binding-win32-x64-msvc': 1.2.1
+ optional: true
+
+ rolldown@1.2.6:
+ dependencies:
+ '@oxc-project/types': 0.147.0
+ '@rolldown/pluginutils': 1.0.1
+ optionalDependencies:
+ '@rolldown/binding-android-arm-eabi': 1.2.6
+ '@rolldown/binding-android-arm64': 1.2.6
+ '@rolldown/binding-darwin-arm64': 1.2.6
+ '@rolldown/binding-darwin-x64': 1.2.6
+ '@rolldown/binding-freebsd-x64': 1.2.6
+ '@rolldown/binding-linux-arm-gnueabihf': 1.2.6
+ '@rolldown/binding-linux-arm64-gnu': 1.2.6
+ '@rolldown/binding-linux-arm64-musl': 1.2.6
+ '@rolldown/binding-linux-ppc64-gnu': 1.2.6
+ '@rolldown/binding-linux-s390x-gnu': 1.2.6
+ '@rolldown/binding-linux-x64-gnu': 1.2.6
+ '@rolldown/binding-linux-x64-musl': 1.2.6
+ '@rolldown/binding-openharmony-arm64': 1.2.6
+ '@rolldown/binding-win32-arm64-msvc': 1.2.6
+ '@rolldown/binding-win32-x64-msvc': 1.2.6
rollup@4.61.1:
dependencies:
@@ -10417,103 +10750,94 @@ snapshots:
safer-buffer@2.1.2: {}
- sass-embedded-all-unknown@1.100.0:
+ sass-embedded-all-unknown@1.103.1:
dependencies:
- sass: 1.100.0
+ sass: 1.103.1
optional: true
- sass-embedded-android-arm64@1.100.0:
+ sass-embedded-android-arm64@1.103.1:
optional: true
- sass-embedded-android-arm@1.100.0:
+ sass-embedded-android-arm@1.103.1:
optional: true
- sass-embedded-android-riscv64@1.100.0:
+ sass-embedded-android-riscv64@1.103.1:
optional: true
- sass-embedded-android-x64@1.100.0:
+ sass-embedded-android-x64@1.103.1:
optional: true
- sass-embedded-darwin-arm64@1.100.0:
+ sass-embedded-darwin-arm64@1.103.1:
optional: true
- sass-embedded-darwin-x64@1.100.0:
+ sass-embedded-darwin-x64@1.103.1:
optional: true
- sass-embedded-linux-arm64@1.100.0:
+ sass-embedded-linux-arm64@1.103.1:
optional: true
- sass-embedded-linux-arm@1.100.0:
+ sass-embedded-linux-arm@1.103.1:
optional: true
- sass-embedded-linux-musl-arm64@1.100.0:
+ sass-embedded-linux-musl-arm64@1.103.1:
optional: true
- sass-embedded-linux-musl-arm@1.100.0:
+ sass-embedded-linux-musl-arm@1.103.1:
optional: true
- sass-embedded-linux-musl-riscv64@1.100.0:
+ sass-embedded-linux-musl-riscv64@1.103.1:
optional: true
- sass-embedded-linux-musl-x64@1.100.0:
+ sass-embedded-linux-musl-x64@1.103.1:
optional: true
- sass-embedded-linux-riscv64@1.100.0:
+ sass-embedded-linux-riscv64@1.103.1:
optional: true
- sass-embedded-linux-x64@1.100.0:
+ sass-embedded-linux-x64@1.103.1:
optional: true
- sass-embedded-unknown-all@1.100.0:
+ sass-embedded-unknown-all@1.103.1:
dependencies:
- sass: 1.100.0
+ sass: 1.103.1
optional: true
- sass-embedded-win32-arm64@1.100.0:
+ sass-embedded-win32-arm64@1.103.1:
optional: true
- sass-embedded-win32-x64@1.100.0:
+ sass-embedded-win32-x64@1.103.1:
optional: true
- sass-embedded@1.100.0:
+ sass-embedded@1.103.1:
dependencies:
'@bufbuild/protobuf': 2.12.1
- colorjs.io: 0.5.2
+ colorjs.io: 0.7.1
immutable: 5.1.9
rxjs: 7.8.2
supports-color: 8.1.1
sync-child-process: 1.0.2
varint: 6.0.0
optionalDependencies:
- sass-embedded-all-unknown: 1.100.0
- sass-embedded-android-arm: 1.100.0
- sass-embedded-android-arm64: 1.100.0
- sass-embedded-android-riscv64: 1.100.0
- sass-embedded-android-x64: 1.100.0
- sass-embedded-darwin-arm64: 1.100.0
- sass-embedded-darwin-x64: 1.100.0
- sass-embedded-linux-arm: 1.100.0
- sass-embedded-linux-arm64: 1.100.0
- sass-embedded-linux-musl-arm: 1.100.0
- sass-embedded-linux-musl-arm64: 1.100.0
- sass-embedded-linux-musl-riscv64: 1.100.0
- sass-embedded-linux-musl-x64: 1.100.0
- sass-embedded-linux-riscv64: 1.100.0
- sass-embedded-linux-x64: 1.100.0
- sass-embedded-unknown-all: 1.100.0
- sass-embedded-win32-arm64: 1.100.0
- sass-embedded-win32-x64: 1.100.0
+ sass-embedded-all-unknown: 1.103.1
+ sass-embedded-android-arm: 1.103.1
+ sass-embedded-android-arm64: 1.103.1
+ sass-embedded-android-riscv64: 1.103.1
+ sass-embedded-android-x64: 1.103.1
+ sass-embedded-darwin-arm64: 1.103.1
+ sass-embedded-darwin-x64: 1.103.1
+ sass-embedded-linux-arm: 1.103.1
+ sass-embedded-linux-arm64: 1.103.1
+ sass-embedded-linux-musl-arm: 1.103.1
+ sass-embedded-linux-musl-arm64: 1.103.1
+ sass-embedded-linux-musl-riscv64: 1.103.1
+ sass-embedded-linux-musl-x64: 1.103.1
+ sass-embedded-linux-riscv64: 1.103.1
+ sass-embedded-linux-x64: 1.103.1
+ sass-embedded-unknown-all: 1.103.1
+ sass-embedded-win32-arm64: 1.103.1
+ sass-embedded-win32-x64: 1.103.1
- sass@1.100.0:
- dependencies:
- chokidar: 5.0.0
- immutable: 5.1.9
- source-map-js: 1.2.1
- optionalDependencies:
- '@parcel/watcher': 2.6.0
- optional: true
-
- sass@1.102.0:
+ sass@1.103.1:
dependencies:
chokidar: 5.0.0
immutable: 5.1.9
@@ -10704,7 +11028,7 @@ snapshots:
es-errors: 1.3.0
internal-slot: 1.1.0
- storybook@10.5.6(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8):
+ storybook@10.5.10(@types/react@19.2.18)(prettier@3.9.6)(react@19.2.8):
dependencies:
'@storybook/global': 5.0.0
'@storybook/icons': 2.1.0(react@19.2.8)
@@ -10714,11 +11038,11 @@ snapshots:
'@vitest/expect': 3.2.4
'@vitest/spy': 3.2.4
'@webcontainer/env': 1.1.1
- esbuild: 0.28.1
+ esbuild: 0.28.2
jsonc-parser: 3.3.1
open: 10.2.0
oxc-parser: 0.127.0
- oxc-resolver: 11.24.2
+ oxc-resolver: 11.21.2
recast: 0.23.19
semver: 7.8.5
use-sync-external-store: 1.6.0(react@19.2.8)
@@ -10844,7 +11168,7 @@ snapshots:
stubborn-fs@1.2.5: {}
- style-dictionary@5.5.0(tslib@2.8.1):
+ style-dictionary@5.5.2(tslib@2.8.1):
dependencies:
'@bundled-es-modules/deepmerge': 4.3.2
'@bundled-es-modules/glob': 13.0.6
@@ -10862,26 +11186,26 @@ snapshots:
transitivePeerDependencies:
- tslib
- stylelint-config-recommended-scss@17.0.1(postcss@8.5.25)(stylelint@17.14.1(supports-color@5.5.0)(typescript@6.0.3)):
+ stylelint-config-recommended-scss@17.0.1(postcss@8.5.26)(stylelint@17.14.1(supports-color@5.5.0)(typescript@6.0.3)):
dependencies:
- postcss-scss: 4.0.9(postcss@8.5.25)
+ postcss-scss: 4.0.9(postcss@8.5.26)
stylelint: 17.14.1(supports-color@5.5.0)(typescript@6.0.3)
stylelint-config-recommended: 18.0.0(stylelint@17.14.1(supports-color@5.5.0)(typescript@6.0.3))
stylelint-scss: 7.2.0(stylelint@17.14.1(supports-color@5.5.0)(typescript@6.0.3))
optionalDependencies:
- postcss: 8.5.25
+ postcss: 8.5.26
stylelint-config-recommended@18.0.0(stylelint@17.14.1(supports-color@5.5.0)(typescript@6.0.3)):
dependencies:
stylelint: 17.14.1(supports-color@5.5.0)(typescript@6.0.3)
- stylelint-config-standard-scss@17.0.0(postcss@8.5.25)(stylelint@17.14.1(supports-color@5.5.0)(typescript@6.0.3)):
+ stylelint-config-standard-scss@17.0.0(postcss@8.5.26)(stylelint@17.14.1(supports-color@5.5.0)(typescript@6.0.3)):
dependencies:
stylelint: 17.14.1(supports-color@5.5.0)(typescript@6.0.3)
- stylelint-config-recommended-scss: 17.0.1(postcss@8.5.25)(stylelint@17.14.1(supports-color@5.5.0)(typescript@6.0.3))
+ stylelint-config-recommended-scss: 17.0.1(postcss@8.5.26)(stylelint@17.14.1(supports-color@5.5.0)(typescript@6.0.3))
stylelint-config-standard: 40.0.0(stylelint@17.14.1(supports-color@5.5.0)(typescript@6.0.3))
optionalDependencies:
- postcss: 8.5.25
+ postcss: 8.5.26
stylelint-config-standard@40.0.0(stylelint@17.14.1(supports-color@5.5.0)(typescript@6.0.3)):
dependencies:
@@ -10935,8 +11259,8 @@ snapshots:
micromatch: 4.0.8
normalize-path: 3.0.0
picocolors: 1.1.1
- postcss: 8.5.25
- postcss-safe-parser: 7.0.1(postcss@8.5.25)
+ postcss: 8.5.26
+ postcss-safe-parser: 7.0.1(postcss@8.5.26)
postcss-selector-parser: 7.1.4
postcss-value-parser: 4.2.0
string-width: 8.2.2
@@ -11032,7 +11356,7 @@ snapshots:
inherits: 2.0.4
readable-stream: 3.6.2
- tdigest@0.1.2:
+ tdigest@0.1.3:
dependencies:
bintrees: 1.0.2
@@ -11198,7 +11522,7 @@ snapshots:
unpipe@1.0.0: {}
- unplugin-dts@1.0.3(@microsoft/api-extractor@7.56.2(@types/node@26.1.2))(esbuild@0.28.1)(rolldown@1.2.1)(rollup@4.61.1)(supports-color@10.2.2)(typescript@6.0.3)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0)):
+ unplugin-dts@1.0.3(@microsoft/api-extractor@7.56.2(@types/node@26.4.0))(esbuild@0.28.2)(rolldown@1.2.1)(rollup@4.61.1)(supports-color@10.2.2)(typescript@6.0.3)(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1)):
dependencies:
'@rollup/pluginutils': 5.4.0(rollup@4.61.1)
'@volar/typescript': 2.4.28(typescript@6.0.3)
@@ -11210,11 +11534,11 @@ snapshots:
typescript: 6.0.3
unplugin: 2.3.11
optionalDependencies:
- '@microsoft/api-extractor': 7.56.2(@types/node@26.1.2)
- esbuild: 0.28.1
+ '@microsoft/api-extractor': 7.56.2(@types/node@26.4.0)
+ esbuild: 0.28.2
rolldown: 1.2.1
rollup: 4.61.1
- vite: 8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0)
+ vite: 8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1)
transitivePeerDependencies:
- supports-color
@@ -11276,13 +11600,13 @@ snapshots:
remove-trailing-separator: 1.1.0
replace-ext: 1.0.1
- vite-plugin-dts@5.0.3(@microsoft/api-extractor@7.56.2(@types/node@26.1.2))(esbuild@0.28.1)(rolldown@1.2.1)(rollup@4.61.1)(supports-color@10.2.2)(typescript@6.0.3)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0)):
+ vite-plugin-dts@5.0.3(@microsoft/api-extractor@7.56.2(@types/node@26.4.0))(esbuild@0.28.2)(rolldown@1.2.1)(rollup@4.61.1)(supports-color@10.2.2)(typescript@6.0.3)(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1)):
dependencies:
- unplugin-dts: 1.0.3(@microsoft/api-extractor@7.56.2(@types/node@26.1.2))(esbuild@0.28.1)(rolldown@1.2.1)(rollup@4.61.1)(supports-color@10.2.2)(typescript@6.0.3)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))
+ unplugin-dts: 1.0.3(@microsoft/api-extractor@7.56.2(@types/node@26.4.0))(esbuild@0.28.2)(rolldown@1.2.1)(rollup@4.61.1)(supports-color@10.2.2)(typescript@6.0.3)(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))
optionalDependencies:
- '@microsoft/api-extractor': 7.56.2(@types/node@26.1.2)
+ '@microsoft/api-extractor': 7.56.2(@types/node@26.4.0)
rollup: 4.61.1
- vite: 8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0)
+ vite: 8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1)
transitivePeerDependencies:
- '@rspack/core'
- '@vue/language-core'
@@ -11292,29 +11616,29 @@ snapshots:
- typescript
- webpack
- vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0):
+ vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1):
dependencies:
lightningcss: 1.33.0
picomatch: 4.0.5
- postcss: 8.5.25
- rolldown: 1.2.1
+ postcss: 8.5.26
+ rolldown: 1.2.6
tinyglobby: 0.2.17
optionalDependencies:
- '@types/node': 26.1.2
- esbuild: 0.28.1
+ '@types/node': 26.4.0
+ esbuild: 0.28.2
fsevents: 2.3.3
- sass: 1.102.0
- sass-embedded: 1.100.0
+ sass: 1.103.1
+ sass-embedded: 1.103.1
- vitest@4.1.10(@types/node@26.1.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@vitest/ui@4.1.10)(jsdom@30.0.1(canvas@3.2.3))(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0)):
+ vitest@4.1.11(@types/node@26.4.0)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@vitest/ui@4.1.11)(jsdom@30.0.1(canvas@3.2.3))(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1)):
dependencies:
- '@vitest/expect': 4.1.10
- '@vitest/mocker': 4.1.10(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))
- '@vitest/pretty-format': 4.1.10
- '@vitest/runner': 4.1.10
- '@vitest/snapshot': 4.1.10
- '@vitest/spy': 4.1.10
- '@vitest/utils': 4.1.10
+ '@vitest/expect': 4.1.11
+ '@vitest/mocker': 4.1.11(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))
+ '@vitest/pretty-format': 4.1.11
+ '@vitest/runner': 4.1.11
+ '@vitest/snapshot': 4.1.11
+ '@vitest/spy': 4.1.11
+ '@vitest/utils': 4.1.11
es-module-lexer: 2.3.1
expect-type: 1.4.0
magic-string: 0.30.21
@@ -11326,13 +11650,13 @@ snapshots:
tinyexec: 1.2.4
tinyglobby: 0.2.17
tinyrainbow: 3.1.1
- vite: 8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0)
+ vite: 8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1)
why-is-node-running: 2.3.0
optionalDependencies:
- '@types/node': 26.1.2
- '@vitest/browser-playwright': 4.1.10(playwright@1.62.1)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(sass-embedded@1.100.0)(sass@1.102.0))(vitest@4.1.10)
- '@vitest/coverage-v8': 4.1.10(@vitest/browser@4.1.10)(vitest@4.1.10)
- '@vitest/ui': 4.1.10(vitest@4.1.10)
+ '@types/node': 26.4.0
+ '@vitest/browser-playwright': 4.1.11(playwright@1.62.1)(vite@8.2.2(@types/node@26.4.0)(esbuild@0.28.2)(sass-embedded@1.103.1)(sass@1.103.1))(vitest@4.1.11)
+ '@vitest/coverage-v8': 4.1.11(@vitest/browser@4.1.11)(vitest@4.1.11)
+ '@vitest/ui': 4.1.11(vitest@4.1.11)
jsdom: 30.0.1(canvas@3.2.3)
transitivePeerDependencies:
- msw
@@ -11485,8 +11809,6 @@ snapshots:
dependencies:
signal-exit: 4.1.0
- ws@8.21.1: {}
-
ws@8.21.2: {}
wsl-utils@0.1.0:
diff --git a/frontend/src/app/main/ui/auth.cljs b/frontend/src/app/main/ui/auth.cljs
index c0eebbf0ad..9ec094716d 100644
--- a/frontend/src/app/main/ui/auth.cljs
+++ b/frontend/src/app/main/ui/auth.cljs
@@ -13,7 +13,7 @@
[app.main.ui.auth.login :refer [login-page*]]
[app.main.ui.auth.recovery :refer [recovery-page*]]
[app.main.ui.auth.recovery-request :refer [recovery-request-page*]]
- [app.main.ui.auth.register :refer [register-page* register-success-page* register-validate-page* terms-register*]]
+ [app.main.ui.auth.register :refer [register-page* register-success-page* register-validate-page* terms-service-privacy-policy*]]
[app.main.ui.ds.foundations.assets.raw-svg :refer [raw-svg*] :as raw-svg]
[app.main.ui.ds.foundations.typography.heading :refer [heading*]]
[app.util.dom :as dom]
@@ -74,7 +74,7 @@
[:> recovery-page* {:params params}])
(when (= section :auth-register)
- [:> terms-register*])]]))
+ [:> terms-service-privacy-policy*])]]))
(mf/defc auth-page*
diff --git a/frontend/src/app/main/ui/auth.scss b/frontend/src/app/main/ui/auth.scss
index 50d1c90d25..cc5c4d1cd2 100644
--- a/frontend/src/app/main/ui/auth.scss
+++ b/frontend/src/app/main/ui/auth.scss
@@ -6,6 +6,7 @@
@use "ds/_sizes.scss" as *;
@use "ds/_utils.scss" as *;
+@use "./ds/mixins.scss" as *;
.auth-section {
display: grid;
@@ -26,6 +27,8 @@
}
.auth-section.register {
+ @include custom-scrollbar;
+
display: flex;
justify-content: center;
align-items: center;
diff --git a/frontend/src/app/main/ui/auth/common.scss b/frontend/src/app/main/ui/auth/common.scss
index 43642e145e..c49311c1ba 100644
--- a/frontend/src/app/main/ui/auth/common.scss
+++ b/frontend/src/app/main/ui/auth/common.scss
@@ -4,56 +4,15 @@
//
// Copyright (c) KALEIDOS SUBSIDIARY SL
-@use "ds/_utils.scss" as *;
@use "ds/_sizes.scss" as *;
@use "ds/_borders.scss" as *;
@use "ds/typography.scss" as *;
-.auth-form-wrapper {
- inline-size: 100%;
- padding-block-end: 0;
- display: grid;
+.form {
+ display: flex;
+ flex-direction: column;
gap: var(--sp-m);
-
- // Native