diff --git a/.ai/guidelines/development.md b/.ai/guidelines/development.md new file mode 100644 index 0000000..d41aa97 --- /dev/null +++ b/.ai/guidelines/development.md @@ -0,0 +1,51 @@ +# Local Development + +- The starter kit is a **Laravel 13 + Inertia + React + Lattice** application; Lattice provides the server-driven UI. + PHP `^8.4`, Node `>=22`. +- First-time setup: `composer setup` (installs dependencies, copies `.env`, generates the app key, migrates, installs + npm dependencies, builds the frontend). Day to day, run `composer dev` — Laravel's `artisan dev` starts the server, + queue worker, Reverb, Pail, and Vite together. +- The frontend is **not** an Inertia-React `resources/js/Pages` app. Pages, layouts, forms, tables, and actions are PHP + classes (`#[AsPage]`, `#[AsLayout]`, `#[AsForm]`, `#[AsTable]`, `#[AsAction]`) rendered by the Lattice runtime. The + only hand-written React lives in `resources/js/components/`, registered by string key in `resources/js/app.tsx`. + Reach for the `lattice-forms`, `lattice-tables`, `lattice-actions`, and `lattice-closures` skills before inferring a + builder API from a sibling class. +- After changing a custom Lattice wire type (a `#[AsComponent]`/`#[AsField]`/`#[AsColumn]` class), regenerate its + TypeScript with `php artisan lattice:typescript` and commit `resources/js/lattice/generated.d.ts`. CI fails on a + stale file. +- Path-scoped conventions live in `.ai/rules/`; `index.md` maps globs to rule files. Read the rules matching the paths + you are about to touch before planning or editing. +- Regenerate `CLAUDE.md` and `AGENTS.md` after editing `.ai/guidelines/` with `php artisan boost:update`. Both files + are git-ignored and generated by Laravel Boost; `composer update` runs `boost:update` for you. + +## Verification + +- Git hooks enforce the local gate. `composer install` and `composer update` point `core.hooksPath` at `.githooks`; + if the hooks are not active, run `composer hooks:install` once. + - **pre-commit** auto-fixes staged PHP with Rector and Pint, staged TypeScript with oxfmt and oxlint, staged + Markdown with oxfmt, re-stages the fixes, and blocks on what is left. A file that is both staged and dirty is + only checked, never rewritten. + - **pre-push** runs the gate scoped to what the push changes: the frontend checks in the background, PHPStan in the + foreground, then `composer test` and `npm run build`. +- `composer ci:check` mirrors CI in one command; `composer check:full` adds the library build. +- Static analysis is **PHPStan level 8 over `app/` and `tests/`, with no baseline**. Keep it at zero. +- `composer rector:check` dry-runs the automated refactors; `composer rector:fix` applies them. +- oxfmt formats Markdown as well as TypeScript, so every `.md` in the repo is covered by `npm run format:check`. +- Never push on red. Use `git commit --no-verify` or `git push --no-verify` only in emergencies. + +## Running tests + +- Tests are **Pest**, in three suites: `tests/Unit`, `tests/Feature`, and `tests/Browser`. `composer test` runs Unit + and Feature in parallel; `composer test:browser` runs the browser suite. +- Browser tests drive a real headless Chromium through `pestphp/pest-plugin-browser`. They need the browsers installed + once (`npx playwright install chromium`) and a current `npm run build` — they serve the built bundle, not the dev + server. +- How to _write_ a test lives in `.ai/rules/testing.md`. + +## Comments + +- Code must be self-explanatory: reach for clear names, small functions, and types before a comment. +- Do not add comments. A comment is a last resort and explains only _why_ something is done, never _what_ the code does. +- When you encounter an obsolete, redundant, or "what" comment, delete it. +- Keep PHPDoc only when it carries type information, public API intent, static-analysis value, or a non-obvious + constraint. Keep comments that explain framework quirks, ordering requirements, or cache and build behavior. diff --git a/.ai/guidelines/git.md b/.ai/guidelines/git.md new file mode 100644 index 0000000..9be5087 --- /dev/null +++ b/.ai/guidelines/git.md @@ -0,0 +1,8 @@ +# Git & Pull Requests + +- Never credit the agent. No `Co-Authored-By` trailer and no "generated by" attribution in commit messages or pull + request descriptions. +- Make meaningful commits: one logical change per commit with a conventional-commit subject (`feat:`, `fix:`, `chore:`, + `refactor:`, `test:`, `docs:`). Squash throwaway "wip" commits before opening a PR. +- Keep pull request descriptions compact: what changed and why, in a few lines. No filler. +- For visual changes, include screenshots or concrete before/after examples in the PR description. diff --git a/.ai/rules/context.md b/.ai/rules/context.md new file mode 100644 index 0000000..b0c109c --- /dev/null +++ b/.ai/rules/context.md @@ -0,0 +1,30 @@ +--- +paths: + - "app/Providers/**" + - "app/Models/**" +--- + +# Context resolvers + +## One place registers them + +`AppServiceProvider::registerLatticeContext()` is the only place `Lattice::context()` is called. A key registered +there resolves at most once per request and cascades into every child component, so adding a key is how you make a +record reachable from a definition. + +## Dependent keys resolve inside their parent + +`member`, `invitation`, and `passkey` resolve through the record that owns them — the team, or the signed-in user — +rather than by a bare `findOrFail()` on the id. That scoping is what makes a forged id in a sealed reference a 404 +instead of another team's record. Keep it when adding a key. + +## Give a closure resolver a concrete return type + +Lattice reads the declared return type to map a bound route model to its context key, which is what lets +`render(PageSchema $schema, Team $team)` seed the `team` frame. A resolver without one needs an explicit +`model: Team::class`. + +## Model docblocks are generated + +The `@property` blocks come from `barryvdh/laravel-ide-helper`. Where the generator is wrong about nullability — a +`NOT NULL` foreign key it types as `|null` — correct it in place rather than working around it at every call site. diff --git a/.ai/rules/frontend.md b/.ai/rules/frontend.md new file mode 100644 index 0000000..b4e8e20 --- /dev/null +++ b/.ai/rules/frontend.md @@ -0,0 +1,31 @@ +--- +paths: + - "resources/js/**" + - "resources/css/**" + - "vite.config.ts" +--- + +# Frontend + +## There are no page components + +`resources/js/app.tsx` boots `createLatticeApp` and registers the handful of custom React components by string key. +A new screen is a PHP page class, not a `.tsx` file. Write React only for behavior the wire format cannot express — +the passkey components are the example: they talk to `@laravel/passkeys` in the browser. + +## Import from the package that owns the component + +Form controls (`Input`, `Label`, `InputError`, …) live in `@lattice-php/form`; layout and display components live in +`@lattice-php/ui`; the app runtime and `RendererComponent` come from `@lattice-php/lattice`. Both packages are direct +dependencies — do not reach through the umbrella for something it does not re-export. + +## Wire types are generated + +`resources/js/lattice/generated.d.ts` declares the props of every `#[AsComponent]` class. Do not hand-write a +`declare module "@lattice-php/core"` block for a component that has a PHP counterpart; run +`php artisan lattice:typescript` instead. + +## Lattice owns the design tokens + +`@import '@lattice-php/lattice/css'` pulls in the token layer. Override a token unlayered on `:root` so it wins +regardless of import order; do not restate Lattice's own defaults. diff --git a/.ai/rules/index.md b/.ai/rules/index.md new file mode 100644 index 0000000..e6503a3 --- /dev/null +++ b/.ai/rules/index.md @@ -0,0 +1,14 @@ +# Project Rules Index + +Before planning or editing, find the row whose globs match the file's path and read that rule file. + +Every glob is a code span. A bare `*` in a table cell reads as markdown emphasis, and a formatter will rewrite +`app/*/Concerns/**` into `app/_/Concerns/\**` — silently breaking the mapping this file exists to carry. + +| Applies to | Rule file | +| --- | --- | +| `app/Actions/**`, `app/Forms/**`, `app/Tables/**`, `app/Fragments/**`, `app/Pages/**`, `app/Layouts/**` | .ai/rules/lattice.md | +| `app/Providers/**`, `app/Models/**` | .ai/rules/context.md | +| `resources/js/**`, `resources/css/**`, `vite.config.ts` | .ai/rules/frontend.md | +| `tests/**` | .ai/rules/testing.md | +| `lang/**` | .ai/rules/translations.md | diff --git a/.ai/rules/lattice.md b/.ai/rules/lattice.md new file mode 100644 index 0000000..14ef27b --- /dev/null +++ b/.ai/rules/lattice.md @@ -0,0 +1,55 @@ +--- +paths: + - "app/Actions/**" + - "app/Forms/**" + - "app/Tables/**" + - "app/Fragments/**" + - "app/Pages/**" + - "app/Layouts/**" +--- + +# Lattice definitions + +## Read context, never route parameters or session state + +A definition runs twice: once while the page renders, and again on its own signed endpoint, which carries no route +parameters. Read records with `$this->contextModel('team')` (aborts 404 when the key is absent or resolves to +nothing) or `$this->contextModelOrNull('team')` (returns null, for render-time gates). Never reach for +`$request->route(...)` inside a definition. + +The keys are registered once in `AppServiceProvider::registerLatticeContext()`. A key with a resolver cascades into +every child component Lattice builds, so a page that types `Team $team` in `render()` already seeds `team` for the +forms, tables, and actions on it — do not pass `['team' => $team->slug]` by hand. + +## Declare authorization on the attribute + +Put the ability and its subject on the definition attribute rather than in an `authorize()` body: + +```php +#[AsForm('teams.update', can: 'update', on: 'team')] +#[AsAction('teams.members.remove', can: 'removeMember', on: 'team')] +``` + +`on` names a registered context key; Lattice resolves the subject before the definition runs and denies a missing +one. Keep `authorize()` only for conditions a gate subject cannot express. A plain component takes the same pair as +a method: `Heading::make(…)->can('update', on: 'team')`. + +A page's `can` gates who may load the page; it does **not** gate the definitions rendered on it. Every definition +needs its own declaration. + +## Page middleware merges with the config default + +`config('lattice.pages.middleware')` is `['web']` and attribute middleware is appended, never substituted. Write +`middleware: ['auth', 'verified']`, not `['web', 'auth', 'verified']`. + +## handle() takes validated data + +Lattice validates a form or action form before `handle()` runs and passes the result in. Declare +`handle(FormData $data)` and read through `$data->string('name')`, `$data->enum('role', TeamRole::class)`, and the +rest of the `ValidatedInput` API. Never call `$this->validate($request)` yourself, and never read raw request input +for a field the schema declares. + +## An empty ActionGroup still renders + +Lattice drops an unauthorized row action, but the `ActionGroup` wrapping it is a plain container and would render as +an empty dropdown. Build the action list first and return `[]` from `actions()` when nothing survives. diff --git a/.ai/rules/testing.md b/.ai/rules/testing.md new file mode 100644 index 0000000..0c0afab --- /dev/null +++ b/.ai/rules/testing.md @@ -0,0 +1,62 @@ +--- +paths: + - "tests/**" +--- + +# Testing + +## Pest, with RefreshDatabase applied globally + +`tests/Pest.php` binds `Tests\TestCase` plus `RefreshDatabase` to the `Feature` suite and `Tests\BrowserTestCase` to +the `Browser` suite. Never re-add `uses(RefreshDatabase::class)` in a test file. + +`Tests\TestCase` stubs Vite (`withoutVite()`): a feature test renders a real route, and `@vite` throws without a +built manifest. That is what keeps the Feature suite off the node toolchain. `Tests\BrowserTestCase` turns the stub +off, because a browser test drives the built bundle. + +## Prefer feature tests + +Exercise the application through HTTP endpoints, Lattice forms, actions and tables, jobs, events, policies, and +database effects. Use unit tests only for complex pure algorithms or small deterministic value objects. + +## Lattice UI is exercised via InteractsWithLatticeComponents + +`Tests\TestCase` carries the trait: `submitForm(FormClass, $data, $context)`, `callAction(ActionClass, $data, +$context)`, `loadTable(TableClass, $query, $context)`. A definition whose gate denies the actor is **hidden** at +render time, so the normal helpers refuse to seal it — assert the 403 with the `…Denied` variants +(`submitDeniedForm`, `callDeniedAction`, `loadDeniedTable`) instead. + +Where a context resolver scopes a lookup, an unauthorized reference is a **404**, not a 403: the record does not +exist for that actor. + +## What a test must earn + +Every test asserts an observable behavior change caused by an interaction, input, or state transition. Delete on +sight: + +- **Render-only tests** — a page loads and shows static text, with no interaction. +- **Styling pins** — assertions on Tailwind utility classes. Assert semantic state instead. +- **Absence-only assertions** — `assertDontSee()` on initial render, unless the same test establishes the positive + case too. +- **Tautologies** — asserting a factory returns what it was configured with. +- **Duplicated coverage** — every behavior has exactly one owning test. Do not re-assert Lattice's own contract + (field validation, pagination internals) in every consumer. + +## Keep library behavior in its owning library + +Generic Lattice or framework behavior belongs in that package's suite, even when the regression first showed up +here. Test this app's configuration, composition, and observable integration behavior. + +## tests/ is analysed at PHPStan level 8, with no baseline + +Narrow a nullable at the source: prefer `->refresh()` (returns `$this`) over `->fresh()` (returns `?static`), reach +for `findOrFail()`/`firstOrFail()`, and use the `personalTeam()` helper in `tests/Pest.php` where a factory +guarantees the record. Never silence an error with `@phpstan-ignore`, a baseline entry, `assert()`, an inline +`@var`, or a cast. + +## Browser tests for client-only behavior + +UI behavior that is not about an endpoint's payload goes in `tests/Browser`. They serve the built bundle, so run +`npm run build` first. Target components by their `data-test` attribute — Lattice writes the node's full identity +(`action-teams.3.edit`), or the value of an explicit `->key()`. Adding a stable `key()` to make an assertion clearer +is fine. diff --git a/.ai/rules/translations.md b/.ai/rules/translations.md new file mode 100644 index 0000000..f3b1678 --- /dev/null +++ b/.ai/rules/translations.md @@ -0,0 +1,34 @@ +--- +paths: + - "lang/**" +--- + +# Translations + +## Lowercase keys only + +Key segments use lowercase letters, numbers, and dashes. Never camelCase — `teams.invite.already-member`, not +`teams.invite.alreadyMember`. + +## Dot notation via nested arrays + +Use nested PHP arrays to build dot-separated keys: `'invite' => ['submit' => '...']` resolves to +`teams.invite.submit`. Dots express hierarchy; keep dashes for compound terms (`email-address`, `recovery-codes`). + +## Suffixes for secondary strings + +`.label` for a form label that also has helper text, `.help-text` for the helper text, `.title`/`.body` for a +notification that has both. + +## common.* for reusable strings + +Shared field labels (`common.field.email-address`), actions (`common.action.save`), and statuses live in +`lang/{locale}/common.php`. + +## File naming + +Translation files use kebab-case filenames matching the area (`teams.php`, `settings.php`, `navigation.php`). + +## Always update both locales + +Every addition or change lands in `lang/en/` **and** `lang/de/`. diff --git a/.githooks/pre-commit b/.githooks/pre-commit new file mode 100755 index 0000000..f5b4e5d --- /dev/null +++ b/.githooks/pre-commit @@ -0,0 +1,80 @@ +#!/bin/sh +set -e + +root="$(git rev-parse --show-toplevel)" +cd "$root" + +tmp="$(mktemp -d)" +trap 'rm -rf "$tmp"' EXIT + +# A file that is staged AND dirty carries hunks the author deliberately held +# back. Formatting it in place and re-staging would sweep those into the commit, +# so those files are only checked and the commit is refused instead. +split_staged() { + kind="$1" + shift + git diff --cached --name-only --diff-filter=ACMR -- "$@" | sort >"$tmp/staged.$kind" + git diff --name-only -- "$@" | sort >"$tmp/dirty.$kind" + comm -23 "$tmp/staged.$kind" "$tmp/dirty.$kind" >"$tmp/fix.$kind" + comm -12 "$tmp/staged.$kind" "$tmp/dirty.$kind" >"$tmp/check.$kind" +} + +# NUL-delimited so paths with spaces survive. +run() { + list="$1" + shift + tr '\n' '\0' <"$list" | xargs -0 "$@" +} + +has() { + [ -s "$1" ] +} + +split_staged php '*.php' +split_staged ts '*.ts' '*.tsx' ':(exclude)resources/js/types/sprite-icons.ts' +split_staged md '*.md' + +if has "$tmp/fix.php"; then + printf 'rector + pint (staged PHP)\n' + # Rector before pint: rector's output is not pint-clean, pint normalizes it. + run "$tmp/fix.php" ./vendor/bin/rector process --config=rector.php --no-progress-bar + run "$tmp/fix.php" ./vendor/bin/pint + run "$tmp/fix.php" git add +fi + +if has "$tmp/fix.ts"; then + printf 'oxfmt + oxlint (staged TypeScript)\n' + run "$tmp/fix.ts" ./node_modules/.bin/oxfmt --write + run "$tmp/fix.ts" ./node_modules/.bin/oxlint --fix --no-error-on-unmatched-pattern + run "$tmp/fix.ts" git add + run "$tmp/fix.ts" ./node_modules/.bin/oxlint --no-error-on-unmatched-pattern +fi + +if has "$tmp/fix.md"; then + printf 'oxfmt (staged Markdown)\n' + run "$tmp/fix.md" ./node_modules/.bin/oxfmt --write + run "$tmp/fix.md" git add +fi + +if has "$tmp/check.php" || has "$tmp/check.ts" || has "$tmp/check.md"; then + printf '\npartially staged — checked, not fixed:\n' + cat "$tmp/check.php" "$tmp/check.ts" "$tmp/check.md" + + failed=0 + if has "$tmp/check.php"; then + run "$tmp/check.php" ./vendor/bin/pint --test || failed=1 + run "$tmp/check.php" ./vendor/bin/rector process --config=rector.php --dry-run --no-progress-bar || failed=1 + fi + if has "$tmp/check.ts"; then + run "$tmp/check.ts" ./node_modules/.bin/oxfmt --check || failed=1 + run "$tmp/check.ts" ./node_modules/.bin/oxlint --no-error-on-unmatched-pattern || failed=1 + fi + if has "$tmp/check.md"; then + run "$tmp/check.md" ./node_modules/.bin/oxfmt --check || failed=1 + fi + + if [ "$failed" -ne 0 ]; then + printf '\nStage or stash the rest of these files, then commit again.\n' >&2 + exit 1 + fi +fi diff --git a/.githooks/pre-push b/.githooks/pre-push new file mode 100755 index 0000000..004f657 --- /dev/null +++ b/.githooks/pre-push @@ -0,0 +1,92 @@ +#!/bin/sh +set -e + +root="$(git rev-parse --show-toplevel)" +cd "$root" + +zero='0000000000000000000000000000000000000000' + +# git feeds pre-push " " per ref. +# Anything unexpected (no stdin, unknown remote sha, deletions mixed in) falls +# through to running the full gate — being slow is the safe failure here. +changed_files() { + scope_known=0 + while read -r _local_ref local_sha _remote_ref remote_sha; do + [ "$local_sha" = "$zero" ] && continue + + if [ "$remote_sha" = "$zero" ] || ! git cat-file -e "$remote_sha" 2>/dev/null; then + base="$(git merge-base origin/main "$local_sha" 2>/dev/null || true)" + [ -z "$base" ] && return 1 + else + base="$remote_sha" + fi + + git diff --name-only "$base" "$local_sha" || return 1 + scope_known=1 + done + + [ "$scope_known" = 1 ] || return 1 +} + +files="$(changed_files || echo '__UNKNOWN__')" + +if [ -z "$files" ]; then + printf 'nothing to push\n' + exit 0 +fi + +matches() { + printf '%s\n' "$files" | grep -qE "$1" +} + +if [ "$files" != '__UNKNOWN__' ]; then + # Docs and agent/meta files carry no code the gates can check. + if ! matches '^(app|bootstrap|config|database|lang|public|resources|routes|tests)/|^(composer|package|phpunit|pint|tsconfig|vite\.config)|^\.oxlintrc'; then + printf 'docs/meta only — skipping the gate\n' + exit 0 + fi +fi + +run_php=1 +run_ts=1 +run_build=1 + +if [ "$files" != '__UNKNOWN__' ]; then + matches '\.php$|^composer\.(json|lock)$|^(config|database|routes|lang)/' || run_php=0 + matches '\.(ts|tsx|css)$|^(package\.json|package-lock\.json|tsconfig\.json|vite\.config\.ts|\.oxlintrc\.json)$' || run_ts=0 + matches '\.(ts|tsx|css)$|^(package\.json|package-lock\.json|vite\.config\.ts)$' || run_build=0 +fi + +# The JS and PHP gates are independent, so the JS gate runs in the background +# while phpstan holds the foreground; its buffered log is shown only on failure. +# Repeating the JS checks here is deliberate: pre-commit already fixes them, but +# a --no-verify commit would otherwise reach CI unchecked. +js_pid='' +if [ "$run_ts" = 1 ]; then + printf 'npm run format:check + lint:check + types:check (background)\n' + js_log="$(mktemp)" + { npm run format:check && npm run lint:check && npm run types:check; } >"$js_log" 2>&1 & + js_pid=$! +fi + +if [ "$run_php" = 1 ]; then + printf 'phpstan\n' + vendor/bin/phpstan analyse --no-progress +fi + +if [ -n "$js_pid" ]; then + if ! wait "$js_pid"; then + cat "$js_log" >&2 + rm -f "$js_log" + exit 1 + fi + rm -f "$js_log" +fi + +printf 'composer test\n' +composer test + +if [ "$run_build" = 1 ]; then + printf 'npm run build\n' + npm run build +fi diff --git a/.github/actions/setup-test-env/action.yml b/.github/actions/setup-test-env/action.yml new file mode 100644 index 0000000..eb2e727 --- /dev/null +++ b/.github/actions/setup-test-env/action.yml @@ -0,0 +1,102 @@ +name: Setup Test Environment +description: > + Shared CI setup: PHP toolchain + composer install + app bootstrap, node + npm + install, and the Vite asset build. build_js implies install_js and requires + build_php: the lattice vite plugin discovers component packages from + vendor/composer/installed.json, so building without vendor/ silently drops + their chunks from the bundle. + +inputs: + php_version: + description: PHP version passed to setup-php. + default: '8.4' + build_php: + description: Install PHP, composer dependencies, and bootstrap the app (.env, app key). + default: 'true' + install_js: + description: Install node and npm dependencies. + default: 'false' + build_js: + description: Build the Vite assets (implies install_js, requires build_php). + default: 'false' + enable_playwright: + description: Install the Playwright chromium browser with its system deps. + default: 'false' + +runs: + using: composite + steps: + - if: inputs.build_php == 'true' + uses: shivammathur/setup-php@f3e473d116dcccaddc5834248c87452386958240 # v2 + with: + php-version: ${{ inputs.php_version }} + tools: composer:v2 + coverage: none + + - name: Resolve composer cache directory + if: inputs.build_php == 'true' + id: composer-cache + shell: bash + run: echo "dir=$(composer config cache-files-dir)" >> "$GITHUB_OUTPUT" + + - if: inputs.build_php == 'true' + uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: composer-${{ runner.os }}-${{ inputs.php_version }}-${{ hashFiles('composer.lock') }} + restore-keys: composer-${{ runner.os }}-${{ inputs.php_version }}- + + - if: inputs.build_php == 'true' + shell: bash + run: composer install --no-interaction --no-scripts --no-progress --prefer-dist --optimize-autoloader + + - name: Prepare Application + if: inputs.build_php == 'true' + shell: bash + run: | + cp .env.example .env + php artisan package:discover --ansi + php artisan key:generate + + - if: inputs.install_js == 'true' || inputs.build_js == 'true' + uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v6 + with: + node-version: '22' + cache: npm + + # `npm install`, not `npm ci`: the committed lockfile is generated on macOS + # and has never carried the linux-only optional packages the wasm fallbacks + # of rolldown and tailwind oxide pull in. `npm ci` rejects that as out of + # sync; install resolves the missing optional deps itself. + - if: inputs.install_js == 'true' || inputs.build_js == 'true' + shell: bash + run: npm install --no-audit --no-fund + + - name: Build Assets + if: inputs.build_js == 'true' + shell: bash + run: npm run build + + - name: Resolve Playwright version + if: inputs.enable_playwright == 'true' + id: pw + shell: bash + run: echo "version=$(node -p "require('playwright/package.json').version")" >> "$GITHUB_OUTPUT" + + - name: Cache Playwright browsers + if: inputs.enable_playwright == 'true' + id: pw-cache + uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: ~/.cache/ms-playwright + key: playwright-${{ runner.os }}-${{ steps.pw.outputs.version }} + + - name: Install Playwright browser and system deps + if: inputs.enable_playwright == 'true' && steps.pw-cache.outputs.cache-hit != 'true' + shell: bash + run: npx playwright install --with-deps chromium + + - name: Install Playwright system deps only + if: inputs.enable_playwright == 'true' && steps.pw-cache.outputs.cache-hit == 'true' + shell: bash + run: npx playwright install-deps chromium diff --git a/.github/dependabot.yml b/.github/dependabot.yml index ae67c4d..d03a88b 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -10,3 +10,25 @@ updates: github-actions: patterns: - "*" + + - package-ecosystem: "composer" + directory: "/" + schedule: + interval: "weekly" + cooldown: + default-days: 5 + groups: + composer: + patterns: + - "*" + + - package-ecosystem: "npm" + directory: "/" + schedule: + interval: "weekly" + cooldown: + default-days: 5 + groups: + npm: + patterns: + - "*" diff --git a/.github/workflows/browser.yml b/.github/workflows/browser.yml new file mode 100644 index 0000000..5cf49ae --- /dev/null +++ b/.github/workflows/browser.yml @@ -0,0 +1,44 @@ +name: browser + +on: + push: + branches: [main] + pull_request: + branches: [main] + +permissions: + contents: read + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} + +# Split out from the Unit/Feature suites so a flaking browser run reports its own +# status check instead of failing the context that carries the fast tests. +jobs: + browser: + runs-on: ubuntu-latest + timeout-minutes: 15 + + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v6 + with: + persist-credentials: false + + - uses: ./.github/actions/setup-test-env + with: + build_js: 'true' + enable_playwright: 'true' + + - name: Browser Tests + timeout-minutes: 6 + run: php artisan test tests/Browser --compact + + - name: Upload Screenshots + if: failure() + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: browser-screenshots + path: tests/Browser/Screenshots/ + if-no-files-found: ignore + retention-days: 7 diff --git a/.github/workflows/js.yml b/.github/workflows/js.yml new file mode 100644 index 0000000..28f2232 --- /dev/null +++ b/.github/workflows/js.yml @@ -0,0 +1,49 @@ +name: js + +on: + push: + branches: [main] + pull_request: + branches: [main] + +permissions: + contents: read + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} + +# vendor/ is installed even though nothing here runs PHP tests: the Vite build +# resolves Lattice component packages out of composer's installed.json, and +# lattice:typescript needs the PHP definitions to generate from. +jobs: + js: + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v6 + with: + persist-credentials: false + + - uses: ./.github/actions/setup-test-env + with: + install_js: 'true' + + - name: Check Frontend Formatting + run: npm run format:check + + - name: Lint Frontend + run: npm run lint:check + + - name: Check Types + run: npm run types:check + + # The committed wire types must match what the PHP definitions produce; + # a stale generated.d.ts is a silent type lie on the client. + - name: Check Generated Lattice Types + run: | + php artisan lattice:typescript + git diff --exit-code resources/js/lattice/generated.d.ts + + - name: Build + run: npm run build diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml deleted file mode 100644 index fe6c2eb..0000000 --- a/.github/workflows/lint.yml +++ /dev/null @@ -1,49 +0,0 @@ -name: linter - -on: - push: - branches: - - develop - - main - - master - pull_request: - branches: - - develop - - main - - master - -permissions: - contents: read - -jobs: - quality: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v6 - with: - persist-credentials: false - - - name: Setup PHP - uses: shivammathur/setup-php@f3e473d116dcccaddc5834248c87452386958240 # v2 - with: - php-version: '8.4' - - - name: Install Dependencies - run: | - composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist - npm install - - - name: Run Pint - run: composer lint - - - name: Format Frontend - run: npm run format - - - name: Lint Frontend - run: npm run lint - - # - name: Commit Changes - # uses: stefanzweifel/git-auto-commit-action@v7 - # with: - # commit_message: fix code style - # commit_options: '--no-verify' diff --git a/.github/workflows/php-static.yml b/.github/workflows/php-static.yml new file mode 100644 index 0000000..c0e9b5b --- /dev/null +++ b/.github/workflows/php-static.yml @@ -0,0 +1,36 @@ +name: php-static + +on: + push: + branches: [main] + pull_request: + branches: [main] + +permissions: + contents: read + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} + +# Style and static analysis need vendor/ but no node toolchain, so this reports +# minutes before the suites do. +jobs: + php-static: + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v6 + with: + persist-credentials: false + + - uses: ./.github/actions/setup-test-env + + - name: Check PHP Code Style + run: composer lint:check + + - name: Static Analysis + run: vendor/bin/phpstan analyse --no-progress + + - name: Rector + run: composer rector:check diff --git a/.github/workflows/php-tests.yml b/.github/workflows/php-tests.yml new file mode 100644 index 0000000..4dde71d --- /dev/null +++ b/.github/workflows/php-tests.yml @@ -0,0 +1,37 @@ +name: php-tests + +on: + push: + branches: [main] + pull_request: + branches: [main] + +permissions: + contents: read + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} + +# No node toolchain and no Playwright download: the Unit and Feature suites never +# touch public/build. That work lives in the js and browser workflows. +jobs: + php-tests: + runs-on: ubuntu-latest + timeout-minutes: 10 + strategy: + matrix: + php-version: ['8.4', '8.5'] + + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v6 + with: + persist-credentials: false + + - uses: ./.github/actions/setup-test-env + with: + php_version: ${{ matrix.php-version }} + + - name: Tests + timeout-minutes: 6 + run: php artisan test --compact --parallel --exclude-testsuite Browser diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml deleted file mode 100644 index f15d419..0000000 --- a/.github/workflows/tests.yml +++ /dev/null @@ -1,62 +0,0 @@ -name: tests - -on: - push: - branches: - - develop - - main - - master - pull_request: - branches: - - develop - - main - - master - -permissions: - contents: read - -jobs: - ci: - runs-on: ubuntu-latest - strategy: - matrix: - php-version: ['8.4', '8.5'] - - steps: - - name: Checkout code - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v6 - with: - persist-credentials: false - - - name: Setup PHP - uses: shivammathur/setup-php@f3e473d116dcccaddc5834248c87452386958240 # v2 - with: - php-version: ${{ matrix.php-version }} - tools: composer:v2 - coverage: xdebug - - - name: Setup Node - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v6 - with: - node-version: '24' - - - name: Install Node Dependencies - run: npm i - - - name: Install Playwright Browsers - run: npx playwright install --with-deps chromium - - - name: Install Dependencies - run: composer install --no-interaction --prefer-dist --optimize-autoloader - - - name: Copy Environment File - run: cp .env.example .env - - - name: Generate Application Key - run: php artisan key:generate - - - name: Build Assets - run: npm run build - - - name: Tests - run: ./vendor/bin/pest diff --git a/.gitignore b/.gitignore index 311667e..da0c97b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,16 +1,14 @@ /.phpunit.cache +/.worktrees /bootstrap/ssr /tests/Browser/Screenshots /node_modules /public/build -/public/fonts-manifest.dev.json /public/hot /public/storage /storage/*.key /storage/pail -/resources/js/actions -/resources/js/routes -/resources/js/wayfinder +/resources/js/lattice/typescript-transformer-manifest.json /vendor .DS_Store .env @@ -38,7 +36,10 @@ AGENTS.md CLAUDE.md docs/superpowers .superpowers -storage/wayfinder-cache + +.playwright-mcp **/caddy /frankenphp +/.phpstan-cache +/.rector-cache diff --git a/.oxlintrc.json b/.oxlintrc.json index a633369..fd47e9f 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -1,13 +1,15 @@ { "$schema": "./node_modules/oxlint/configuration_schema.json", - "ignorePatterns": ["resources/js/types/sprite-icons.ts"], + "ignorePatterns": ["resources/js/types/sprite-icons.ts", "resources/js/lattice/generated.d.ts"], "plugins": ["typescript", "unicorn", "oxc", "react", "jsx-a11y", "import"], "categories": { - "correctness": "error" + "correctness": "error", + "suspicious": "warn" }, "rules": { "jsx-a11y/no-autofocus": "off", - "jsx-a11y/prefer-tag-over-role": "off" + "jsx-a11y/prefer-tag-over-role": "off", + "react/react-in-jsx-scope": "off" }, "env": { "builtin": true diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..0d2425e --- /dev/null +++ b/.prettierignore @@ -0,0 +1,4 @@ +# oxfmt reads this file. index.md's globs are code spans so they survive a +# reformat on their own, but the mapping is load-bearing enough to keep the +# formatter off it entirely. +.ai/rules/index.md diff --git a/README.md b/README.md index f22571a..889af26 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ hand-writing the client. - **Authentication** — login, registration, password reset, and email verification via [Laravel Fortify](https://laravel.com/docs/fortify), plus **two-factor authentication** and **passkeys**. -- **Teams** — multi-tenant teams with memberships, roles, and email invitations. +- **Teams** — memberships, roles, and email invitations. - **Account settings** — profile, password, and security management. - **Realtime notifications** — live in-app toasts powered by [Laravel Reverb](https://laravel.com/docs/reverb) and Echo. Invite a teammate who already has an account and they are notified instantly, wherever @@ -59,13 +59,41 @@ variables in `.env` (`reverb:install` generates them). The client connects in `resources/js/app.tsx` via `configureEcho`, and pages declare their listeners in PHP — see `app/Pages/Concerns/ListensForUserNotifications.php` for the team-invitation example. -## Testing +## Project layout + +There are no page components to write. A screen is a PHP class: + +| Directory | What lives there | +| -------------------------- | --------------------------------------------------------------------- | +| `app/Pages/` | `#[AsPage]` classes — each registers its own route | +| `app/Layouts/` | `#[AsLayout]` classes — the app and auth chrome | +| `app/Forms/` | `#[AsForm]` classes — fields, validation, and submit handling | +| `app/Tables/` | `#[AsTable]` classes — columns, sources, and row actions | +| `app/Actions/` | `#[AsAction]` classes — server-side effects (toast, redirect, reload) | +| `resources/js/components/` | the handful of custom React components, registered in `app.tsx` | + +Records reach a definition through Lattice's context registry rather than through route parameters — +the keys are registered in `AppServiceProvider::registerLatticeContext()`. + +## Testing and verification ```bash -composer test # Pint + the full Pest suite (feature, unit, browser) -./vendor/bin/pest # tests only +composer test # Pint + the Unit and Feature suites, in parallel +composer test:browser # the Pest browser suite (needs `npm run build` first) +composer ci:check # everything CI runs: frontend checks, PHPStan, Rector, tests ``` +Git hooks enforce the gate locally: `composer install` points `core.hooksPath` at `.githooks`, where +**pre-commit** formats staged files and **pre-push** runs PHPStan, the test suite, and the build, +scoped to what the push touches. Run `composer hooks:install` if the hooks are not active. + +## Working with an AI agent + +The kit ships agent instructions: `.ai/guidelines/` holds the project-wide guidance and `.ai/rules/` +holds path-scoped conventions (`.ai/rules/index.md` maps globs to rule files). +[Laravel Boost](https://github.com/laravel/boost) compiles them into `CLAUDE.md` / `AGENTS.md` with +`php artisan boost:update` — both are git-ignored and regenerated locally. + ## License MIT. diff --git a/app/Actions/Settings/DeletePasskey.php b/app/Actions/Settings/DeletePasskey.php index ca2f401..2d423be 100644 --- a/app/Actions/Settings/DeletePasskey.php +++ b/app/Actions/Settings/DeletePasskey.php @@ -3,8 +3,7 @@ namespace App\Actions\Settings; -use App\Concerns\ResolvesCurrentUser; -use Illuminate\Http\Request; +use Laravel\Passkeys\Passkey; use Lattice\Actions\ActionDefinition; use Lattice\Actions\ActionResult; use Lattice\Actions\Components\Action; @@ -14,8 +13,6 @@ #[AsAction('settings.passkeys.delete')] class DeletePasskey extends ActionDefinition { - use ResolvesCurrentUser; - public function definition(Action $action): Action { return $action @@ -28,15 +25,16 @@ public function definition(Action $action): Action ); } - #[\Override] - public function authorize(Request $request): bool + /** + * The `passkey` context resolver scopes the lookup to the signed-in user, + * so a reference naming someone else's passkey resolves to nothing. + */ + public function handle(): ActionResult { - return $this->currentUser()->passkeys()->whereKey($this->context('passkey'))->exists(); - } + /** @var Passkey $passkey */ + $passkey = $this->contextModel('passkey'); - public function handle(Request $request): ActionResult - { - $this->currentUser()->passkeys()->whereKey($this->context('passkey'))->delete(); + $passkey->delete(); return ActionResult::success() ->toast(__('settings.passkeys.removed')) diff --git a/app/Actions/Settings/DisableTwoFactorAuthenticationAction.php b/app/Actions/Settings/DisableTwoFactorAuthenticationAction.php index 19dd7bc..508f7eb 100644 --- a/app/Actions/Settings/DisableTwoFactorAuthenticationAction.php +++ b/app/Actions/Settings/DisableTwoFactorAuthenticationAction.php @@ -4,7 +4,6 @@ namespace App\Actions\Settings; use App\Concerns\ResolvesCurrentUser; -use Illuminate\Http\Request; use Laravel\Fortify\Actions\DisableTwoFactorAuthentication; use Laravel\Fortify\Features; use Lattice\Actions\ActionDefinition; @@ -34,7 +33,7 @@ public function definition(ActionComponent $action): ActionComponent ); } - public function handle(Request $request): ActionResult + public function handle(): ActionResult { $user = $this->currentUser(); diff --git a/app/Actions/Settings/EnableTwoFactorAuthenticationAction.php b/app/Actions/Settings/EnableTwoFactorAuthenticationAction.php index d31e42b..b7b30fc 100644 --- a/app/Actions/Settings/EnableTwoFactorAuthenticationAction.php +++ b/app/Actions/Settings/EnableTwoFactorAuthenticationAction.php @@ -5,7 +5,6 @@ use App\Concerns\ResolvesCurrentUser; use App\Fragments\Settings\TwoFactorSetupFragment; -use Illuminate\Http\Request; use Laravel\Fortify\Actions\EnableTwoFactorAuthentication; use Laravel\Fortify\Features; use Lattice\Actions\ActionDefinition; @@ -31,7 +30,7 @@ public function definition(ActionComponent $action): ActionComponent ->method(HttpMethod::Post); } - public function handle(Request $request): ActionResult + public function handle(): ActionResult { $user = $this->currentUser(); diff --git a/app/Actions/Settings/RegenerateRecoveryCodesAction.php b/app/Actions/Settings/RegenerateRecoveryCodesAction.php index 8d8d0e2..ddc5e85 100644 --- a/app/Actions/Settings/RegenerateRecoveryCodesAction.php +++ b/app/Actions/Settings/RegenerateRecoveryCodesAction.php @@ -4,7 +4,6 @@ namespace App\Actions\Settings; use App\Concerns\ResolvesCurrentUser; -use Illuminate\Http\Request; use Laravel\Fortify\Actions\GenerateNewRecoveryCodes; use Laravel\Fortify\Features; use Lattice\Actions\ActionDefinition; @@ -34,7 +33,7 @@ public function definition(ActionComponent $action): ActionComponent ); } - public function handle(Request $request): ActionResult + public function handle(): ActionResult { $user = $this->currentUser(); diff --git a/app/Actions/Settings/SendVerificationEmailAction.php b/app/Actions/Settings/SendVerificationEmailAction.php index 52d42f1..f3f0aa9 100644 --- a/app/Actions/Settings/SendVerificationEmailAction.php +++ b/app/Actions/Settings/SendVerificationEmailAction.php @@ -4,7 +4,6 @@ namespace App\Actions\Settings; use App\Concerns\ResolvesCurrentUser; -use Illuminate\Http\Request; use Lattice\Actions\ActionDefinition; use Lattice\Actions\ActionResult; use Lattice\Actions\Components\Action as ActionComponent; @@ -26,7 +25,7 @@ public function definition(ActionComponent $action): ActionComponent ->emphasis(Emphasis::Link); } - public function handle(Request $request): ActionResult + public function handle(): ActionResult { $user = $this->currentUser(); diff --git a/app/Actions/Teams/CancelInvitation.php b/app/Actions/Teams/CancelInvitation.php index 36e4feb..1f4946a 100644 --- a/app/Actions/Teams/CancelInvitation.php +++ b/app/Actions/Teams/CancelInvitation.php @@ -3,9 +3,7 @@ namespace App\Actions\Teams; -use App\Concerns\ResolvesCurrentUser; -use App\Concerns\ResolvesTeamFromContext; -use Illuminate\Http\Request; +use App\Models\TeamInvitation; use Lattice\Actions\ActionDefinition; use Lattice\Actions\ActionResult; use Lattice\Actions\Components\Action; @@ -13,12 +11,9 @@ use Lattice\Ui\Enums\HttpMethod; use Lattice\Ui\Enums\Variant; -#[AsAction('teams.invitations.cancel')] +#[AsAction('teams.invitations.cancel', can: 'cancelInvitation', on: 'team')] class CancelInvitation extends ActionDefinition { - use ResolvesCurrentUser; - use ResolvesTeamFromContext; - public function definition(Action $action): Action { return $action @@ -32,20 +27,12 @@ public function definition(Action $action): Action ); } - #[\Override] - public function authorize(Request $request): bool - { - return $this->currentUser()->can('cancelInvitation', $this->teamFromContext()); - } - - public function handle(Request $request): ActionResult + public function handle(): ActionResult { - $team = $this->teamFromContext(); + /** @var TeamInvitation $invitation */ + $invitation = $this->contextModel('invitation'); - $team->invitations() - ->where('code', $this->contextString('invitation')) - ->firstOrFail() - ->delete(); + $invitation->delete(); return ActionResult::success() ->toast(__('teams.invitations.cancelled')) diff --git a/app/Actions/Teams/RemoveMember.php b/app/Actions/Teams/RemoveMember.php index 5e40c67..8c37f78 100644 --- a/app/Actions/Teams/RemoveMember.php +++ b/app/Actions/Teams/RemoveMember.php @@ -3,12 +3,9 @@ namespace App\Actions\Teams; -use App\Concerns\ResolvesCurrentUser; -use App\Concerns\ResolvesTeamFromContext; use App\Events\Teams\RemovedFromTeam; use App\Models\Team; use App\Models\User; -use Illuminate\Http\Request; use Lattice\Actions\ActionDefinition; use Lattice\Actions\ActionResult; use Lattice\Actions\Components\Action; @@ -16,12 +13,9 @@ use Lattice\Ui\Enums\HttpMethod; use Lattice\Ui\Enums\Variant; -#[AsAction('teams.members.remove')] +#[AsAction('teams.members.remove', can: 'removeMember', on: 'team')] class RemoveMember extends ActionDefinition { - use ResolvesCurrentUser; - use ResolvesTeamFromContext; - public function definition(Action $action): Action { return $action @@ -35,18 +29,14 @@ public function definition(Action $action): Action ); } - #[\Override] - public function authorize(Request $request): bool - { - return $this->currentUser()->can('removeMember', $this->teamFromContext()); - } - - public function handle(Request $request): ActionResult + public function handle(): ActionResult { - $team = $this->teamFromContext(); - $member = User::findOrFail($this->contextInt('member')); + /** @var Team $team */ + $team = $this->contextModel('team'); + /** @var User $member */ + $member = $this->contextModel('member'); - abort_if($team->owner()?->is($member), 403, __('teams.members.owner-cannot-be-removed')); + abort_if($team->owner()?->is($member) === true, 403, __('teams.members.owner-cannot-be-removed')); $team->memberships()->where('user_id', $member->id)->delete(); diff --git a/app/Actions/Teams/SwitchTeam.php b/app/Actions/Teams/SwitchTeam.php index 6f1d59f..83461bf 100644 --- a/app/Actions/Teams/SwitchTeam.php +++ b/app/Actions/Teams/SwitchTeam.php @@ -4,33 +4,26 @@ namespace App\Actions\Teams; use App\Concerns\ResolvesCurrentUser; -use App\Concerns\ResolvesTeamFromContext; -use Illuminate\Http\Request; +use App\Models\Team; use Lattice\Actions\ActionDefinition; use Lattice\Actions\ActionResult; use Lattice\Actions\Components\Action; use Lattice\Core\Attributes\AsAction; -#[AsAction('teams.switch')] +#[AsAction('teams.switch', can: 'view', on: 'team')] class SwitchTeam extends ActionDefinition { use ResolvesCurrentUser; - use ResolvesTeamFromContext; public function definition(Action $action): Action { return $action->label(__('teams.switch.label')); } - #[\Override] - public function authorize(Request $request): bool + public function handle(): ActionResult { - return $this->currentUser()->can('view', $this->teamFromContext()); - } - - public function handle(Request $request): ActionResult - { - $team = $this->teamFromContext(); + /** @var Team $team */ + $team = $this->contextModel('team'); $this->currentUser()->switchTeam($team); diff --git a/app/Actions/Teams/UpdateMemberRole.php b/app/Actions/Teams/UpdateMemberRole.php index bcb144d..f36dd95 100644 --- a/app/Actions/Teams/UpdateMemberRole.php +++ b/app/Actions/Teams/UpdateMemberRole.php @@ -3,26 +3,22 @@ namespace App\Actions\Teams; -use App\Concerns\ResolvesCurrentUser; -use App\Concerns\ResolvesTeamFromContext; use App\Enums\TeamRole; +use App\Models\Team; use App\Models\User; -use Illuminate\Http\Request; use Illuminate\Validation\Rule; use Lattice\Actions\ActionDefinition; use Lattice\Actions\ActionResult; use Lattice\Actions\Components\Action; use Lattice\Core\Attributes\AsAction; use Lattice\Form\Components\Choice; +use Lattice\Form\FormData; use Lattice\Ui\Enums\HttpMethod; use Lattice\Ui\Enums\Variant; -#[AsAction('teams.members.update')] +#[AsAction('teams.members.update', can: 'updateMember', on: 'team')] class UpdateMemberRole extends ActionDefinition { - use ResolvesCurrentUser; - use ResolvesTeamFromContext; - public function definition(Action $action): Action { return $action @@ -37,22 +33,17 @@ public function definition(Action $action): Action ]); } - #[\Override] - public function authorize(Request $request): bool - { - return $this->currentUser()->can('updateMember', $this->teamFromContext()); - } - - public function handle(Request $request): ActionResult + public function handle(FormData $data): ActionResult { - $team = $this->teamFromContext(); - $validated = $this->validate($request); - $member = User::findOrFail($this->contextInt('member')); + /** @var Team $team */ + $team = $this->contextModel('team'); + /** @var User $member */ + $member = $this->contextModel('member'); $team->memberships() ->where('user_id', $member->id) ->firstOrFail() - ->update(['role' => TeamRole::from((string) $validated['role'])]); + ->update(['role' => $data->enum('role', TeamRole::class)]); return ActionResult::success() ->toast(__('teams.members.role-updated')) diff --git a/app/Concerns/ResolvesTeamFromContext.php b/app/Concerns/ResolvesTeamFromContext.php deleted file mode 100644 index 0dc5f72..0000000 --- a/app/Concerns/ResolvesTeamFromContext.php +++ /dev/null @@ -1,23 +0,0 @@ -contextModel('team', Team::class); - } - - protected function optionalTeamFromContext(): ?Team - { - return $this->contextModelOrNull('team', Team::class); - } -} diff --git a/app/Forms/Settings/ConfirmTwoFactorForm.php b/app/Forms/Settings/ConfirmTwoFactorForm.php index 238c627..c23e55b 100644 --- a/app/Forms/Settings/ConfirmTwoFactorForm.php +++ b/app/Forms/Settings/ConfirmTwoFactorForm.php @@ -11,6 +11,7 @@ use Lattice\Form\Attributes\AsForm; use Lattice\Form\Components\Form; use Lattice\Form\Components\OtpInput; +use Lattice\Form\FormData; use Lattice\Form\FormDefinition; use Lattice\Http\LatticeResponse; @@ -33,13 +34,13 @@ public function definition(Form $form, Request $request): Form ]); } - public function handle(Request $request): LatticeResponse + public function handle(FormData $data): LatticeResponse { $user = $this->currentUser(); abort_unless(Features::canManageTwoFactorAuthentication(), 403); - ($this->confirm)($user, (string) $request->input('code')); + ($this->confirm)($user, $data->string('code')->toString()); return Effects::respond()->toast(__('settings.two-factor.enabled-toast'))->back(); } diff --git a/app/Forms/Settings/DeleteAccountForm.php b/app/Forms/Settings/DeleteAccountForm.php index 80ab270..a6cc199 100644 --- a/app/Forms/Settings/DeleteAccountForm.php +++ b/app/Forms/Settings/DeleteAccountForm.php @@ -16,7 +16,7 @@ use Lattice\Ui\Components\Stack; use Lattice\Ui\Components\Text; use Lattice\Ui\Enums\HttpMethod; -use Lattice\Ui\Enums\StackDirection; +use Lattice\Ui\Enums\Orientation; use Lattice\Ui\Enums\Variant; #[AsForm('settings.delete-account')] @@ -37,7 +37,7 @@ public function definition(Form $form, Request $request): Form ->required() ->rules(['current_password']), Stack::make('delete-account-actions') - ->direction(StackDirection::Row) + ->direction(Orientation::Horizontal) ->schema([ Button::make(__('settings.delete-account.submit'))->submit()->variant(Variant::Danger), ]), @@ -50,8 +50,6 @@ public function handle(Request $request): RedirectResponse { $user = $this->currentUser(); - $this->validate($request); - Auth::logout(); $user->delete(); diff --git a/app/Forms/Settings/PasswordSettingsForm.php b/app/Forms/Settings/PasswordSettingsForm.php index 4e08ed6..a22ce44 100644 --- a/app/Forms/Settings/PasswordSettingsForm.php +++ b/app/Forms/Settings/PasswordSettingsForm.php @@ -10,6 +10,7 @@ use Lattice\Form\Attributes\AsForm; use Lattice\Form\Components\Form; use Lattice\Form\Components\PasswordInput; +use Lattice\Form\FormData; use Lattice\Form\FormDefinition; use Lattice\Http\LatticeResponse; use Lattice\Ui\Components\Button; @@ -48,14 +49,10 @@ public function definition(Form $form, Request $request): Form ->withoutSubmitButton(); } - public function handle(Request $request): LatticeResponse + public function handle(FormData $data): LatticeResponse { - $user = $this->currentUser(); - - $validated = $this->validate($request); - - $user->update([ - 'password' => $validated['password'], + $this->currentUser()->update([ + 'password' => $data->string('password')->toString(), ]); return Effects::respond()->toast(__('settings.password.updated'))->back(); diff --git a/app/Forms/Settings/ProfileSettingsForm.php b/app/Forms/Settings/ProfileSettingsForm.php index eb87771..d2d2282 100644 --- a/app/Forms/Settings/ProfileSettingsForm.php +++ b/app/Forms/Settings/ProfileSettingsForm.php @@ -13,6 +13,7 @@ use Lattice\Form\Attributes\AsForm; use Lattice\Form\Components\Form; use Lattice\Form\Components\TextInput; +use Lattice\Form\FormData; use Lattice\Form\FormDefinition; use Lattice\Http\LatticeResponse; use Lattice\Ui\Components\Button; @@ -22,7 +23,7 @@ use Lattice\Ui\Components\Text; use Lattice\Ui\Enums\Gap; use Lattice\Ui\Enums\HttpMethod; -use Lattice\Ui\Enums\StackDirection; +use Lattice\Ui\Enums\Orientation; #[AsForm('settings.profile')] class ProfileSettingsForm extends FormDefinition @@ -59,11 +60,11 @@ public function definition(Form $form, Request $request): Form ->withoutSubmitButton(); } - public function handle(Request $request): LatticeResponse + public function handle(FormData $data): LatticeResponse { $user = $this->currentUser(); - $user->fill($this->validate($request)); + $user->fill($data->all()); if ($user->isDirty('email')) { $user->email_verified_at = null; @@ -85,7 +86,7 @@ private function verificationNotice(User $user, Request $request): array $components = [ Stack::make('profile-verification-notice') - ->direction(StackDirection::Row) + ->direction(Orientation::Horizontal) ->gap(Gap::ExtraSmall) ->schema([ Text::make(__('settings.profile.unverified')), diff --git a/app/Forms/Teams/CreateTeamForm.php b/app/Forms/Teams/CreateTeamForm.php index 4cb64f1..706e3b1 100644 --- a/app/Forms/Teams/CreateTeamForm.php +++ b/app/Forms/Teams/CreateTeamForm.php @@ -10,6 +10,7 @@ use Lattice\Form\Attributes\AsForm; use Lattice\Form\Components\Form as FormComponent; use Lattice\Form\Components\TextInput; +use Lattice\Form\FormData; use Lattice\Form\FormDefinition; use Lattice\Http\LatticeResponse; use Lattice\Ui\Components\Button; @@ -41,11 +42,9 @@ public function definition(FormComponent $form, Request $request): FormComponent ->withoutSubmitButton(); } - public function handle(Request $request): LatticeResponse + public function handle(FormData $data): LatticeResponse { - $validated = $this->validate($request); - - $team = $this->createTeam->handle($this->currentUser(), (string) $validated['name']); + $team = $this->createTeam->handle($this->currentUser(), $data->string('name')->toString()); return Effects::respond()->toast(__('teams.create.created'))->toRoute('teams.edit', ['team' => $team->slug]); } diff --git a/app/Forms/Teams/DeleteTeamForm.php b/app/Forms/Teams/DeleteTeamForm.php index 4539693..87c69e0 100644 --- a/app/Forms/Teams/DeleteTeamForm.php +++ b/app/Forms/Teams/DeleteTeamForm.php @@ -5,11 +5,9 @@ use App\Actions\Teams\DeleteTeam; use App\Concerns\ResolvesCurrentUser; -use App\Concerns\ResolvesTeamFromContext; use App\Models\Team; use Closure; use Illuminate\Http\Request; -use Illuminate\Support\Facades\Gate; use Lattice\Facades\Effects; use Lattice\Form\Attributes\AsForm; use Lattice\Form\Components\Form as FormComponent; @@ -21,17 +19,16 @@ use Lattice\Ui\Enums\HttpMethod; use Lattice\Ui\Enums\Variant; -#[AsForm('teams.delete')] +#[AsForm('teams.delete', can: 'delete', on: 'team')] class DeleteTeamForm extends FormDefinition { use ResolvesCurrentUser; - use ResolvesTeamFromContext; public function __construct(private readonly DeleteTeam $deleteTeam) {} public function definition(FormComponent $form, Request $request): FormComponent { - $team = $request->route('team'); + $team = $this->contextModelOrNull('team'); return $form ->method(HttpMethod::Delete) @@ -42,7 +39,10 @@ public function definition(FormComponent $form, Request $request): FormComponent ->required() ->rules(['string']) ->rules(fn (): array => [function (string $attribute, mixed $value, Closure $fail): void { - if ((string) $value !== $this->teamFromContext()->name) { + /** @var Team $team */ + $team = $this->contextModel('team'); + + if ((string) $value !== $team->name) { $fail(__('teams.delete.name-mismatch')); } }]), @@ -51,11 +51,10 @@ public function definition(FormComponent $form, Request $request): FormComponent ->withoutSubmitButton(); } - public function handle(Request $request): LatticeResponse + public function handle(): LatticeResponse { - $team = $this->teamFromContext(); - - Gate::authorize('delete', $team); + /** @var Team $team */ + $team = $this->contextModel('team'); $this->deleteTeam->handle($this->currentUser(), $team); diff --git a/app/Forms/Teams/InviteTeamMemberForm.php b/app/Forms/Teams/InviteTeamMemberForm.php index 4b190d9..aaef2cd 100644 --- a/app/Forms/Teams/InviteTeamMemberForm.php +++ b/app/Forms/Teams/InviteTeamMemberForm.php @@ -4,29 +4,28 @@ namespace App\Forms\Teams; use App\Concerns\ResolvesCurrentUser; -use App\Concerns\ResolvesTeamFromContext; use App\Enums\TeamRole; +use App\Models\Team; use App\Notifications\Teams\TeamInvitation; use Closure; use Illuminate\Http\Request; -use Illuminate\Support\Facades\Gate; use Illuminate\Support\Facades\Notification; use Lattice\Facades\Effects; use Lattice\Form\Attributes\AsForm; use Lattice\Form\Components\Choice; use Lattice\Form\Components\Form as FormComponent; use Lattice\Form\Components\TextInput; +use Lattice\Form\FormData; use Lattice\Form\FormDefinition; use Lattice\Http\LatticeResponse; use Lattice\Ui\Components\Button; use Lattice\Ui\Components\Grid; use Lattice\Ui\Enums\HttpMethod; -#[AsForm('teams.invite')] +#[AsForm('teams.invite', can: 'inviteMember', on: 'team')] class InviteTeamMemberForm extends FormDefinition { use ResolvesCurrentUser; - use ResolvesTeamFromContext; public function definition(FormComponent $form, Request $request): FormComponent { @@ -43,7 +42,10 @@ public function definition(FormComponent $form, Request $request): FormComponent ->required() ->rules(['string', 'max:255']) ->rules(fn (): array => [function (string $attribute, mixed $value, Closure $fail): void { - if ($this->teamFromContext()->hasMemberOrPendingInvitation((string) $value)) { + /** @var Team $team */ + $team = $this->contextModel('team'); + + if ($team->hasMemberOrPendingInvitation((string) $value)) { $fail(__('teams.invite.already-member')); } }]), @@ -57,17 +59,14 @@ public function definition(FormComponent $form, Request $request): FormComponent ->withoutSubmitButton(); } - public function handle(Request $request): LatticeResponse + public function handle(FormData $data): LatticeResponse { - $team = $this->teamFromContext(); - - Gate::authorize('inviteMember', $team); - - $validated = $this->validate($request); + /** @var Team $team */ + $team = $this->contextModel('team'); $invitation = $team->invitations()->create([ - 'email' => (string) $validated['email'], - 'role' => TeamRole::from((string) $validated['role']), + 'email' => $data->string('email')->toString(), + 'role' => $data->enum('role', TeamRole::class), 'invited_by' => $this->currentUser()->id, 'expires_at' => now()->addDays(3), ]); diff --git a/app/Forms/Teams/UpdateTeamForm.php b/app/Forms/Teams/UpdateTeamForm.php index e2fb10a..fbe0888 100644 --- a/app/Forms/Teams/UpdateTeamForm.php +++ b/app/Forms/Teams/UpdateTeamForm.php @@ -3,29 +3,26 @@ namespace App\Forms\Teams; -use App\Concerns\ResolvesTeamFromContext; use App\Models\Team; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; -use Illuminate\Support\Facades\Gate; use Lattice\Facades\Effects; use Lattice\Form\Attributes\AsForm; use Lattice\Form\Components\Form as FormComponent; use Lattice\Form\Components\TextInput; +use Lattice\Form\FormData; use Lattice\Form\FormDefinition; use Lattice\Http\LatticeResponse; use Lattice\Ui\Components\Button; use Lattice\Ui\Components\Grid; use Lattice\Ui\Enums\HttpMethod; -#[AsForm('teams.update')] +#[AsForm('teams.update', can: 'update', on: 'team')] class UpdateTeamForm extends FormDefinition { - use ResolvesTeamFromContext; - public function definition(FormComponent $form, Request $request): FormComponent { - $team = $request->route('team'); + $team = $this->contextModelOrNull('team'); return $form ->method(HttpMethod::Patch) @@ -39,25 +36,22 @@ public function definition(FormComponent $form, Request $request): FormComponent ->required() ->rules(['string', 'max:255']), ]), - Button::make(__('teams.update.submit'))->submit(), + Button::make(__('common.action.save'))->submit(), ]) ->withoutSubmitButton(); } - public function handle(Request $request): LatticeResponse + public function handle(FormData $data): LatticeResponse { - $validated = $this->validate($request); - - $team = $this->teamFromContext(); - - Gate::authorize('update', $team); + /** @var Team $team */ + $team = $this->contextModel('team'); - $team = DB::transaction(function () use ($team, $validated): Team { - $team = Team::whereKey($team->id)->lockForUpdate()->firstOrFail(); + $team = DB::transaction(function () use ($team, $data): Team { + $locked = Team::whereKey($team->id)->lockForUpdate()->firstOrFail(); - $team->update(['name' => (string) $validated['name']]); + $locked->update(['name' => $data->string('name')->toString()]); - return $team; + return $locked; }); return Effects::respond()->toast(__('teams.update.updated'))->toRoute('teams.edit', ['team' => $team->slug]); diff --git a/app/Http/Middleware/SetTeamUrlDefaults.php b/app/Http/Middleware/SetTeamUrlDefaults.php index 655de0c..8e17dec 100644 --- a/app/Http/Middleware/SetTeamUrlDefaults.php +++ b/app/Http/Middleware/SetTeamUrlDefaults.php @@ -16,10 +16,7 @@ class SetTeamUrlDefaults public function handle(Request $request, Closure $next): Response { if ($currentTeam = $request->user()?->currentTeam) { - URL::defaults([ - 'current_team' => $currentTeam->slug, - 'team' => $currentTeam->slug, - ]); + URL::defaults(['current_team' => $currentTeam->slug]); } return $next($request); diff --git a/app/Http/Requests/Teams/AcceptTeamInvitationRequest.php b/app/Http/Requests/Teams/AcceptTeamInvitationRequest.php index cbbc12d..8ac27d6 100644 --- a/app/Http/Requests/Teams/AcceptTeamInvitationRequest.php +++ b/app/Http/Requests/Teams/AcceptTeamInvitationRequest.php @@ -31,6 +31,9 @@ public function rules(): array ]; } + /** + * @return array + */ public function validationData(): array { return array_merge(parent::validationData(), [ diff --git a/app/Layouts/AppLayout.php b/app/Layouts/AppLayout.php index a89b96f..a30e78d 100644 --- a/app/Layouts/AppLayout.php +++ b/app/Layouts/AppLayout.php @@ -10,29 +10,30 @@ use App\Pages\DashboardPage; use App\Pages\SettingsPage; use Illuminate\Http\Request; -use Illuminate\Support\Str; use Lattice\Core\Attributes\AsLayout; use Lattice\Core\Enums\ColorName; use Lattice\Core\Support\Affix; -use Lattice\Layouts\Components\Dropdown; -use Lattice\Layouts\Components\Menu; -use Lattice\Layouts\Components\MenuItem; use Lattice\Layouts\Components\Outlet; -use Lattice\Layouts\Components\Sidebar; use Lattice\Layouts\LayoutDefinition; +use Lattice\Ui\Components\Avatar; +use Lattice\Ui\Components\Component; +use Lattice\Ui\Components\Dropdown; use Lattice\Ui\Components\Icon as IconComponent; -use Lattice\Ui\Components\RawBlock; +use Lattice\Ui\Components\Menu; +use Lattice\Ui\Components\MenuItem; +use Lattice\Ui\Components\Sidebar; use Lattice\Ui\Components\Stack; use Lattice\Ui\Components\Text; use Lattice\Ui\Enums\Align; +use Lattice\Ui\Enums\AvatarShape; use Lattice\Ui\Enums\Gap; use Lattice\Ui\Enums\Height; use Lattice\Ui\Enums\HttpMethod; use Lattice\Ui\Enums\Icon; use Lattice\Ui\Enums\Justify; +use Lattice\Ui\Enums\Orientation; use Lattice\Ui\Enums\Placement; use Lattice\Ui\Enums\Size; -use Lattice\Ui\Enums\StackDirection; use Lattice\Ui\Enums\Width; use Lattice\Ui\PageSchema; @@ -47,7 +48,7 @@ public function schema(PageSchema $schema, Request $request): PageSchema return $schema->schema([ Stack::make('app-shell') - ->direction(StackDirection::Row) + ->direction(Orientation::Horizontal) ->height(Height::Screen) ->schema([ Sidebar::make('app-sidebar')->collapsible()->items([ @@ -102,11 +103,11 @@ private function userMenu(User $user): Dropdown ->placement(Placement::Top) ->trigger([ Stack::make() - ->direction(StackDirection::Row) + ->direction(Orientation::Horizontal) ->align(Align::Center) ->gap(Gap::Medium) ->schema([ - RawBlock::make('user-menu-avatar')->html($this->avatarSvg($user)), + Avatar::make(key: 'user-menu-avatar')->name($user->name)->shape(AvatarShape::Rounded), Stack::make() ->width(Width::Fill) ->gap(Gap::None) @@ -151,11 +152,14 @@ private function languageMenuItems(): array }, $locales); } + /** + * @return array + */ private function dropdownTrigger(string $icon, string $label): array { return [ Stack::make() - ->direction(StackDirection::Row) + ->direction(Orientation::Horizontal) ->align(Align::Center) ->gap(Gap::Small) ->schema([ @@ -167,29 +171,4 @@ private function dropdownTrigger(string $icon, string $label): array ]), ]; } - - private function avatarSvg(User $user): string - { - $name = $user->name; - $initials = e($this->initials($name)); - $label = e($name); - - return << - - {$initials} - -HTML; - } - - private function initials(string $name): string - { - return Str::of($name) - ->trim() - ->explode(' ') - ->filter() - ->take(2) - ->map(fn (string $part): string => Str::of($part)->substr(0, 1)->upper()->toString()) - ->implode(''); - } } diff --git a/app/Models/Membership.php b/app/Models/Membership.php index 003f194..dc0b7c9 100644 --- a/app/Models/Membership.php +++ b/app/Models/Membership.php @@ -6,6 +6,7 @@ use App\Enums\TeamRole; use Carbon\CarbonImmutable; use Illuminate\Database\Eloquent\Attributes\Fillable; +use Illuminate\Database\Eloquent\Attributes\Table; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\Pivot; @@ -32,10 +33,9 @@ * @mixin \Eloquent */ #[Fillable(['team_id', 'user_id', 'role'])] +#[Table(name: 'team_members')] class Membership extends Pivot { - protected $table = 'team_members'; - public $incrementing = true; /** diff --git a/app/Models/Team.php b/app/Models/Team.php index 6db5f15..c772e02 100644 --- a/app/Models/Team.php +++ b/app/Models/Team.php @@ -7,6 +7,7 @@ use Carbon\CarbonImmutable; use Database\Factories\TeamFactory; use Illuminate\Database\Eloquent\Attributes\Fillable; +use Illuminate\Database\Eloquent\Attributes\RouteKey; use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; @@ -25,7 +26,7 @@ * @property CarbonImmutable|null $deleted_at * @property-read Collection $invitations * @property-read int|null $invitations_count - * @property-read Membership|null $pivot + * @property-read Membership $pivot * @property-read Collection $members * @property-read int|null $members_count * @property-read Collection $memberships @@ -49,6 +50,7 @@ * @mixin \Eloquent */ #[Fillable(['name', 'slug', 'is_personal'])] +#[RouteKey('slug')] class Team extends Model { /** @use HasFactory */ @@ -71,7 +73,7 @@ protected static function boot(): void }); } - public function owner(): ?Model + public function owner(): ?User { return $this->members() ->wherePivot('role', TeamRole::Owner->value) @@ -130,11 +132,6 @@ protected function casts(): array ]; } - public function getRouteKeyName(): string - { - return 'slug'; - } - protected static function generateUniqueTeamSlug(string $name, ?int $excludeId = null): string { $defaultSlug = Str::slug($name); diff --git a/app/Models/TeamInvitation.php b/app/Models/TeamInvitation.php index cd51a0c..104e444 100644 --- a/app/Models/TeamInvitation.php +++ b/app/Models/TeamInvitation.php @@ -8,6 +8,7 @@ use Carbon\CarbonImmutable; use Database\Factories\TeamInvitationFactory; use Illuminate\Database\Eloquent\Attributes\Fillable; +use Illuminate\Database\Eloquent\Attributes\RouteKey; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -25,7 +26,7 @@ * @property CarbonImmutable|null $created_at * @property CarbonImmutable|null $updated_at * @property-read User $inviter - * @property-read Team|null $team + * @property-read Team $team * * @method static \Database\Factories\TeamInvitationFactory factory($count = null, $state = []) * @method static \Illuminate\Database\Eloquent\Builder|TeamInvitation newModelQuery() @@ -45,6 +46,7 @@ * @mixin \Eloquent */ #[Fillable(['team_id', 'email', 'role', 'invited_by', 'expires_at', 'accepted_at'])] +#[RouteKey('code')] class TeamInvitation extends Model { /** @use HasFactory */ @@ -111,9 +113,4 @@ protected function casts(): array 'accepted_at' => 'datetime', ]; } - - public function getRouteKeyName(): string - { - return 'code'; - } } diff --git a/app/Models/User.php b/app/Models/User.php index 9654918..1619c6a 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -49,7 +49,7 @@ * @property-read int|null $owned_teams_count * @property-read Collection $passkeys * @property-read int|null $passkeys_count - * @property-read Membership|null $pivot + * @property-read Membership $pivot * @property-read Collection $teamMemberships * @property-read int|null $team_memberships_count * @property-read Collection $teams @@ -168,10 +168,13 @@ public function teamRole(Team $team): ?TeamRole public function fallbackTeam(?Team $excluding = null): ?Team { - return $this->teams() - ->when($excluding, fn ($query) => $query->where('teams.id', '!=', $excluding->id)) - ->orderByRaw('LOWER(teams.name)') - ->first(); + $teams = $this->teams()->orderByRaw('LOWER(teams.name)'); + + if ($excluding instanceof Team) { + $teams->where('teams.id', '!=', $excluding->id); + } + + return $teams->first(); } public function hasTeamPermission(Team $team, TeamPermission $permission): bool diff --git a/app/Pages/Auth/ConfirmPasswordPage.php b/app/Pages/Auth/ConfirmPasswordPage.php index fe894a0..c1b9649 100644 --- a/app/Pages/Auth/ConfirmPasswordPage.php +++ b/app/Pages/Auth/ConfirmPasswordPage.php @@ -15,9 +15,9 @@ use Lattice\Ui\Components\Heading; use Lattice\Ui\Components\Stack; use Lattice\Ui\Components\Text; -use Lattice\Ui\Enums\Align; use Lattice\Ui\Enums\Gap; use Lattice\Ui\Enums\HttpMethod; +use Lattice\Ui\Enums\TextAlign; use Lattice\Ui\PageSchema; #[AsPage(layout: PageLayout::Auth)] @@ -36,7 +36,7 @@ public function render(PageSchema $schema): PageSchema ->schema([ Heading::make(__('auth.confirm-password.heading'), 2), Text::make(__('auth.confirm-password.subtitle')) - ->align(Align::Center), + ->align(TextAlign::Center), ]), PasskeyVerify::make( route('passkey.confirm-options', absolute: false), diff --git a/app/Pages/Auth/ForgotPasswordPage.php b/app/Pages/Auth/ForgotPasswordPage.php index f9d900c..c10238f 100644 --- a/app/Pages/Auth/ForgotPasswordPage.php +++ b/app/Pages/Auth/ForgotPasswordPage.php @@ -20,7 +20,8 @@ use Lattice\Ui\Enums\Align; use Lattice\Ui\Enums\Gap; use Lattice\Ui\Enums\HttpMethod; -use Lattice\Ui\Enums\StackDirection; +use Lattice\Ui\Enums\Orientation; +use Lattice\Ui\Enums\TextAlign; use Lattice\Ui\PageSchema; #[AsPage(layout: PageLayout::Auth)] @@ -41,7 +42,7 @@ public function render(PageSchema $schema, Request $request): PageSchema ->schema([ Heading::make(__('auth.forgot-password.heading'), 2), Text::make(__('auth.forgot-password.subtitle')) - ->align(Align::Center), + ->align(TextAlign::Center), ]), Form::make('forgot-password-form') ->action(route('password.email', absolute: false)) @@ -72,7 +73,7 @@ private function formSchema(): array Button::make(__('auth.forgot-password.submit'))->submit(), Stack::make('forgot-password-login-prompt') ->align(Align::Center) - ->direction(StackDirection::Row) + ->direction(Orientation::Horizontal) ->gap(Gap::ExtraSmall) ->schema([ Text::make(__('auth.forgot-password.return')), diff --git a/app/Pages/Auth/LoginPage.php b/app/Pages/Auth/LoginPage.php index 0e5a84b..4453c5a 100644 --- a/app/Pages/Auth/LoginPage.php +++ b/app/Pages/Auth/LoginPage.php @@ -24,7 +24,8 @@ use Lattice\Ui\Enums\Align; use Lattice\Ui\Enums\Gap; use Lattice\Ui\Enums\HttpMethod; -use Lattice\Ui\Enums\StackDirection; +use Lattice\Ui\Enums\Orientation; +use Lattice\Ui\Enums\TextAlign; use Lattice\Ui\PageSchema; #[AsPage(layout: PageLayout::Auth)] @@ -47,7 +48,7 @@ public function render(PageSchema $schema, Request $request): PageSchema ->schema([ Heading::make(__('auth.login.heading'), 2), Text::make(__('auth.login.subtitle')) - ->align(Align::Center), + ->align(TextAlign::Center), ]), PasskeyVerify::make( route('passkey.login-options', absolute: false), @@ -84,7 +85,7 @@ private function formSchema(bool $canResetPassword): array Button::make(__('common.action.log-in'))->submit(), Stack::make('login-register-prompt') ->align(Align::Center) - ->direction(StackDirection::Row) + ->direction(Orientation::Horizontal) ->gap(Gap::ExtraSmall) ->schema([ Text::make(__('auth.login.no-account')), diff --git a/app/Pages/Auth/RegisterPage.php b/app/Pages/Auth/RegisterPage.php index f86d975..54db0fc 100644 --- a/app/Pages/Auth/RegisterPage.php +++ b/app/Pages/Auth/RegisterPage.php @@ -19,7 +19,8 @@ use Lattice\Ui\Enums\Align; use Lattice\Ui\Enums\Gap; use Lattice\Ui\Enums\HttpMethod; -use Lattice\Ui\Enums\StackDirection; +use Lattice\Ui\Enums\Orientation; +use Lattice\Ui\Enums\TextAlign; use Lattice\Ui\PageSchema; #[AsPage(layout: PageLayout::Auth)] @@ -38,7 +39,7 @@ public function render(PageSchema $schema): PageSchema ->schema([ Heading::make(__('auth.register.heading'), 2), Text::make(__('auth.register.subtitle')) - ->align(Align::Center), + ->align(TextAlign::Center), ]), Form::make('register-form') ->action(route('register.store', absolute: false)) @@ -77,7 +78,7 @@ private function formSchema(): array Button::make(__('auth.register.submit'))->submit(), Stack::make('register-login-prompt') ->align(Align::Center) - ->direction(StackDirection::Row) + ->direction(Orientation::Horizontal) ->gap(Gap::ExtraSmall) ->schema([ Text::make(__('auth.register.have-account')), diff --git a/app/Pages/Auth/ResetPasswordPage.php b/app/Pages/Auth/ResetPasswordPage.php index dcddf30..329cdb2 100644 --- a/app/Pages/Auth/ResetPasswordPage.php +++ b/app/Pages/Auth/ResetPasswordPage.php @@ -17,9 +17,9 @@ use Lattice\Ui\Components\Heading; use Lattice\Ui\Components\Stack; use Lattice\Ui\Components\Text; -use Lattice\Ui\Enums\Align; use Lattice\Ui\Enums\Gap; use Lattice\Ui\Enums\HttpMethod; +use Lattice\Ui\Enums\TextAlign; use Lattice\Ui\PageSchema; #[AsPage(layout: PageLayout::Auth)] @@ -40,7 +40,7 @@ public function render(PageSchema $schema, Request $request): PageSchema ->gap(Gap::Small) ->schema([ Heading::make(__('auth.reset-password.heading'), 2), - Text::make(__('auth.reset-password.subtitle'))->align(Align::Center), + Text::make(__('auth.reset-password.subtitle'))->align(TextAlign::Center), ]), Form::make('reset-password-form') ->action(route('password.update', absolute: false)) diff --git a/app/Pages/Auth/TwoFactorChallengePage.php b/app/Pages/Auth/TwoFactorChallengePage.php index f36b3ef..2e8ccbb 100644 --- a/app/Pages/Auth/TwoFactorChallengePage.php +++ b/app/Pages/Auth/TwoFactorChallengePage.php @@ -13,8 +13,8 @@ use Lattice\Ui\Components\Heading; use Lattice\Ui\Components\Stack; use Lattice\Ui\Components\Text; -use Lattice\Ui\Enums\Align; use Lattice\Ui\Enums\Gap; +use Lattice\Ui\Enums\TextAlign; use Lattice\Ui\PageSchema; #[AsPage(layout: PageLayout::Auth)] @@ -33,7 +33,7 @@ public function render(PageSchema $schema): PageSchema ->schema([ Heading::make(__('auth.two-factor.heading'), 2), Text::make(__('auth.two-factor.subtitle')) - ->align(Align::Center), + ->align(TextAlign::Center), ]), Form::make('two-factor-challenge') ->action(route('two-factor.login.store', absolute: false)) diff --git a/app/Pages/Auth/VerifyEmailPage.php b/app/Pages/Auth/VerifyEmailPage.php index 57ac896..55f3c53 100644 --- a/app/Pages/Auth/VerifyEmailPage.php +++ b/app/Pages/Auth/VerifyEmailPage.php @@ -14,9 +14,9 @@ use Lattice\Ui\Components\Link; use Lattice\Ui\Components\Stack; use Lattice\Ui\Components\Text; -use Lattice\Ui\Enums\Align; use Lattice\Ui\Enums\Gap; use Lattice\Ui\Enums\HttpMethod; +use Lattice\Ui\Enums\TextAlign; use Lattice\Ui\PageSchema; #[AsPage(layout: PageLayout::Auth)] @@ -37,7 +37,7 @@ public function render(PageSchema $schema, Request $request): PageSchema ->schema([ Heading::make(__('auth.verify-email.heading'), 2), Text::make(__('auth.verify-email.subtitle')) - ->align(Align::Center), + ->align(TextAlign::Center), ]), Form::make('verify-email-form') ->action(route('verification.send', absolute: false)) diff --git a/app/Pages/DashboardPage.php b/app/Pages/DashboardPage.php index 58af0fa..e4adc8e 100644 --- a/app/Pages/DashboardPage.php +++ b/app/Pages/DashboardPage.php @@ -21,7 +21,7 @@ use Lattice\Ui\Enums\Width; use Lattice\Ui\PageSchema; -#[AsPage(route: '{current_team}/dashboard', name: 'dashboard', layout: PageLayout::App, middleware: ['web', 'auth', 'verified', 'can:view,current_team', SwitchesCurrentTeam::class])] +#[AsPage(route: '{current_team}/dashboard', name: 'dashboard', layout: PageLayout::App, middleware: ['auth', 'verified', SwitchesCurrentTeam::class], can: 'view', on: 'current_team')] class DashboardPage extends Page { use ListensForUserNotifications; diff --git a/app/Pages/SettingsPage.php b/app/Pages/SettingsPage.php index 4604c26..0038170 100644 --- a/app/Pages/SettingsPage.php +++ b/app/Pages/SettingsPage.php @@ -33,7 +33,7 @@ use Lattice\Ui\Enums\Width; use Lattice\Ui\PageSchema; -#[AsPage(route: 'settings', name: 'settings.edit', layout: PageLayout::App, middleware: ['web', 'auth'])] +#[AsPage(route: 'settings', name: 'settings.edit', layout: PageLayout::App, middleware: ['auth'])] class SettingsPage extends Page { use ListensForUserNotifications; diff --git a/app/Pages/Teams/TeamPage.php b/app/Pages/Teams/TeamPage.php index 5ace04d..91f6e1f 100644 --- a/app/Pages/Teams/TeamPage.php +++ b/app/Pages/Teams/TeamPage.php @@ -3,7 +3,6 @@ namespace App\Pages\Teams; -use App\Concerns\ResolvesCurrentUser; use App\Forms\Teams\DeleteTeamForm; use App\Forms\Teams\InviteTeamMemberForm; use App\Forms\Teams\UpdateTeamForm; @@ -24,11 +23,10 @@ use Lattice\Ui\Enums\Width; use Lattice\Ui\PageSchema; -#[AsPage(route: 'settings/teams/{team}', name: 'teams.edit', layout: PageLayout::App, middleware: ['web', 'auth', 'verified', 'can:view,team'])] +#[AsPage(route: 'settings/teams/{team}', name: 'teams.edit', layout: PageLayout::App, middleware: ['auth', 'verified'], can: 'view', on: 'team')] class TeamPage extends Page { use ListensForUserNotifications; - use ResolvesCurrentUser; private ?Team $team = null; @@ -39,8 +37,6 @@ public function title(): ?string public function render(PageSchema $schema, Request $request, Team $team): PageSchema { - $user = $this->currentUser(); - $this->team = $team; return $schema->schema([ @@ -48,47 +44,29 @@ public function render(PageSchema $schema, Request $request, Team $team): PageSc ->gap(Gap::Large) ->width(Width::Medium) ->schema([ - Stack::make('team-heading') - ->gap(Gap::Small) - ->schema([ - Heading::make($team->name, 1), - Text::make(__('teams.show.subtitle')), - ]), - Stack::make('team-details-heading') - ->gap(Gap::Small) - ->schema([ - Heading::make(__('teams.show.details-heading'), 2), - Text::make(__('teams.show.details-subtitle')), - ]) - ->visible($user->can('update', $team)), - Form::use(UpdateTeamForm::class, ['team' => $team->slug]) - ->visible($user->can('update', $team)), - Stack::make('team-invite-heading') - ->gap(Gap::Small) - ->schema([ - Heading::make(__('teams.show.invite-heading'), 2), - Text::make(__('teams.show.invite-subtitle')), - ]) - ->visible($user->can('inviteMember', $team)), - Form::use(InviteTeamMemberForm::class, ['team' => $team->slug]) - ->visible($user->can('inviteMember', $team)), - Stack::make('team-members-heading') - ->gap(Gap::Small) - ->schema([ - Heading::make(__('teams.show.members-heading'), 2), - Text::make(__('teams.show.members-subtitle')), - ]), - Table::lazy(TeamMembersTable::class, ['team' => $team->slug]), - Stack::make('team-invitations-heading') - ->gap(Gap::Small) - ->schema([ - Heading::make(__('teams.show.invitations-heading'), 2), - Text::make(__('teams.show.invitations-subtitle')), - ]), - Table::lazy(TeamInvitationsTable::class, ['team' => $team->slug]), - Form::use(DeleteTeamForm::class, ['team' => $team->slug]) - ->visible($user->can('delete', $team)), + $this->section('team-heading', $team->name, __('teams.show.subtitle'), 1), + $this->section('team-details-heading', __('teams.show.details-heading'), __('teams.show.details-subtitle')) + ->can('update', on: 'team'), + Form::use(UpdateTeamForm::class), + $this->section('team-invite-heading', __('teams.show.invite-heading'), __('teams.show.invite-subtitle')) + ->can('inviteMember', on: 'team'), + Form::use(InviteTeamMemberForm::class), + $this->section('team-members-heading', __('teams.show.members-heading'), __('teams.show.members-subtitle')), + Table::lazy(TeamMembersTable::class), + $this->section('team-invitations-heading', __('teams.show.invitations-heading'), __('teams.show.invitations-subtitle')), + Table::lazy(TeamInvitationsTable::class), + Form::use(DeleteTeamForm::class), ]), ]); } + + private function section(string $key, string $heading, string $subtitle, int $level = 2): Stack + { + return Stack::make($key) + ->gap(Gap::Small) + ->schema([ + Heading::make($heading, $level), + Text::make($subtitle), + ]); + } } diff --git a/app/Pages/Teams/TeamsPage.php b/app/Pages/Teams/TeamsPage.php index 3480131..0c92373 100644 --- a/app/Pages/Teams/TeamsPage.php +++ b/app/Pages/Teams/TeamsPage.php @@ -19,7 +19,7 @@ use Lattice\Ui\Enums\Width; use Lattice\Ui\PageSchema; -#[AsPage(route: 'settings/teams', name: 'teams.index', layout: PageLayout::App, middleware: ['web', 'auth', 'verified'])] +#[AsPage(route: 'settings/teams', name: 'teams.index', layout: PageLayout::App, middleware: ['auth', 'verified'])] class TeamsPage extends Page { use ListensForUserNotifications; diff --git a/app/Pages/WelcomePage.php b/app/Pages/WelcomePage.php index b0c4749..aaa7133 100644 --- a/app/Pages/WelcomePage.php +++ b/app/Pages/WelcomePage.php @@ -20,7 +20,7 @@ use Lattice\Ui\PageSchema; use Throwable; -#[AsPage(route: '/', name: 'home', middleware: ['web'])] +#[AsPage(route: '/', name: 'home')] final class WelcomePage extends Page { private ?Authenticatable $user = null; diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 5deadea..c338685 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -3,17 +3,25 @@ namespace App\Providers; +use App\Models\Team; +use App\Models\TeamInvitation; +use App\Models\User; use Carbon\CarbonImmutable; +use Illuminate\Http\Request; use Illuminate\Support\Facades\Date; use Illuminate\Support\Facades\DB; use Illuminate\Support\ServiceProvider; use Illuminate\Validation\Rules\Password; +use Laravel\Passkeys\Passkey; +use Lattice\Core\Facades\Lattice; +use Lattice\Core\Services\ContextResolutions; class AppServiceProvider extends ServiceProvider { public function boot(): void { $this->configureDefaults(); + $this->registerLatticeContext(); } protected function configureDefaults(): void @@ -34,4 +42,40 @@ protected function configureDefaults(): void : null, ); } + + /** + * Every Lattice definition reads its records through these keys instead of + * route parameters, so a signed endpoint reached long after the page + * request resolves them the same way the page did. The dependent keys + * resolve inside their team, which is what keeps a forged member or + * invitation id from reaching another team's records. + */ + protected function registerLatticeContext(): void + { + Lattice::context('team', Team::class, by: 'slug'); + + Lattice::context('member', function (string|int $value, array $context, ContextResolutions $resolutions): User { + $team = $resolutions->resolve('team', $context['team'] ?? null, $context); + + abort_unless($team instanceof Team, 404); + + return $team->members()->findOrFail($value); + }, keyBy: fn (User $member): int => $member->id); + + Lattice::context('invitation', function (string $value, array $context, ContextResolutions $resolutions): TeamInvitation { + $team = $resolutions->resolve('team', $context['team'] ?? null, $context); + + abort_unless($team instanceof Team, 404); + + return $team->invitations()->where('code', $value)->firstOrFail(); + }, keyBy: fn (TeamInvitation $invitation): string => $invitation->code); + + Lattice::context('passkey', function (string|int $value, Request $request): Passkey { + $user = $request->user(); + + abort_unless($user instanceof User, 403); + + return $user->passkeys()->findOrFail($value); + }, keyBy: fn (Passkey $passkey): int => $passkey->id); + } } diff --git a/app/Providers/FortifyServiceProvider.php b/app/Providers/FortifyServiceProvider.php index b454ad9..5499915 100644 --- a/app/Providers/FortifyServiceProvider.php +++ b/app/Providers/FortifyServiceProvider.php @@ -50,9 +50,7 @@ private function configureViews(): void private function configureRateLimiting(): void { - RateLimiter::for('two-factor', function (Request $request) { - return Limit::perMinute(5)->by($request->session()->get('login.id')); - }); + RateLimiter::for('two-factor', fn (Request $request) => Limit::perMinute(5)->by($request->session()->get('login.id'))); RateLimiter::for('login', function (Request $request) { $throttleKey = Str::transliterate(Str::lower($request->input(Fortify::username())).'|'.$request->ip()); diff --git a/app/Tables/Settings/PasskeysTable.php b/app/Tables/Settings/PasskeysTable.php index 148415c..cc493d1 100644 --- a/app/Tables/Settings/PasskeysTable.php +++ b/app/Tables/Settings/PasskeysTable.php @@ -74,7 +74,7 @@ public function source(): TableSource 'id' => $passkey->id, 'name' => $passkey->name, 'authenticator' => $passkey->authenticator ?? '', - 'created_at_diff' => __('settings.passkeys.added', ['time' => $passkey->created_at->diffForHumans()]), + 'created_at_diff' => __('settings.passkeys.added', ['time' => $passkey->created_at?->diffForHumans() ?? '']), 'last_used_at_diff' => $passkey->last_used_at === null ? __('settings.passkeys.never-used') : __('settings.passkeys.last-used-at', ['time' => $passkey->last_used_at->diffForHumans()]), diff --git a/app/Tables/Teams/TeamInvitationsTable.php b/app/Tables/Teams/TeamInvitationsTable.php index 87cce89..79b5b3e 100644 --- a/app/Tables/Teams/TeamInvitationsTable.php +++ b/app/Tables/Teams/TeamInvitationsTable.php @@ -4,7 +4,6 @@ namespace App\Tables\Teams; use App\Actions\Teams\CancelInvitation; -use App\Concerns\ResolvesTeamFromContext; use App\Models\Team; use App\Models\TeamInvitation; use App\Models\User; @@ -23,11 +22,9 @@ use Lattice\Ui\Components\Text; use Lattice\Ui\Enums\Size; -#[AsTable('teams.invitations')] +#[AsTable('teams.invitations', can: 'view', on: 'team')] class TeamInvitationsTable extends TableDefinition { - use ResolvesTeamFromContext; - public function layout(): string { return 'grid'; @@ -53,10 +50,11 @@ public function columns(): array public function actions(array $row): array { - $team = $this->optionalTeamFromContext(); + /** @var Team $team */ + $team = $this->contextModel('team'); $user = auth()->user(); - if (! $team instanceof Team || ! $user instanceof User || ! $user->can('cancelInvitation', $team)) { + if (! $user instanceof User || ! $user->can('cancelInvitation', $team)) { return []; } @@ -64,7 +62,7 @@ public function actions(array $row): array ActionGroup::make("teams.invitations.{$row['id']}.actions") ->label(__('teams.invitations.actions-label')) ->actions([ - Action::use(CancelInvitation::class, ['team' => $team->slug, 'invitation' => $row['code']]), + Action::use(CancelInvitation::class, ['invitation' => $row['code']]), ]), ]; } @@ -72,10 +70,9 @@ public function actions(array $row): array public function source(): TableSource { return new CallbackTableSource(function (TableQuery $query): TableResult { - $team = $this->optionalTeamFromContext(); - $user = auth()->user(); + $team = $this->contextModelOrNull('team'); - if (! $team instanceof Team || ! $user instanceof User || ! $user->belongsToTeam($team)) { + if (! $team instanceof Team) { return TableResult::fromItems([]); } diff --git a/app/Tables/Teams/TeamMembersTable.php b/app/Tables/Teams/TeamMembersTable.php index b4c76fc..d5880f1 100644 --- a/app/Tables/Teams/TeamMembersTable.php +++ b/app/Tables/Teams/TeamMembersTable.php @@ -5,7 +5,6 @@ use App\Actions\Teams\RemoveMember; use App\Actions\Teams\UpdateMemberRole; -use App\Concerns\ResolvesTeamFromContext; use App\Enums\TeamRole; use App\Models\Team; use App\Models\User; @@ -24,11 +23,9 @@ use Lattice\Ui\Components\Text; use Lattice\Ui\Enums\Size; -#[AsTable('teams.members')] +#[AsTable('teams.members', can: 'view', on: 'team')] class TeamMembersTable extends TableDefinition { - use ResolvesTeamFromContext; - public function layout(): string { return 'grid'; @@ -54,18 +51,15 @@ public function columns(): array public function actions(array $row): array { - $team = $this->optionalTeamFromContext(); + /** @var Team $team */ + $team = $this->contextModel('team'); $user = auth()->user(); - if (! $team instanceof Team || ! $user instanceof User) { - return []; - } - - if (TeamRole::tryFrom((string) ($row['role'] ?? '')) === TeamRole::Owner) { + if (! $user instanceof User || TeamRole::tryFrom((string) ($row['role'] ?? '')) === TeamRole::Owner) { return []; } - $context = ['team' => $team->slug, 'member' => $row['id']]; + $context = ['member' => $row['id']]; $actions = []; if ($user->can('updateMember', $team)) { @@ -90,10 +84,9 @@ public function actions(array $row): array public function source(): TableSource { return new CallbackTableSource(function (TableQuery $query): TableResult { - $team = $this->optionalTeamFromContext(); - $user = auth()->user(); + $team = $this->contextModelOrNull('team'); - if (! $team instanceof Team || ! $user instanceof User || ! $user->belongsToTeam($team)) { + if (! $team instanceof Team) { return TableResult::fromItems([]); } diff --git a/boost.json b/boost.json index 28eb079..0acb7b7 100644 --- a/boost.json +++ b/boost.json @@ -12,13 +12,12 @@ ], "sail": false, "skills": [ + "infer-conventions", "fortify-development", "laravel-best-practices", - "wayfinder-development", - "pest-testing", + "testing-best-practices", "inertia-react-development", "echo-react-development", - "echo-development", "tailwindcss-development", "lattice-actions", "lattice-closures", diff --git a/components.json b/components.json deleted file mode 100644 index 4a304d0..0000000 --- a/components.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema.json", - "style": "new-york", - "rsc": false, - "tsx": true, - "tailwind": { - "config": "", - "css": "resources/css/app.css", - "baseColor": "neutral", - "cssVariables": true, - "prefix": "" - }, - "aliases": { - "components": "@/components", - "utils": "@/lib/utils", - "ui": "@/components/ui", - "lib": "@/lib", - "hooks": "@/hooks" - }, - "iconLibrary": "lucide" -} diff --git a/composer.json b/composer.json index c4a1bf9..d7a0498 100644 --- a/composer.json +++ b/composer.json @@ -14,30 +14,31 @@ "require": { "php": "^8.4", "bambamboole/laravel-i18next": "^0.6.0", - "bambamboole/laravel-translation-dumper": "^2.2", - "inertiajs/inertia-laravel": "^3.1", - "laravel/chisel": "^0.1.1", + "inertiajs/inertia-laravel": "^3.3.2", "laravel/fortify": "^1.37.2", - "laravel/framework": "^13.16.1", - "laravel/reverb": "^1.10.2", + "laravel/framework": "^13.30.1", + "laravel/reverb": "^1.11.1", "laravel/tinker": "^3.0.2", - "laravel/wayfinder": "^0.1.20", - "lattice-php/lattice": "^0.59.0" + "lattice-php/lattice": "^0.72.1" }, "require-dev": { + "bambamboole/laravel-translation-dumper": "^2.2", "barryvdh/laravel-ide-helper": "^3.7", + "driftingly/rector-laravel": "^2.6.2", "fakerphp/faker": "^1.24.1", - "larastan/larastan": "^3.10", - "laravel/boost": "^2.4.10", + "larastan/larastan": "^3.11", + "laravel/boost": "^2.7.0", "laravel/pail": "^1.2.7", - "laravel/pao": "^1.1.1", - "laravel/pint": "^1.29.3", - "laravel/sail": "^1.62", - "mockery/mockery": "^1.6.12", - "nunomaduro/collision": "^8.9.4", - "pestphp/pest": "^5.1", - "pestphp/pest-plugin-browser": "^5.0", - "pestphp/pest-plugin-laravel": "^5.0" + "laravel/pao": "^1.1.4", + "laravel/pint": "^1.30.5", + "mockery/mockery": "^1.6.15", + "nunomaduro/collision": "^8.9.5", + "pestphp/pest": "^5.1.3", + "pestphp/pest-plugin-browser": "^5.0.1", + "pestphp/pest-plugin-laravel": "^5.0.1", + "pestphp/pest-plugin-phpstan": "^5.2.0", + "pestphp/pest-plugin-rector": "^5.0.4", + "rector/rector": "^2.6.6" }, "autoload": { "psr-4": { @@ -62,7 +63,7 @@ ], "dev": [ "Composer\\Config::disableProcessTimeout", - "npx concurrently -c \"#93c5fd,#c4b5fd,#fcd34d,#fb7185,#fdba74\" \"php artisan serve --host=localhost\" \"php artisan queue:listen --tries=1 --timeout=0\" \"php artisan reverb:start\" \"php artisan pail --timeout=0\" \"npm run dev\" --names=server,queue,reverb,logs,vite --kill-others" + "@php artisan dev" ], "lint": [ "pint --parallel" @@ -70,25 +71,50 @@ "lint:check": [ "pint --parallel --test" ], + "phpstan": [ + "vendor/bin/phpstan analyse" + ], + "rector:check": [ + "vendor/bin/rector process --config=rector.php --dry-run" + ], + "rector:fix": [ + "vendor/bin/rector process --config=rector.php" + ], + "test": [ + "@php artisan config:clear --ansi", + "@lint:check", + "@php artisan test --compact --parallel --exclude-testsuite Browser" + ], + "test:browser": [ + "Composer\\Config::disableProcessTimeout", + "@php artisan test tests/Browser --compact" + ], "ci:check": [ "Composer\\Config::disableProcessTimeout", "npm run lint:check", "npm run format:check", "npm run types:check", + "@phpstan", + "@rector:check", "@test" ], - "test": [ - "@php artisan config:clear --ansi", - "@lint:check", - "@php artisan test" + "check:full": [ + "Composer\\Config::disableProcessTimeout", + "@ci:check", + "npm run build" ], + "hooks:install": "git config core.hooksPath .githooks 2>/dev/null || true", "post-autoload-dump": [ "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", "@php artisan package:discover --ansi" ], + "post-install-cmd": [ + "@hooks:install" + ], "post-update-cmd": [ "@php artisan vendor:publish --tag=laravel-assets --ansi --force", - "@php artisan boost:update --ansi" + "@php artisan boost:update --ansi", + "@hooks:install" ], "post-root-package-install": [ "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" @@ -108,6 +134,11 @@ "installer": { "post-create-project": [] } + }, + "lattice": { + "discover": [ + "app" + ] } }, "config": { diff --git a/composer.lock b/composer.lock index e21e546..bb7bfac 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "0e9146d3d13d2d1979f1682ffe94f301", + "content-hash": "9864741b1c419a31a7024e10dfb9efd2", "packages": [ { "name": "bacon/bacon-qr-code", @@ -1092,24 +1092,24 @@ }, { "name": "graham-campbell/result-type", - "version": "v1.1.4", + "version": "v1.2.0", "source": { "type": "git", "url": "https://github.com/GrahamCampbell/Result-Type.git", - "reference": "e01f4a821471308ba86aa202fed6698b6b695e3b" + "reference": "adccca3324eece92ca35463648c12b9e6293c05b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/e01f4a821471308ba86aa202fed6698b6b695e3b", - "reference": "e01f4a821471308ba86aa202fed6698b6b695e3b", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/adccca3324eece92ca35463648c12b9e6293c05b", + "reference": "adccca3324eece92ca35463648c12b9e6293c05b", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0", - "phpoption/phpoption": "^1.9.5" + "phpoption/phpoption": "^1.10" }, "require-dev": { - "phpunit/phpunit": "^8.5.41 || ^9.6.22 || ^10.5.45 || ^11.5.7" + "phpunit/phpunit": "^8.5.52 || ^9.6.34 || ^10.5.63 || ^11.5.55 || ^12.5.14" }, "type": "library", "autoload": { @@ -1138,7 +1138,7 @@ ], "support": { "issues": "https://github.com/GrahamCampbell/Result-Type/issues", - "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.4" + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.2.0" }, "funding": [ { @@ -1150,26 +1150,26 @@ "type": "tidelift" } ], - "time": "2025-12-27T19:43:20+00:00" + "time": "2026-08-24T09:06:52+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "7.15.3", + "version": "7.15.5", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "ae311b8f045ea93ce7b1c9cdb7cec06c53f944bc" + "reference": "ee80339fd9177ba44c49cdb653ff02a4d1106b9a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/ae311b8f045ea93ce7b1c9cdb7cec06c53f944bc", - "reference": "ae311b8f045ea93ce7b1c9cdb7cec06c53f944bc", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/ee80339fd9177ba44c49cdb653ff02a4d1106b9a", + "reference": "ee80339fd9177ba44c49cdb653ff02a4d1106b9a", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^2.5.2", - "guzzlehttp/psr7": "^2.13", + "guzzlehttp/promises": "^2.5.3", + "guzzlehttp/psr7": "^2.13.1", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.5 || ^3.0", @@ -1262,7 +1262,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.15.3" + "source": "https://github.com/guzzle/guzzle/tree/7.15.5" }, "funding": [ { @@ -1278,20 +1278,20 @@ "type": "tidelift" } ], - "time": "2026-08-05T19:48:21+00:00" + "time": "2026-08-24T09:21:06+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.5.2", + "version": "2.5.3", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "2823687acff28b2dbe67b2508a6b300e2c3fa4ce" + "reference": "cde49999552d185d64715fe9c1f77a2aadd2f9f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/2823687acff28b2dbe67b2508a6b300e2c3fa4ce", - "reference": "2823687acff28b2dbe67b2508a6b300e2c3fa4ce", + "url": "https://api.github.com/repos/guzzle/promises/zipball/cde49999552d185d64715fe9c1f77a2aadd2f9f1", + "reference": "cde49999552d185d64715fe9c1f77a2aadd2f9f1", "shasum": "" }, "require": { @@ -1346,7 +1346,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.5.2" + "source": "https://github.com/guzzle/promises/tree/2.5.3" }, "funding": [ { @@ -1362,20 +1362,20 @@ "type": "tidelift" } ], - "time": "2026-08-05T19:30:54+00:00" + "time": "2026-08-24T09:11:28+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.13.0", + "version": "2.13.1", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "dad89620b7a6edb60c15858442eb2e408b45d8f4" + "reference": "95e7828100de18b4e269fb1703be530082d5166d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/dad89620b7a6edb60c15858442eb2e408b45d8f4", - "reference": "dad89620b7a6edb60c15858442eb2e408b45d8f4", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/95e7828100de18b4e269fb1703be530082d5166d", + "reference": "95e7828100de18b4e269fb1703be530082d5166d", "shasum": "" }, "require": { @@ -1465,7 +1465,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.13.0" + "source": "https://github.com/guzzle/psr7/tree/2.13.1" }, "funding": [ { @@ -1481,20 +1481,20 @@ "type": "tidelift" } ], - "time": "2026-07-16T22:23:49+00:00" + "time": "2026-08-24T09:13:11+00:00" }, { "name": "guzzlehttp/uri-template", - "version": "v2.0.0", + "version": "v2.0.1", "source": { "type": "git", "url": "https://github.com/guzzle/uri-template.git", - "reference": "516c3bf2af176c532d5b59b3430292f7e9ecccb1" + "reference": "7a466ad606491eb6528c717482f7cca77f1851f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/uri-template/zipball/516c3bf2af176c532d5b59b3430292f7e9ecccb1", - "reference": "516c3bf2af176c532d5b59b3430292f7e9ecccb1", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/7a466ad606491eb6528c717482f7cca77f1851f3", + "reference": "7a466ad606491eb6528c717482f7cca77f1851f3", "shasum": "" }, "require": { @@ -1551,7 +1551,7 @@ ], "support": { "issues": "https://github.com/guzzle/uri-template/issues", - "source": "https://github.com/guzzle/uri-template/tree/v2.0.0" + "source": "https://github.com/guzzle/uri-template/tree/v2.0.1" }, "funding": [ { @@ -1567,20 +1567,20 @@ "type": "tidelift" } ], - "time": "2026-07-20T13:40:43+00:00" + "time": "2026-08-24T17:13:02+00:00" }, { "name": "inertiajs/inertia-laravel", - "version": "v3.3.1", + "version": "v3.3.3", "source": { "type": "git", "url": "https://github.com/inertiajs/inertia-laravel.git", - "reference": "7bfd75e352938b703180574b943d81963555a0aa" + "reference": "42dccee77d7df6b2e152965434a89cafc35a2961" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/inertiajs/inertia-laravel/zipball/7bfd75e352938b703180574b943d81963555a0aa", - "reference": "7bfd75e352938b703180574b943d81963555a0aa", + "url": "https://api.github.com/repos/inertiajs/inertia-laravel/zipball/42dccee77d7df6b2e152965434a89cafc35a2961", + "reference": "42dccee77d7df6b2e152965434a89cafc35a2961", "shasum": "" }, "require": { @@ -1637,74 +1637,22 @@ ], "support": { "issues": "https://github.com/inertiajs/inertia-laravel/issues", - "source": "https://github.com/inertiajs/inertia-laravel/tree/v3.3.1" - }, - "time": "2026-08-04T21:58:51+00:00" - }, - { - "name": "laravel/chisel", - "version": "v0.1.1", - "source": { - "type": "git", - "url": "https://github.com/laravel/chisel.git", - "reference": "c2ac11cd1c6b763b412aa26b9d95fce70a489d31" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel/chisel/zipball/c2ac11cd1c6b763b412aa26b9d95fce70a489d31", - "reference": "c2ac11cd1c6b763b412aa26b9d95fce70a489d31", - "shasum": "" - }, - "require": { - "illuminate/process": "^10.20|^11.0|^12.0|^13.0", - "nikic/php-parser": "^5.0", - "php": "^8.2" - }, - "require-dev": { - "laravel/pint": "^1.24.0", - "pestphp/pest": "^4.1.0", - "phpstan/phpstan": "^2.1.26", - "rector/rector": "^2.1.7" - }, - "type": "library", - "autoload": { - "psr-4": { - "Laravel\\Chisel\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "Toolkit for building scripts that remove unwanted code, files, and dependencies.", - "keywords": [ - "chisel", - "laravel" - ], - "support": { - "issues": "https://github.com/laravel/chisel/issues", - "source": "https://github.com/laravel/chisel/tree/v0.1.1" + "source": "https://github.com/inertiajs/inertia-laravel/tree/v3.3.3" }, - "time": "2026-05-13T21:29:24+00:00" + "time": "2026-09-04T13:56:39+00:00" }, { "name": "laravel/fortify", - "version": "v1.38.0", + "version": "v1.39.0", "source": { "type": "git", "url": "https://github.com/laravel/fortify.git", - "reference": "c04ca2998631e1816f2e94a78b668f3a59b3962d" + "reference": "b1fc50707bbe007fd92165d8b7d460ab549b355a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/fortify/zipball/c04ca2998631e1816f2e94a78b668f3a59b3962d", - "reference": "c04ca2998631e1816f2e94a78b668f3a59b3962d", + "url": "https://api.github.com/repos/laravel/fortify/zipball/b1fc50707bbe007fd92165d8b7d460ab549b355a", + "reference": "b1fc50707bbe007fd92165d8b7d460ab549b355a", "shasum": "" }, "require": { @@ -1755,20 +1703,20 @@ "issues": "https://github.com/laravel/fortify/issues", "source": "https://github.com/laravel/fortify" }, - "time": "2026-08-07T14:07:45+00:00" + "time": "2026-08-23T07:46:41+00:00" }, { "name": "laravel/framework", - "version": "v13.26.1", + "version": "v13.30.1", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "e4a1bc52ef551d52e60244bb004256d6861da7ab" + "reference": "718d17db56861e0a49f644217c8853dab1bff8ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/e4a1bc52ef551d52e60244bb004256d6861da7ab", - "reference": "e4a1bc52ef551d52e60244bb004256d6861da7ab", + "url": "https://api.github.com/repos/laravel/framework/zipball/718d17db56861e0a49f644217c8853dab1bff8ce", + "reference": "718d17db56861e0a49f644217c8853dab1bff8ce", "shasum": "" }, "require": { @@ -1890,7 +1838,7 @@ "phpstan/phpstan": "^2.0", "phpunit/phpunit": "^11.5.50 || ^12.5.8 || ^13.0.3", "predis/predis": "^2.3 || ^3.0", - "rector/rector": "^2.3", + "rector/rector": "2.6.3", "resend/resend-php": "^1.0", "symfony/cache": "^7.4.0 || ^8.0.0", "symfony/http-client": "^7.4.0 || ^8.0.0", @@ -1982,7 +1930,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2026-08-18T20:31:28+00:00" + "time": "2026-09-01T21:42:30+00:00" }, { "name": "laravel/passkeys", @@ -2054,16 +2002,16 @@ }, { "name": "laravel/prompts", - "version": "v0.3.23", + "version": "v0.3.24", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "b7b4c35e5bc47450f6b6238c6cc9c47ba19b2221" + "reference": "5d3cdef29e93ca3b62b1871359db3078cd99908b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/b7b4c35e5bc47450f6b6238c6cc9c47ba19b2221", - "reference": "b7b4c35e5bc47450f6b6238c6cc9c47ba19b2221", + "url": "https://api.github.com/repos/laravel/prompts/zipball/5d3cdef29e93ca3b62b1871359db3078cd99908b", + "reference": "5d3cdef29e93ca3b62b1871359db3078cd99908b", "shasum": "" }, "require": { @@ -2107,9 +2055,9 @@ "description": "Add beautiful and user-friendly forms to your command-line applications.", "support": { "issues": "https://github.com/laravel/prompts/issues", - "source": "https://github.com/laravel/prompts/tree/v0.3.23" + "source": "https://github.com/laravel/prompts/tree/v0.3.24" }, - "time": "2026-08-11T18:58:24+00:00" + "time": "2026-08-20T12:55:36+00:00" }, { "name": "laravel/reverb", @@ -2192,16 +2140,16 @@ }, { "name": "laravel/serializable-closure", - "version": "v2.0.15", + "version": "v2.0.16", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "dccd8bcb851bb03fcc005df650b708b57cc52661" + "reference": "7cfc24e4fa2cca045fb8dd2a797a2b2b13b655ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/dccd8bcb851bb03fcc005df650b708b57cc52661", - "reference": "dccd8bcb851bb03fcc005df650b708b57cc52661", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/7cfc24e4fa2cca045fb8dd2a797a2b2b13b655ed", + "reference": "7cfc24e4fa2cca045fb8dd2a797a2b2b13b655ed", "shasum": "" }, "require": { @@ -2249,7 +2197,7 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2026-07-21T16:49:22+00:00" + "time": "2026-08-18T20:28:54+00:00" }, { "name": "laravel/tinker", @@ -2320,84 +2268,18 @@ }, "time": "2026-03-17T14:54:13+00:00" }, - { - "name": "laravel/wayfinder", - "version": "v0.1.21", - "source": { - "type": "git", - "url": "https://github.com/laravel/wayfinder.git", - "reference": "a85a996cea189f59cac14854f8b13319a29007f3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel/wayfinder/zipball/a85a996cea189f59cac14854f8b13319a29007f3", - "reference": "a85a996cea189f59cac14854f8b13319a29007f3", - "shasum": "" - }, - "require": { - "illuminate/console": "^11.0|^12.0|^13.0", - "illuminate/filesystem": "^11.0|^12.0|^13.0", - "illuminate/routing": "^11.0|^12.0|^13.0", - "illuminate/support": "^11.0|^12.0|^13.0", - "php": "^8.2", - "phpstan/phpdoc-parser": "^2.3" - }, - "conflict": { - "laravel/boost": "<2.5.0" - }, - "require-dev": { - "laravel/pint": "^1.21", - "orchestra/testbench": "^11.0|^10.1|^9.0" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Laravel\\Wayfinder\\WayfinderServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Laravel\\Wayfinder\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "Generate TypeScript representations of your Laravel actions and routes.", - "homepage": "https://github.com/laravel/wayfinder", - "keywords": [ - "laravel", - "php", - "routes", - "typescript" - ], - "support": { - "issues": "https://github.com/laravel/wayfinder/issues", - "source": "https://github.com/laravel/wayfinder" - }, - "time": "2026-08-04T21:55:43+00:00" - }, { "name": "lattice-php/action", - "version": "0.59.0", + "version": "0.72.2", "source": { "type": "git", "url": "https://github.com/lattice-php/action.git", - "reference": "fd657eda24fc935a95ebe0a7ff3c8c3e1cdec75e" + "reference": "dd55ad726afb007b8e0569681b908dbba70ec1e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lattice-php/action/zipball/fd657eda24fc935a95ebe0a7ff3c8c3e1cdec75e", - "reference": "fd657eda24fc935a95ebe0a7ff3c8c3e1cdec75e", + "url": "https://api.github.com/repos/lattice-php/action/zipball/dd55ad726afb007b8e0569681b908dbba70ec1e4", + "reference": "dd55ad726afb007b8e0569681b908dbba70ec1e4", "shasum": "" }, "require": { @@ -2435,22 +2317,22 @@ "description": "Action and bulk-action definitions, endpoints, and confirmation flows for Lattice.", "support": { "issues": "https://github.com/lattice-php/action/issues", - "source": "https://github.com/lattice-php/action/tree/0.59.0" + "source": "https://github.com/lattice-php/action/tree/0.72.2" }, - "time": "2026-08-19T21:34:34+00:00" + "time": "2026-09-05T12:56:05+00:00" }, { "name": "lattice-php/core", - "version": "0.59.0", + "version": "0.72.2", "source": { "type": "git", "url": "https://github.com/lattice-php/core.git", - "reference": "ad73c644fd37354e1291d682ea0b998aefb1f989" + "reference": "4ee6bb340285bb04a4cf2e142e01d0186857e287" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lattice-php/core/zipball/ad73c644fd37354e1291d682ea0b998aefb1f989", - "reference": "ad73c644fd37354e1291d682ea0b998aefb1f989", + "url": "https://api.github.com/repos/lattice-php/core/zipball/4ee6bb340285bb04a4cf2e142e01d0186857e287", + "reference": "4ee6bb340285bb04a4cf2e142e01d0186857e287", "shasum": "" }, "require": { @@ -2488,22 +2370,22 @@ "description": "Core contracts, discovery, evaluation, and serialization for Lattice.", "support": { "issues": "https://github.com/lattice-php/core/issues", - "source": "https://github.com/lattice-php/core/tree/0.59.0" + "source": "https://github.com/lattice-php/core/tree/0.72.2" }, - "time": "2026-08-19T21:33:56+00:00" + "time": "2026-09-05T12:56:21+00:00" }, { "name": "lattice-php/form", - "version": "0.59.0", + "version": "0.72.2", "source": { "type": "git", "url": "https://github.com/lattice-php/form.git", - "reference": "2ce74abf9bb70e2e61e0455d298bba4e7c3fc008" + "reference": "c6a57d52c101dc43f8e3e443b399e84862b99fd4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lattice-php/form/zipball/2ce74abf9bb70e2e61e0455d298bba4e7c3fc008", - "reference": "2ce74abf9bb70e2e61e0455d298bba4e7c3fc008", + "url": "https://api.github.com/repos/lattice-php/form/zipball/c6a57d52c101dc43f8e3e443b399e84862b99fd4", + "reference": "c6a57d52c101dc43f8e3e443b399e84862b99fd4", "shasum": "" }, "require": { @@ -2545,22 +2427,22 @@ "description": "Form definitions, fields, validation, and rich content for Lattice.", "support": { "issues": "https://github.com/lattice-php/form/issues", - "source": "https://github.com/lattice-php/form/tree/0.59.0" + "source": "https://github.com/lattice-php/form/tree/0.72.2" }, - "time": "2026-08-19T21:33:52+00:00" + "time": "2026-09-05T12:56:30+00:00" }, { "name": "lattice-php/lattice", - "version": "0.59.0", + "version": "0.72.2", "source": { "type": "git", "url": "https://github.com/lattice-php/framework.git", - "reference": "3761ae47e1e62a87c77cf1bf7e69bd281c569a46" + "reference": "0a0268912bd99a8fc21fb81117c41e353fea262c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lattice-php/framework/zipball/3761ae47e1e62a87c77cf1bf7e69bd281c569a46", - "reference": "3761ae47e1e62a87c77cf1bf7e69bd281c569a46", + "url": "https://api.github.com/repos/lattice-php/framework/zipball/0a0268912bd99a8fc21fb81117c41e353fea262c", + "reference": "0a0268912bd99a8fc21fb81117c41e353fea262c", "shasum": "" }, "require": { @@ -2620,20 +2502,20 @@ "issues": "https://github.com/lattice-php/lattice/issues", "source": "https://github.com/lattice-php/lattice" }, - "time": "2026-08-19T21:34:04+00:00" + "time": "2026-09-05T12:56:02+00:00" }, { "name": "lattice-php/table", - "version": "0.59.0", + "version": "0.72.2", "source": { "type": "git", "url": "https://github.com/lattice-php/table.git", - "reference": "29db9e1c6d4830e8b9f93b7d7d7c4b4b6962c375" + "reference": "976d89fde56b3d3697ada821c95bcab87a628e30" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lattice-php/table/zipball/29db9e1c6d4830e8b9f93b7d7d7c4b4b6962c375", - "reference": "29db9e1c6d4830e8b9f93b7d7d7c4b4b6962c375", + "url": "https://api.github.com/repos/lattice-php/table/zipball/976d89fde56b3d3697ada821c95bcab87a628e30", + "reference": "976d89fde56b3d3697ada821c95bcab87a628e30", "shasum": "" }, "require": { @@ -2673,22 +2555,22 @@ "description": "Table definitions, columns, filters, and data sources for Lattice.", "support": { "issues": "https://github.com/lattice-php/table/issues", - "source": "https://github.com/lattice-php/table/tree/0.59.0" + "source": "https://github.com/lattice-php/table/tree/0.72.2" }, - "time": "2026-08-19T21:34:01+00:00" + "time": "2026-09-05T12:56:13+00:00" }, { "name": "lattice-php/ui", - "version": "0.59.0", + "version": "0.72.2", "source": { "type": "git", "url": "https://github.com/lattice-php/ui.git", - "reference": "1a38580a66d667e84a7ddb207555432acde87373" + "reference": "edfa90cdc1426ba5260494dfe12fb88f4ccf4932" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lattice-php/ui/zipball/1a38580a66d667e84a7ddb207555432acde87373", - "reference": "1a38580a66d667e84a7ddb207555432acde87373", + "url": "https://api.github.com/repos/lattice-php/ui/zipball/edfa90cdc1426ba5260494dfe12fb88f4ccf4932", + "reference": "edfa90cdc1426ba5260494dfe12fb88f4ccf4932", "shasum": "" }, "require": { @@ -2724,9 +2606,9 @@ "description": "UI components, effects, and serialization for Lattice.", "support": { "issues": "https://github.com/lattice-php/ui/issues", - "source": "https://github.com/lattice-php/ui/tree/0.59.0" + "source": "https://github.com/lattice-php/ui/tree/0.72.2" }, - "time": "2026-08-19T21:34:23+00:00" + "time": "2026-09-05T12:56:33+00:00" }, { "name": "league/commonmark", @@ -2919,16 +2801,16 @@ }, { "name": "league/flysystem", - "version": "3.35.2", + "version": "3.36.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "b277b5dc3d56650b68904117124e79c851e12376" + "reference": "f7fb152932f30072d573510cbd4dd657d6475b25" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/b277b5dc3d56650b68904117124e79c851e12376", - "reference": "b277b5dc3d56650b68904117124e79c851e12376", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/f7fb152932f30072d573510cbd4dd657d6475b25", + "reference": "f7fb152932f30072d573510cbd4dd657d6475b25", "shasum": "" }, "require": { @@ -2996,22 +2878,22 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.35.2" + "source": "https://github.com/thephpleague/flysystem/tree/3.36.0" }, - "time": "2026-07-06T14:42:07+00:00" + "time": "2026-09-02T08:00:27+00:00" }, { "name": "league/flysystem-local", - "version": "3.31.0", + "version": "3.35.3", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-local.git", - "reference": "2f669db18a4c20c755c2bb7d3a7b0b2340488079" + "reference": "a099b24dce160f3b2239043d13d47c4a1a214ea4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/2f669db18a4c20c755c2bb7d3a7b0b2340488079", - "reference": "2f669db18a4c20c755c2bb7d3a7b0b2340488079", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/a099b24dce160f3b2239043d13d47c4a1a214ea4", + "reference": "a099b24dce160f3b2239043d13d47c4a1a214ea4", "shasum": "" }, "require": { @@ -3045,9 +2927,9 @@ "local" ], "support": { - "source": "https://github.com/thephpleague/flysystem-local/tree/3.31.0" + "source": "https://github.com/thephpleague/flysystem-local/tree/3.35.3" }, - "time": "2026-01-23T15:30:45+00:00" + "time": "2026-08-12T13:29:21+00:00" }, { "name": "league/mime-type-detection", @@ -3289,16 +3171,16 @@ }, { "name": "monolog/monolog", - "version": "3.10.0", + "version": "3.11.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0" + "reference": "147f303310f06334f03f409e49d7ad1e275ff05a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/b321dd6749f0bf7189444158a3ce785cc16d69b0", - "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/147f303310f06334f03f409e49d7ad1e275ff05a", + "reference": "147f303310f06334f03f409e49d7ad1e275ff05a", "shasum": "" }, "require": { @@ -3376,7 +3258,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.10.0" + "source": "https://github.com/Seldaek/monolog/tree/3.11.0" }, "funding": [ { @@ -3388,7 +3270,7 @@ "type": "tidelift" } ], - "time": "2026-01-02T08:56:05+00:00" + "time": "2026-09-02T12:39:56+00:00" }, { "name": "nesbot/carbon", @@ -4044,16 +3926,16 @@ }, { "name": "phpoption/phpoption", - "version": "1.9.5", + "version": "1.10.0", "source": { "type": "git", "url": "https://github.com/schmittjoh/php-option.git", - "reference": "75365b91986c2405cf5e1e012c5595cd487a98be" + "reference": "67b192b6a42ec03944b972d6e633ddec78ad2c6d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/75365b91986c2405cf5e1e012c5595cd487a98be", - "reference": "75365b91986c2405cf5e1e012c5595cd487a98be", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/67b192b6a42ec03944b972d6e633ddec78ad2c6d", + "reference": "67b192b6a42ec03944b972d6e633ddec78ad2c6d", "shasum": "" }, "require": { @@ -4061,7 +3943,7 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.44 || ^9.6.25 || ^10.5.53 || ^11.5.34" + "phpunit/phpunit": "^8.5.54 || ^9.6.36 || ^10.5.64 || ^11.5.56 || ^12.5.33" }, "type": "library", "extra": { @@ -4103,7 +3985,7 @@ ], "support": { "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.9.5" + "source": "https://github.com/schmittjoh/php-option/tree/1.10.0" }, "funding": [ { @@ -4115,20 +3997,20 @@ "type": "tidelift" } ], - "time": "2025-12-27T19:41:33+00:00" + "time": "2026-08-24T00:54:40+00:00" }, { "name": "phpstan/phpdoc-parser", - "version": "2.3.3", + "version": "2.3.5", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "fb19eedd2bb67ff8cf7a5502ad329e701d6398a3" + "reference": "148cefffaf0233e4c08cc13db8a195a56dd6dfe9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/fb19eedd2bb67ff8cf7a5502ad329e701d6398a3", - "reference": "fb19eedd2bb67ff8cf7a5502ad329e701d6398a3", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/148cefffaf0233e4c08cc13db8a195a56dd6dfe9", + "reference": "148cefffaf0233e4c08cc13db8a195a56dd6dfe9", "shasum": "" }, "require": { @@ -4160,9 +4042,9 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.3" + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.5" }, - "time": "2026-07-08T07:01:06+00:00" + "time": "2026-08-31T16:05:28+00:00" }, { "name": "pragmarx/google2fa", @@ -5649,16 +5531,16 @@ }, { "name": "spatie/laravel-package-tools", - "version": "1.93.1", + "version": "1.93.2", "source": { "type": "git", "url": "https://github.com/spatie/laravel-package-tools.git", - "reference": "d5552849801f2642aea710557463234b59ef65eb" + "reference": "e927d5b5b05e9fecae098e559e51918aa608ad02" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/d5552849801f2642aea710557463234b59ef65eb", - "reference": "d5552849801f2642aea710557463234b59ef65eb", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/e927d5b5b05e9fecae098e559e51918aa608ad02", + "reference": "e927d5b5b05e9fecae098e559e51918aa608ad02", "shasum": "" }, "require": { @@ -5698,7 +5580,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-package-tools/issues", - "source": "https://github.com/spatie/laravel-package-tools/tree/1.93.1" + "source": "https://github.com/spatie/laravel-package-tools/tree/1.93.2" }, "funding": [ { @@ -5706,7 +5588,7 @@ "type": "github" } ], - "time": "2026-05-19T14:06:37+00:00" + "time": "2026-08-26T09:13:25+00:00" }, { "name": "spatie/php-attribute-reader", @@ -5912,20 +5794,20 @@ }, { "name": "spomky-labs/cbor-php", - "version": "3.3.0", + "version": "3.3.4", "source": { "type": "git", "url": "https://github.com/Spomky-Labs/cbor-php.git", - "reference": "013d13da69cf28b1ae501887daceccc850ca1c76" + "reference": "1cac24eeae4be47122d505542a170623b2a35ea3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Spomky-Labs/cbor-php/zipball/013d13da69cf28b1ae501887daceccc850ca1c76", - "reference": "013d13da69cf28b1ae501887daceccc850ca1c76", + "url": "https://api.github.com/repos/Spomky-Labs/cbor-php/zipball/1cac24eeae4be47122d505542a170623b2a35ea3", + "reference": "1cac24eeae4be47122d505542a170623b2a35ea3", "shasum": "" }, "require": { - "brick/math": "^0.9|^0.10|^0.11|^0.12|^0.13|^0.14|^0.15|^0.16|^0.17|^0.18", + "brick/math": "^0.9|^0.10|^0.11|^0.12|^0.13|^0.14|^0.15|^0.16|^0.17|^0.18|^0.19|^0.20", "ext-mbstring": "*", "php": ">=8.0" }, @@ -5967,7 +5849,7 @@ ], "support": { "issues": "https://github.com/Spomky-Labs/cbor-php/issues", - "source": "https://github.com/Spomky-Labs/cbor-php/tree/3.3.0" + "source": "https://github.com/Spomky-Labs/cbor-php/tree/3.3.4" }, "funding": [ { @@ -5979,24 +5861,24 @@ "type": "patreon" } ], - "time": "2026-07-15T18:56:27+00:00" + "time": "2026-08-31T18:59:25+00:00" }, { "name": "spomky-labs/pki-framework", - "version": "1.6.0", + "version": "1.6.1", "source": { "type": "git", "url": "https://github.com/Spomky-Labs/pki-framework.git", - "reference": "80778a25426288acd2e3a7cde2def41a3d59cddf" + "reference": "5d630ec371652229ad568337519f16e539e5f79d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Spomky-Labs/pki-framework/zipball/80778a25426288acd2e3a7cde2def41a3d59cddf", - "reference": "80778a25426288acd2e3a7cde2def41a3d59cddf", + "url": "https://api.github.com/repos/Spomky-Labs/pki-framework/zipball/5d630ec371652229ad568337519f16e539e5f79d", + "reference": "5d630ec371652229ad568337519f16e539e5f79d", "shasum": "" }, "require": { - "brick/math": "^0.10|^0.11|^0.12|^0.13|^0.14|^0.15|^0.16|^0.17|^0.18|^0.19", + "brick/math": "^0.10|^0.11|^0.12|^0.13|^0.14|^0.15|^0.16|^0.17|^0.18|^0.19|^0.20", "ext-mbstring": "*", "php": ">=8.1" }, @@ -6076,7 +5958,7 @@ ], "support": { "issues": "https://github.com/Spomky-Labs/pki-framework/issues", - "source": "https://github.com/Spomky-Labs/pki-framework/tree/1.6.0" + "source": "https://github.com/Spomky-Labs/pki-framework/tree/1.6.1" }, "funding": [ { @@ -6088,7 +5970,7 @@ "type": "patreon" } ], - "time": "2026-08-06T16:21:11+00:00" + "time": "2026-08-30T13:53:49+00:00" }, { "name": "symfony/clock", @@ -6169,16 +6051,16 @@ }, { "name": "symfony/console", - "version": "v8.1.4", + "version": "v8.1.6", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "68efa2ebfd9a362951eb5a8b09fd177c66ddec24" + "reference": "eb7d9957d66739649e931ce7a9d05dab69f8abac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/68efa2ebfd9a362951eb5a8b09fd177c66ddec24", - "reference": "68efa2ebfd9a362951eb5a8b09fd177c66ddec24", + "url": "https://api.github.com/repos/symfony/console/zipball/eb7d9957d66739649e931ce7a9d05dab69f8abac", + "reference": "eb7d9957d66739649e931ce7a9d05dab69f8abac", "shasum": "" }, "require": { @@ -6245,7 +6127,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v8.1.4" + "source": "https://github.com/symfony/console/tree/v8.1.6" }, "funding": [ { @@ -6265,20 +6147,20 @@ "type": "tidelift" } ], - "time": "2026-07-31T12:43:13+00:00" + "time": "2026-08-25T14:18:42+00:00" }, { "name": "symfony/css-selector", - "version": "v8.1.0", + "version": "v8.1.6", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "dc0e2be45c9b5588c82414f02ac574b4b986abcd" + "reference": "08e2905152a39cf3fd1745d83f8c483e258887d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/dc0e2be45c9b5588c82414f02ac574b4b986abcd", - "reference": "dc0e2be45c9b5588c82414f02ac574b4b986abcd", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/08e2905152a39cf3fd1745d83f8c483e258887d9", + "reference": "08e2905152a39cf3fd1745d83f8c483e258887d9", "shasum": "" }, "require": { @@ -6314,7 +6196,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v8.1.0" + "source": "https://github.com/symfony/css-selector/tree/v8.1.6" }, "funding": [ { @@ -6334,7 +6216,7 @@ "type": "tidelift" } ], - "time": "2026-05-29T05:06:50+00:00" + "time": "2026-08-23T10:06:25+00:00" }, { "name": "symfony/deprecation-contracts", @@ -6409,16 +6291,16 @@ }, { "name": "symfony/error-handler", - "version": "v8.1.2", + "version": "v8.1.5", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "dc98404be5e8c949815e23fee1928f5de4f3f5d3" + "reference": "8b2a4289ffe5e2dc8fcf645b8e7870e1fa0325ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/dc98404be5e8c949815e23fee1928f5de4f3f5d3", - "reference": "dc98404be5e8c949815e23fee1928f5de4f3f5d3", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/8b2a4289ffe5e2dc8fcf645b8e7870e1fa0325ce", + "reference": "8b2a4289ffe5e2dc8fcf645b8e7870e1fa0325ce", "shasum": "" }, "require": { @@ -6466,7 +6348,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v8.1.2" + "source": "https://github.com/symfony/error-handler/tree/v8.1.5" }, "funding": [ { @@ -6486,20 +6368,20 @@ "type": "tidelift" } ], - "time": "2026-07-22T15:42:13+00:00" + "time": "2026-08-21T17:47:34+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v8.1.2", + "version": "v8.1.5", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "c14c05a9e6da7f5e375e6efc28952c7e7dbddffb" + "reference": "7458da64220376b2e0dc2d8451bf43382c1ad297" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/c14c05a9e6da7f5e375e6efc28952c7e7dbddffb", - "reference": "c14c05a9e6da7f5e375e6efc28952c7e7dbddffb", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/7458da64220376b2e0dc2d8451bf43382c1ad297", + "reference": "7458da64220376b2e0dc2d8451bf43382c1ad297", "shasum": "" }, "require": { @@ -6552,7 +6434,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v8.1.2" + "source": "https://github.com/symfony/event-dispatcher/tree/v8.1.5" }, "funding": [ { @@ -6572,7 +6454,7 @@ "type": "tidelift" } ], - "time": "2026-07-22T15:42:13+00:00" + "time": "2026-08-21T17:47:34+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -6656,16 +6538,16 @@ }, { "name": "symfony/finder", - "version": "v8.1.1", + "version": "v8.1.5", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "e2989e762c70f9490fa3a00a0ac0fae5aa97a531" + "reference": "8d7acede2b2ae07605783d1c43e49b5767036474" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/e2989e762c70f9490fa3a00a0ac0fae5aa97a531", - "reference": "e2989e762c70f9490fa3a00a0ac0fae5aa97a531", + "url": "https://api.github.com/repos/symfony/finder/zipball/8d7acede2b2ae07605783d1c43e49b5767036474", + "reference": "8d7acede2b2ae07605783d1c43e49b5767036474", "shasum": "" }, "require": { @@ -6700,7 +6582,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v8.1.1" + "source": "https://github.com/symfony/finder/tree/v8.1.5" }, "funding": [ { @@ -6720,20 +6602,20 @@ "type": "tidelift" } ], - "time": "2026-06-27T09:05:56+00:00" + "time": "2026-08-21T12:16:08+00:00" }, { "name": "symfony/html-sanitizer", - "version": "v8.1.1", + "version": "v8.1.6", "source": { "type": "git", "url": "https://github.com/symfony/html-sanitizer.git", - "reference": "09e1f2f9a3c8dcdca072587dc71999c1921c07cb" + "reference": "f8bbdb0704e6b6e9a3412481c1a87886a0633199" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/09e1f2f9a3c8dcdca072587dc71999c1921c07cb", - "reference": "09e1f2f9a3c8dcdca072587dc71999c1921c07cb", + "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/f8bbdb0704e6b6e9a3412481c1a87886a0633199", + "reference": "f8bbdb0704e6b6e9a3412481c1a87886a0633199", "shasum": "" }, "require": { @@ -6772,7 +6654,7 @@ "sanitizer" ], "support": { - "source": "https://github.com/symfony/html-sanitizer/tree/v8.1.1" + "source": "https://github.com/symfony/html-sanitizer/tree/v8.1.6" }, "funding": [ { @@ -6792,20 +6674,20 @@ "type": "tidelift" } ], - "time": "2026-06-06T11:11:44+00:00" + "time": "2026-08-30T01:03:44+00:00" }, { "name": "symfony/http-foundation", - "version": "v8.1.4", + "version": "v8.1.6", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "57e712b75f2d0bc8844edbdb18a81dab6f9d55c2" + "reference": "093b78326f649c3a9db922b9f17123b6aeb3b8fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/57e712b75f2d0bc8844edbdb18a81dab6f9d55c2", - "reference": "57e712b75f2d0bc8844edbdb18a81dab6f9d55c2", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/093b78326f649c3a9db922b9f17123b6aeb3b8fb", + "reference": "093b78326f649c3a9db922b9f17123b6aeb3b8fb", "shasum": "" }, "require": { @@ -6853,7 +6735,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v8.1.4" + "source": "https://github.com/symfony/http-foundation/tree/v8.1.6" }, "funding": [ { @@ -6873,20 +6755,20 @@ "type": "tidelift" } ], - "time": "2026-08-07T15:02:39+00:00" + "time": "2026-08-30T20:10:55+00:00" }, { "name": "symfony/http-kernel", - "version": "v8.1.4", + "version": "v8.1.6", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "69d81d8a5dac32a5d94e4eb063b7d97dc42c792a" + "reference": "2f73beb7c6f1a97d2c17bbf4dbd59da8cc18b355" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/69d81d8a5dac32a5d94e4eb063b7d97dc42c792a", - "reference": "69d81d8a5dac32a5d94e4eb063b7d97dc42c792a", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/2f73beb7c6f1a97d2c17bbf4dbd59da8cc18b355", + "reference": "2f73beb7c6f1a97d2c17bbf4dbd59da8cc18b355", "shasum": "" }, "require": { @@ -6963,7 +6845,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v8.1.4" + "source": "https://github.com/symfony/http-kernel/tree/v8.1.6" }, "funding": [ { @@ -6983,20 +6865,20 @@ "type": "tidelift" } ], - "time": "2026-08-07T18:04:54+00:00" + "time": "2026-08-30T21:40:49+00:00" }, { "name": "symfony/mailer", - "version": "v8.1.2", + "version": "v8.1.5", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "221c7f326ace1ac2baee8331d829d5b7f04f4d53" + "reference": "89f43137da74b8f1aab37c99926482b7084f51b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/221c7f326ace1ac2baee8331d829d5b7f04f4d53", - "reference": "221c7f326ace1ac2baee8331d829d5b7f04f4d53", + "url": "https://api.github.com/repos/symfony/mailer/zipball/89f43137da74b8f1aab37c99926482b7084f51b9", + "reference": "89f43137da74b8f1aab37c99926482b7084f51b9", "shasum": "" }, "require": { @@ -7043,7 +6925,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v8.1.2" + "source": "https://github.com/symfony/mailer/tree/v8.1.5" }, "funding": [ { @@ -7063,20 +6945,20 @@ "type": "tidelift" } ], - "time": "2026-07-28T07:35:25+00:00" + "time": "2026-08-21T17:47:34+00:00" }, { "name": "symfony/mime", - "version": "v8.1.4", + "version": "v8.1.6", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "8f8ac859d369fe3d18e3837998b1c992bbee92c9" + "reference": "1b36ccfd7ccb9ad1d6eafb9024b3dd3d9606b15f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/8f8ac859d369fe3d18e3837998b1c992bbee92c9", - "reference": "8f8ac859d369fe3d18e3837998b1c992bbee92c9", + "url": "https://api.github.com/repos/symfony/mime/zipball/1b36ccfd7ccb9ad1d6eafb9024b3dd3d9606b15f", + "reference": "1b36ccfd7ccb9ad1d6eafb9024b3dd3d9606b15f", "shasum": "" }, "require": { @@ -7097,7 +6979,7 @@ "symfony/process": "^7.4|^8.0", "symfony/property-access": "^7.4|^8.0", "symfony/property-info": "^7.4|^8.0", - "symfony/serializer": "^7.4|^8.0" + "symfony/serializer": "^7.4.17|^8.1.5" }, "type": "library", "autoload": { @@ -7129,7 +7011,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v8.1.4" + "source": "https://github.com/symfony/mime/tree/v8.1.6" }, "funding": [ { @@ -7149,7 +7031,7 @@ "type": "tidelift" } ], - "time": "2026-08-07T15:02:39+00:00" + "time": "2026-08-22T09:06:25+00:00" }, { "name": "symfony/polyfill-ctype", @@ -7318,16 +7200,16 @@ }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.38.1", + "version": "v1.42.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "dc21118016c039a66235cf93d96b435ffb282412" + "reference": "51b5ff5ba85452b31ec6f55490b08148612339d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/dc21118016c039a66235cf93d96b435ffb282412", - "reference": "dc21118016c039a66235cf93d96b435ffb282412", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/51b5ff5ba85452b31ec6f55490b08148612339d9", + "reference": "51b5ff5ba85452b31ec6f55490b08148612339d9", "shasum": "" }, "require": { @@ -7381,7 +7263,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.38.1" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.42.0" }, "funding": [ { @@ -7401,20 +7283,20 @@ "type": "tidelift" } ], - "time": "2026-05-25T15:22:23+00:00" + "time": "2026-08-24T10:51:20+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.38.0", + "version": "v1.42.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b" + "reference": "aa20edea75bd9c48cfecc8360922e5a6e5c44502" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/2d446c214bdbe5b71bde5011b060a05fece3ae6b", - "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/aa20edea75bd9c48cfecc8360922e5a6e5c44502", + "reference": "aa20edea75bd9c48cfecc8360922e5a6e5c44502", "shasum": "" }, "require": { @@ -7466,7 +7348,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.38.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.42.0" }, "funding": [ { @@ -7486,7 +7368,7 @@ "type": "tidelift" } ], - "time": "2026-05-25T13:48:31+00:00" + "time": "2026-08-07T06:33:24+00:00" }, { "name": "symfony/polyfill-mbstring", @@ -7982,16 +7864,16 @@ }, { "name": "symfony/process", - "version": "v8.1.0", + "version": "v8.1.6", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "c4a9e58f235a6bf7f97ffbfedae2687353ac79e5" + "reference": "d863f5e70d7c87abb906ac11b61f83036093000b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/c4a9e58f235a6bf7f97ffbfedae2687353ac79e5", - "reference": "c4a9e58f235a6bf7f97ffbfedae2687353ac79e5", + "url": "https://api.github.com/repos/symfony/process/zipball/d863f5e70d7c87abb906ac11b61f83036093000b", + "reference": "d863f5e70d7c87abb906ac11b61f83036093000b", "shasum": "" }, "require": { @@ -8023,7 +7905,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v8.1.0" + "source": "https://github.com/symfony/process/tree/v8.1.6" }, "funding": [ { @@ -8043,7 +7925,7 @@ "type": "tidelift" } ], - "time": "2026-05-29T05:06:50+00:00" + "time": "2026-08-21T17:47:34+00:00" }, { "name": "symfony/property-access", @@ -8128,16 +8010,16 @@ }, { "name": "symfony/property-info", - "version": "v8.1.4", + "version": "v8.1.6", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "d3b1ba3e69dd9fbfff3e00416d2fc60c600c599d" + "reference": "d25e1dabbaff3f91bb15ba68328cf4fbd1c43c42" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/d3b1ba3e69dd9fbfff3e00416d2fc60c600c599d", - "reference": "d3b1ba3e69dd9fbfff3e00416d2fc60c600c599d", + "url": "https://api.github.com/repos/symfony/property-info/zipball/d25e1dabbaff3f91bb15ba68328cf4fbd1c43c42", + "reference": "d25e1dabbaff3f91bb15ba68328cf4fbd1c43c42", "shasum": "" }, "require": { @@ -8190,7 +8072,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v8.1.4" + "source": "https://github.com/symfony/property-info/tree/v8.1.6" }, "funding": [ { @@ -8210,20 +8092,20 @@ "type": "tidelift" } ], - "time": "2026-08-07T15:02:39+00:00" + "time": "2026-08-30T08:48:43+00:00" }, { "name": "symfony/routing", - "version": "v8.1.2", + "version": "v8.1.6", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "1058d4e13bb81dd9a6f7565686df7e13b880cdbd" + "reference": "3c188091b6b4fa2e4bc83a135caede12deb8576c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/1058d4e13bb81dd9a6f7565686df7e13b880cdbd", - "reference": "1058d4e13bb81dd9a6f7565686df7e13b880cdbd", + "url": "https://api.github.com/repos/symfony/routing/zipball/3c188091b6b4fa2e4bc83a135caede12deb8576c", + "reference": "3c188091b6b4fa2e4bc83a135caede12deb8576c", "shasum": "" }, "require": { @@ -8270,7 +8152,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v8.1.2" + "source": "https://github.com/symfony/routing/tree/v8.1.6" }, "funding": [ { @@ -8290,20 +8172,20 @@ "type": "tidelift" } ], - "time": "2026-07-22T15:42:13+00:00" + "time": "2026-08-17T13:18:34+00:00" }, { "name": "symfony/serializer", - "version": "v8.1.4", + "version": "v8.1.6", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "ec3ae778e49a4cee5b937a779056fa23c3e834fb" + "reference": "931151b12d6e2d4996ce2ce8e7b180d35455f37a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/ec3ae778e49a4cee5b937a779056fa23c3e834fb", - "reference": "ec3ae778e49a4cee5b937a779056fa23c3e834fb", + "url": "https://api.github.com/repos/symfony/serializer/zipball/931151b12d6e2d4996ce2ce8e7b180d35455f37a", + "reference": "931151b12d6e2d4996ce2ce8e7b180d35455f37a", "shasum": "" }, "require": { @@ -8369,7 +8251,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v8.1.4" + "source": "https://github.com/symfony/serializer/tree/v8.1.6" }, "funding": [ { @@ -8389,20 +8271,20 @@ "type": "tidelift" } ], - "time": "2026-08-06T09:53:08+00:00" + "time": "2026-08-30T08:48:47+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.7.1", + "version": "v3.7.3", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "c0a284bab1ed8aa0417e3d69250ab437739563a0" + "reference": "15e6a07ec2a2c75ceb1b21dd98105ee8456d2257" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/c0a284bab1ed8aa0417e3d69250ab437739563a0", - "reference": "c0a284bab1ed8aa0417e3d69250ab437739563a0", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/15e6a07ec2a2c75ceb1b21dd98105ee8456d2257", + "reference": "15e6a07ec2a2c75ceb1b21dd98105ee8456d2257", "shasum": "" }, "require": { @@ -8456,7 +8338,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.7.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.7.3" }, "funding": [ { @@ -8476,7 +8358,7 @@ "type": "tidelift" } ], - "time": "2026-06-16T09:55:08+00:00" + "time": "2026-07-27T15:39:01+00:00" }, { "name": "symfony/string", @@ -8570,16 +8452,16 @@ }, { "name": "symfony/translation", - "version": "v8.1.4", + "version": "v8.1.5", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "c0955eb4aa417a110e65c8162237b8a5c7d910bf" + "reference": "d9e1caba0d6b6f9a26710af8a2f88d37f001215a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/c0955eb4aa417a110e65c8162237b8a5c7d910bf", - "reference": "c0955eb4aa417a110e65c8162237b8a5c7d910bf", + "url": "https://api.github.com/repos/symfony/translation/zipball/d9e1caba0d6b6f9a26710af8a2f88d37f001215a", + "reference": "d9e1caba0d6b6f9a26710af8a2f88d37f001215a", "shasum": "" }, "require": { @@ -8639,7 +8521,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v8.1.4" + "source": "https://github.com/symfony/translation/tree/v8.1.5" }, "funding": [ { @@ -8659,7 +8541,7 @@ "type": "tidelift" } ], - "time": "2026-07-30T12:40:56+00:00" + "time": "2026-08-21T17:47:34+00:00" }, { "name": "symfony/translation-contracts", @@ -8745,16 +8627,16 @@ }, { "name": "symfony/type-info", - "version": "v8.1.0", + "version": "v8.1.5", "source": { "type": "git", "url": "https://github.com/symfony/type-info.git", - "reference": "9f24df8a79781b9b9f030fea7dfd2f3bd1e7e7e7" + "reference": "ceb48db5b38d6a48640c414be0c69d53980ae5c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/type-info/zipball/9f24df8a79781b9b9f030fea7dfd2f3bd1e7e7e7", - "reference": "9f24df8a79781b9b9f030fea7dfd2f3bd1e7e7e7", + "url": "https://api.github.com/repos/symfony/type-info/zipball/ceb48db5b38d6a48640c414be0c69d53980ae5c5", + "reference": "ceb48db5b38d6a48640c414be0c69d53980ae5c5", "shasum": "" }, "require": { @@ -8803,7 +8685,7 @@ "type" ], "support": { - "source": "https://github.com/symfony/type-info/tree/v8.1.0" + "source": "https://github.com/symfony/type-info/tree/v8.1.5" }, "funding": [ { @@ -8823,20 +8705,20 @@ "type": "tidelift" } ], - "time": "2026-05-29T05:06:50+00:00" + "time": "2026-08-21T17:47:34+00:00" }, { "name": "symfony/uid", - "version": "v8.1.4", + "version": "v8.1.5", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "50e98f8bc4c3fcdaf925545a65150fb42cf0caf2" + "reference": "a08aef47989093f32fe50fd11859be1b427df389" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/50e98f8bc4c3fcdaf925545a65150fb42cf0caf2", - "reference": "50e98f8bc4c3fcdaf925545a65150fb42cf0caf2", + "url": "https://api.github.com/repos/symfony/uid/zipball/a08aef47989093f32fe50fd11859be1b427df389", + "reference": "a08aef47989093f32fe50fd11859be1b427df389", "shasum": "" }, "require": { @@ -8881,7 +8763,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v8.1.4" + "source": "https://github.com/symfony/uid/tree/v8.1.5" }, "funding": [ { @@ -8901,20 +8783,20 @@ "type": "tidelift" } ], - "time": "2026-08-02T11:29:46+00:00" + "time": "2026-08-11T13:39:01+00:00" }, { "name": "symfony/var-dumper", - "version": "v8.1.2", + "version": "v8.1.6", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "865103cf742a039f34645b971fc3ace308d6c167" + "reference": "3783365b58972f4779254d98372af80fbf15e170" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/865103cf742a039f34645b971fc3ace308d6c167", - "reference": "865103cf742a039f34645b971fc3ace308d6c167", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/3783365b58972f4779254d98372af80fbf15e170", + "reference": "3783365b58972f4779254d98372af80fbf15e170", "shasum": "" }, "require": { @@ -8968,7 +8850,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v8.1.2" + "source": "https://github.com/symfony/var-dumper/tree/v8.1.6" }, "funding": [ { @@ -8988,7 +8870,7 @@ "type": "tidelift" } ], - "time": "2026-07-22T15:42:13+00:00" + "time": "2026-08-30T20:10:55+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -9047,16 +8929,16 @@ }, { "name": "ueberdosis/tiptap-php", - "version": "2.1.1", + "version": "2.2.0", "source": { "type": "git", "url": "https://github.com/ueberdosis/tiptap-php.git", - "reference": "74bfb7be1c8c6102b240f3879b7f984a6ab87b97" + "reference": "5a2e8155c5b09c9ad4efd480550270a6924865b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ueberdosis/tiptap-php/zipball/74bfb7be1c8c6102b240f3879b7f984a6ab87b97", - "reference": "74bfb7be1c8c6102b240f3879b7f984a6ab87b97", + "url": "https://api.github.com/repos/ueberdosis/tiptap-php/zipball/5a2e8155c5b09c9ad4efd480550270a6924865b9", + "reference": "5a2e8155c5b09c9ad4efd480550270a6924865b9", "shasum": "" }, "require": { @@ -9096,7 +8978,7 @@ ], "support": { "issues": "https://github.com/ueberdosis/tiptap-php/issues", - "source": "https://github.com/ueberdosis/tiptap-php/tree/2.1.1" + "source": "https://github.com/ueberdosis/tiptap-php/tree/2.2.0" }, "funding": [ { @@ -9112,27 +8994,27 @@ "type": "open_collective" } ], - "time": "2026-06-12T18:19:46+00:00" + "time": "2026-08-31T07:00:09+00:00" }, { "name": "vlucas/phpdotenv", - "version": "v5.6.4", + "version": "v5.7.0", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "416df702837983f8d5ff48c9c3fee4f5f57b980b" + "reference": "301c07936b16d88628b126b01d082ba153cf4c40" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/416df702837983f8d5ff48c9c3fee4f5f57b980b", - "reference": "416df702837983f8d5ff48c9c3fee4f5f57b980b", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/301c07936b16d88628b126b01d082ba153cf4c40", + "reference": "301c07936b16d88628b126b01d082ba153cf4c40", "shasum": "" }, "require": { "ext-pcre": "*", - "graham-campbell/result-type": "^1.1.4", + "graham-campbell/result-type": "^1.2", "php": "^7.2.5 || ^8.0", - "phpoption/phpoption": "^1.9.5", + "phpoption/phpoption": "^1.10", "symfony/polyfill-ctype": "^1.26", "symfony/polyfill-mbstring": "^1.26", "symfony/polyfill-php80": "^1.26" @@ -9176,7 +9058,7 @@ "homepage": "https://github.com/vlucas" } ], - "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "description": "Loads environment variables from `.env` to `$_ENV` and `$_SERVER` automagically, and optionally to `getenv()`.", "keywords": [ "dotenv", "env", @@ -9184,7 +9066,7 @@ ], "support": { "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.4" + "source": "https://github.com/vlucas/phpdotenv/tree/v5.7.0" }, "funding": [ { @@ -9196,7 +9078,7 @@ "type": "tidelift" } ], - "time": "2026-07-06T19:11:50+00:00" + "time": "2026-08-24T18:07:49+00:00" }, { "name": "voku/portable-ascii", @@ -9274,20 +9156,20 @@ }, { "name": "web-auth/cose-lib", - "version": "4.6.0", + "version": "4.7.1", "source": { "type": "git", "url": "https://github.com/web-auth/cose-lib.git", - "reference": "3afe04df137baf97c5c3e28c5ee6f05536405148" + "reference": "e698b150049141f2f9ec03d2a4d681a2d020ab83" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/web-auth/cose-lib/zipball/3afe04df137baf97c5c3e28c5ee6f05536405148", - "reference": "3afe04df137baf97c5c3e28c5ee6f05536405148", + "url": "https://api.github.com/repos/web-auth/cose-lib/zipball/e698b150049141f2f9ec03d2a4d681a2d020ab83", + "reference": "e698b150049141f2f9ec03d2a4d681a2d020ab83", "shasum": "" }, "require": { - "brick/math": "^0.9|^0.10|^0.11|^0.12|^0.13|^0.14|^0.15|^0.16|^0.17|^0.18", + "brick/math": "^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13 || ^0.14 || ^0.15 || ^0.16 || ^0.17 || ^0.18 || ^0.19 || ^0.20", "ext-json": "*", "ext-openssl": "*", "php": ">=8.1", @@ -9329,7 +9211,7 @@ ], "support": { "issues": "https://github.com/web-auth/cose-lib/issues", - "source": "https://github.com/web-auth/cose-lib/tree/4.6.0" + "source": "https://github.com/web-auth/cose-lib/tree/4.7.1" }, "funding": [ { @@ -9341,20 +9223,20 @@ "type": "patreon" } ], - "time": "2026-07-16T10:19:49+00:00" + "time": "2026-08-30T13:53:57+00:00" }, { "name": "web-auth/webauthn-lib", - "version": "5.3.5", + "version": "5.3.8", "source": { "type": "git", "url": "https://github.com/web-auth/webauthn-lib.git", - "reference": "9e0986d999f4102e24ac8a598d3a80d98b56c19f" + "reference": "85d8ae791c87a34be91a7ff5cdb5606f67dedaab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/web-auth/webauthn-lib/zipball/9e0986d999f4102e24ac8a598d3a80d98b56c19f", - "reference": "9e0986d999f4102e24ac8a598d3a80d98b56c19f", + "url": "https://api.github.com/repos/web-auth/webauthn-lib/zipball/85d8ae791c87a34be91a7ff5cdb5606f67dedaab", + "reference": "85d8ae791c87a34be91a7ff5cdb5606f67dedaab", "shasum": "" }, "require": { @@ -9415,7 +9297,7 @@ "webauthn" ], "support": { - "source": "https://github.com/web-auth/webauthn-lib/tree/5.3.5" + "source": "https://github.com/web-auth/webauthn-lib/tree/5.3.8" }, "funding": [ { @@ -9427,7 +9309,7 @@ "type": "patreon" } ], - "time": "2026-05-31T15:00:08+00:00" + "time": "2026-08-30T14:20:17+00:00" }, { "name": "webmozart/assert", @@ -9720,16 +9602,16 @@ }, { "name": "amphp/dns", - "version": "v2.4.0", + "version": "v2.4.1", "source": { "type": "git", "url": "https://github.com/amphp/dns.git", - "reference": "78eb3db5fc69bf2fc0cb503c4fcba667bc223c71" + "reference": "ec5948bfafac808f410406e18bc7b52a2d4629b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/dns/zipball/78eb3db5fc69bf2fc0cb503c4fcba667bc223c71", - "reference": "78eb3db5fc69bf2fc0cb503c4fcba667bc223c71", + "url": "https://api.github.com/repos/amphp/dns/zipball/ec5948bfafac808f410406e18bc7b52a2d4629b7", + "reference": "ec5948bfafac808f410406e18bc7b52a2d4629b7", "shasum": "" }, "require": { @@ -9748,7 +9630,7 @@ "amphp/php-cs-fixer-config": "^2", "amphp/phpunit-util": "^3", "phpunit/phpunit": "^9", - "psalm/phar": "5.20" + "psalm/phar": "6.16.1" }, "type": "library", "autoload": { @@ -9797,7 +9679,7 @@ ], "support": { "issues": "https://github.com/amphp/dns/issues", - "source": "https://github.com/amphp/dns/tree/v2.4.0" + "source": "https://github.com/amphp/dns/tree/v2.4.1" }, "funding": [ { @@ -9805,7 +9687,7 @@ "type": "github" } ], - "time": "2025-01-19T15:43:40+00:00" + "time": "2026-07-26T17:53:54+00:00" }, { "name": "amphp/hpack", @@ -10405,16 +10287,16 @@ }, { "name": "amphp/socket", - "version": "v2.4.0", + "version": "v2.4.1", "source": { "type": "git", "url": "https://github.com/amphp/socket.git", - "reference": "dadb63c5d3179fd83803e29dfeac27350e619314" + "reference": "b347be5aff6b2cc025208bb4d896607eb470c018" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/socket/zipball/dadb63c5d3179fd83803e29dfeac27350e619314", - "reference": "dadb63c5d3179fd83803e29dfeac27350e619314", + "url": "https://api.github.com/repos/amphp/socket/zipball/b347be5aff6b2cc025208bb4d896607eb470c018", + "reference": "b347be5aff6b2cc025208bb4d896607eb470c018", "shasum": "" }, "require": { @@ -10477,7 +10359,7 @@ ], "support": { "issues": "https://github.com/amphp/socket/issues", - "source": "https://github.com/amphp/socket/tree/v2.4.0" + "source": "https://github.com/amphp/socket/tree/v2.4.1" }, "funding": [ { @@ -10485,7 +10367,7 @@ "type": "github" } ], - "time": "2026-04-19T15:09:56+00:00" + "time": "2026-08-22T18:13:20+00:00" }, { "name": "amphp/sync", @@ -10876,16 +10758,16 @@ }, { "name": "brianium/paratest", - "version": "v7.24.0", + "version": "v7.24.1", "source": { "type": "git", "url": "https://github.com/paratestphp/paratest.git", - "reference": "c63bfd148355e6aeb9e22697bae6c0fee2dfe96c" + "reference": "c29bc43a5cdd0124b7eff959064ae83ea902b49a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paratestphp/paratest/zipball/c63bfd148355e6aeb9e22697bae6c0fee2dfe96c", - "reference": "c63bfd148355e6aeb9e22697bae6c0fee2dfe96c", + "url": "https://api.github.com/repos/paratestphp/paratest/zipball/c29bc43a5cdd0124b7eff959064ae83ea902b49a", + "reference": "c29bc43a5cdd0124b7eff959064ae83ea902b49a", "shasum": "" }, "require": { @@ -10896,10 +10778,10 @@ "fidry/cpu-core-counter": "^1.3.0", "jean85/pretty-package-versions": "^2.1.1", "php": "~8.4.0 || ~8.5.0", - "phpunit/php-code-coverage": "^14.3.0", + "phpunit/php-code-coverage": "^14.3.1", "phpunit/php-file-iterator": "^7", "phpunit/php-timer": "^9", - "phpunit/phpunit": "^13.3.0", + "phpunit/phpunit": "^13.3.1", "sebastian/environment": "^9.3.2", "symfony/console": "^7.4.8 || ^8.1.2", "symfony/process": "^7.4.8 || ^8.1.0" @@ -10953,7 +10835,7 @@ ], "support": { "issues": "https://github.com/paratestphp/paratest/issues", - "source": "https://github.com/paratestphp/paratest/tree/v7.24.0" + "source": "https://github.com/paratestphp/paratest/tree/v7.24.1" }, "funding": [ { @@ -10965,7 +10847,7 @@ "type": "paypal" } ], - "time": "2026-08-07T13:03:48+00:00" + "time": "2026-08-17T06:31:26+00:00" }, { "name": "composer/class-map-generator", @@ -11233,6 +11115,64 @@ }, "time": "2024-04-12T12:12:48+00:00" }, + { + "name": "driftingly/rector-laravel", + "version": "2.6.2", + "source": { + "type": "git", + "url": "https://github.com/driftingly/rector-laravel.git", + "reference": "c0f9a2ff7365cec45d4dc64223608e7cec74604a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/driftingly/rector-laravel/zipball/c0f9a2ff7365cec45d4dc64223608e7cec74604a", + "reference": "c0f9a2ff7365cec45d4dc64223608e7cec74604a", + "shasum": "" + }, + "require": { + "php": ">=8.3", + "rector/rector": "^2.6.4", + "symplify/rule-doc-generator-contracts": "^11.2", + "webmozart/assert": "^1.11 || ^2.0" + }, + "require-dev": { + "boundwize/structarmed": "^0.16", + "nette/utils": "^4.0", + "nikic/php-parser": "^5.6", + "phpstan/extension-installer": "^1.3", + "phpstan/phpstan": "^2.2", + "phpstan/phpstan-deprecation-rules": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpstan/phpstan-webmozart-assert": "^2.0", + "phpunit/phpunit": "^10.5", + "symplify/rule-doc-generator": "^12.2", + "tightenco/duster": "^3.1", + "tracy/tracy": "^2.10" + }, + "type": "rector-extension", + "extra": { + "rector": { + "includes": [ + "config/config.php" + ] + } + }, + "autoload": { + "psr-4": { + "RectorLaravel\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Rector upgrades rules for Laravel Framework", + "support": { + "issues": "https://github.com/driftingly/rector-laravel/issues", + "source": "https://github.com/driftingly/rector-laravel/tree/2.6.2" + }, + "time": "2026-08-29T21:42:57+00:00" + }, { "name": "fakerphp/faker", "version": "v1.24.1", @@ -11644,20 +11584,19 @@ }, { "name": "larastan/larastan", - "version": "v3.10.0", + "version": "v3.11.0", "source": { "type": "git", "url": "https://github.com/larastan/larastan.git", - "reference": "2970f83398154178a739609c244577267c7ee8eb" + "reference": "9baa74074f17cc70feaef31616a06ea0faeebba5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/larastan/larastan/zipball/2970f83398154178a739609c244577267c7ee8eb", - "reference": "2970f83398154178a739609c244577267c7ee8eb", + "url": "https://api.github.com/repos/larastan/larastan/zipball/9baa74074f17cc70feaef31616a06ea0faeebba5", + "reference": "9baa74074f17cc70feaef31616a06ea0faeebba5", "shasum": "" }, "require": { - "ext-json": "*", "iamcal/sql-parser": "^0.7.0", "illuminate/console": "^11.44.2 || ^12.4.1 || ^13", "illuminate/container": "^11.44.2 || ^12.4.1 || ^13", @@ -11667,7 +11606,7 @@ "illuminate/pipeline": "^11.44.2 || ^12.4.1 || ^13", "illuminate/support": "^11.44.2 || ^12.4.1 || ^13", "php": "^8.2", - "phpstan/phpstan": "^2.2.0" + "phpstan/phpstan": "^2.2.2" }, "require-dev": { "doctrine/coding-standard": "^14", @@ -11677,7 +11616,7 @@ "orchestra/canvas": "^v9.2.2 || ^10.0.1 || ^11", "orchestra/testbench-core": "^9.12.0 || ^10.1 || ^11", "phpstan/phpstan-deprecation-rules": "^2.0.1", - "phpunit/phpunit": "^10.5.35 || ^11.5.15 || ^12.5.8 || ^13.1.8" + "phpunit/phpunit": "^10.5.35 || ^11.5.15 || ^12.5.8 || ^13.3.0" }, "suggest": { "orchestra/testbench": "Using Larastan for analysing a package needs Testbench", @@ -11722,7 +11661,7 @@ ], "support": { "issues": "https://github.com/larastan/larastan/issues", - "source": "https://github.com/larastan/larastan/tree/v3.10.0" + "source": "https://github.com/larastan/larastan/tree/v3.11.0" }, "funding": [ { @@ -11730,7 +11669,7 @@ "type": "github" } ], - "time": "2026-05-28T08:00:58+00:00" + "time": "2026-09-01T16:35:48+00:00" }, { "name": "laravel/agent-detector", @@ -11796,16 +11735,16 @@ }, { "name": "laravel/boost", - "version": "v2.5.5", + "version": "v2.7.0", "source": { "type": "git", "url": "https://github.com/laravel/boost.git", - "reference": "a6c798975a893d3c0a609ebc6ed37a007ecbedec" + "reference": "b19e98a8637cb69b2aab7b5b6c5fe9e2c79d182f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/boost/zipball/a6c798975a893d3c0a609ebc6ed37a007ecbedec", - "reference": "a6c798975a893d3c0a609ebc6ed37a007ecbedec", + "url": "https://api.github.com/repos/laravel/boost/zipball/b19e98a8637cb69b2aab7b5b6c5fe9e2c79d182f", + "reference": "b19e98a8637cb69b2aab7b5b6c5fe9e2c79d182f", "shasum": "" }, "require": { @@ -11858,7 +11797,7 @@ "issues": "https://github.com/laravel/boost/issues", "source": "https://github.com/laravel/boost" }, - "time": "2026-08-19T02:26:00+00:00" + "time": "2026-08-26T21:39:22+00:00" }, { "name": "laravel/mcp", @@ -12231,69 +12170,6 @@ }, "time": "2026-07-18T17:53:15+00:00" }, - { - "name": "laravel/sail", - "version": "v1.67.0", - "source": { - "type": "git", - "url": "https://github.com/laravel/sail.git", - "reference": "639e03ac12cf23def171770bcab05758045b2642" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel/sail/zipball/639e03ac12cf23def171770bcab05758045b2642", - "reference": "639e03ac12cf23def171770bcab05758045b2642", - "shasum": "" - }, - "require": { - "illuminate/console": "^9.52.16|^10.0|^11.0|^12.0|^13.0", - "illuminate/contracts": "^9.52.16|^10.0|^11.0|^12.0|^13.0", - "illuminate/support": "^9.52.16|^10.0|^11.0|^12.0|^13.0", - "php": "^8.0", - "symfony/console": "^6.0|^7.0|^8.0", - "symfony/yaml": "^6.0|^7.0|^8.0" - }, - "require-dev": { - "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0|^11.0", - "phpstan/phpstan": "^2.0" - }, - "bin": [ - "bin/sail" - ], - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Laravel\\Sail\\SailServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Laravel\\Sail\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "Docker files for running a basic Laravel application.", - "keywords": [ - "docker", - "laravel" - ], - "support": { - "issues": "https://github.com/laravel/sail/issues", - "source": "https://github.com/laravel/sail" - }, - "time": "2026-08-12T13:55:56+00:00" - }, { "name": "league/uri-components", "version": "7.8.1", @@ -12618,20 +12494,20 @@ }, { "name": "pestphp/pest", - "version": "v5.1.1", + "version": "v5.1.3", "source": { "type": "git", "url": "https://github.com/pestphp/pest.git", - "reference": "208f447a10fc416397edf00a5fc6380aa284d393" + "reference": "20a5aacaca4fce9116922f42d2942b3f9f5bbfc6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest/zipball/208f447a10fc416397edf00a5fc6380aa284d393", - "reference": "208f447a10fc416397edf00a5fc6380aa284d393", + "url": "https://api.github.com/repos/pestphp/pest/zipball/20a5aacaca4fce9116922f42d2942b3f9f5bbfc6", + "reference": "20a5aacaca4fce9116922f42d2942b3f9f5bbfc6", "shasum": "" }, "require": { - "brianium/paratest": "^7.24.0", + "brianium/paratest": "^7.24.1", "nunomaduro/collision": "^8.9.5", "nunomaduro/termwind": "^2.4.0", "pestphp/pest-plugin": "^5.0.0", @@ -12639,20 +12515,21 @@ "pestphp/pest-plugin-mutate": "^5.0.2", "pestphp/pest-plugin-profanity": "^5.0.0", "php": "^8.4", - "phpunit/phpunit": "^13.3.0", - "symfony/process": "^8.1.0" + "phpunit/phpunit": "^13.3.1", + "symfony/process": "^8.1.5" }, "conflict": { "filp/whoops": "<2.18.3", - "phpunit/phpunit": ">13.3.0", + "laravel/boost": "<2.6.0", + "phpunit/phpunit": ">13.3.1", "sebastian/exporter": "<7.0.0", "webmozart/assert": "<1.11.0" }, "require-dev": { "pestphp/pest-dev-tools": "^5.0.0", "pestphp/pest-plugin-browser": "^5.0.1", - "pestphp/pest-plugin-phpstan": "^5.0.2", - "pestphp/pest-plugin-rector": "^5.0.3", + "pestphp/pest-plugin-phpstan": "^5.2.0", + "pestphp/pest-plugin-rector": "^5.0.4", "pestphp/pest-plugin-type-coverage": "^5.0.2", "psy/psysh": "^0.12.24" }, @@ -12721,7 +12598,7 @@ ], "support": { "issues": "https://github.com/pestphp/pest/issues", - "source": "https://github.com/pestphp/pest/tree/v5.1.1" + "source": "https://github.com/pestphp/pest/tree/v5.1.3" }, "funding": [ { @@ -12733,7 +12610,7 @@ "type": "github" } ], - "time": "2026-08-12T14:29:21+00:00" + "time": "2026-08-25T18:15:02+00:00" }, { "name": "pestphp/pest-plugin", @@ -13119,6 +12996,97 @@ ], "time": "2026-08-10T11:01:27+00:00" }, + { + "name": "pestphp/pest-plugin-phpstan", + "version": "v5.2.0", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-phpstan.git", + "reference": "2ae56517be5acd06757fdb6f024ed99ca1a14617" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-phpstan/zipball/2ae56517be5acd06757fdb6f024ed99ca1a14617", + "reference": "2ae56517be5acd06757fdb6f024ed99ca1a14617", + "shasum": "" + }, + "require": { + "pestphp/pest": "^5.0.0", + "php": "^8.4", + "phpstan/phpstan": "^2.2.5" + }, + "conflict": { + "pestphp/pest": "<5.0.0" + }, + "require-dev": { + "laravel/pao": "^1.1.2", + "laravel/pint": "^1.29.3", + "pestphp/pest-plugin-rector": "^5.0", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan-strict-rules": "^2.0.12", + "rector/rector": "^2.5.7" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Pest\\PHPStan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Punyapal Shah", + "email": "mrpunyapal@gmail.com" + }, + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "PHPStan plugin for Pest", + "keywords": [ + "PHPStan", + "framework", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin-phpstan/tree/v5.2.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", + "type": "custom" + }, + { + "url": "https://github.com/mrpunyapal", + "type": "github" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2026-08-23T17:26:23+00:00" + }, { "name": "pestphp/pest-plugin-profanity", "version": "v5.0.0", @@ -13178,6 +13146,90 @@ }, "time": "2026-07-21T07:48:56+00:00" }, + { + "name": "pestphp/pest-plugin-rector", + "version": "v5.0.4", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-rector.git", + "reference": "d881f0ab8d4392f4a127c2f0aa8230529f856fc5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-rector/zipball/d881f0ab8d4392f4a127c2f0aa8230529f856fc5", + "reference": "d881f0ab8d4392f4a127c2f0aa8230529f856fc5", + "shasum": "" + }, + "require": { + "php": "^8.4", + "rector/rector": "^2.6.1", + "symplify/rule-doc-generator-contracts": "^11.2" + }, + "conflict": { + "pestphp/pest": "<5.0.0" + }, + "require-dev": { + "laravel/pao": "^1.1.3", + "laravel/pint": "^1.30.3", + "pestphp/pest": "^5.0.3", + "pestphp/pest-plugin-phpstan": "^5.0", + "phpstan/phpstan": "^2.2.7", + "symplify/rule-doc-generator": "^12.2.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Pest\\Rector\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Punyapal Shah", + "email": "mrpunyapal@gmail.com" + }, + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Rector plugin for Pest", + "keywords": [ + "framework", + "pest", + "php", + "plugin", + "rector", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin-rector/tree/v5.0.4" + }, + "funding": [ + { + "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", + "type": "custom" + }, + { + "url": "https://github.com/mrpunyapal", + "type": "github" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2026-08-21T10:26:03+00:00" + }, { "name": "phar-io/manifest", "version": "2.0.4", @@ -13298,11 +13350,11 @@ }, { "name": "phpstan/phpstan", - "version": "2.2.8", + "version": "2.2.13", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e285254e60f33c21902efef4a926ca0987c06804", - "reference": "e285254e60f33c21902efef4a926ca0987c06804", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9ba9ac76ee9c5cf5b56d58eb5deec6315b7a0260", + "reference": "9ba9ac76ee9c5cf5b56d58eb5deec6315b7a0260", "shasum": "" }, "require": { @@ -13358,20 +13410,20 @@ "type": "github" } ], - "time": "2026-08-04T22:21:45+00:00" + "time": "2026-09-03T20:38:19+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "14.3.1", + "version": "14.3.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "6ce313bb110384148d1dc7695a99175f59529069" + "reference": "93d62632fb675b76c9b941fdcfcfa10ffb9dea75" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6ce313bb110384148d1dc7695a99175f59529069", - "reference": "6ce313bb110384148d1dc7695a99175f59529069", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/93d62632fb675b76c9b941fdcfcfa10ffb9dea75", + "reference": "93d62632fb675b76c9b941fdcfcfa10ffb9dea75", "shasum": "" }, "require": { @@ -13390,7 +13442,7 @@ "theseer/tokenizer": "^2.0.1" }, "require-dev": { - "phpunit/phpunit": "^13.3.1" + "phpunit/phpunit": "^13.3.2" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -13428,7 +13480,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/14.3.1" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/14.3.2" }, "funding": [ { @@ -13448,27 +13500,27 @@ "type": "tidelift" } ], - "time": "2026-08-16T05:23:47+00:00" + "time": "2026-09-04T03:46:43+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "7.0.1", + "version": "7.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "3ccaa29123548190af12fee7af078dcd7f3ddfab" + "reference": "9bb4e6c58b62c1e043be995c66abec7c97307aae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3ccaa29123548190af12fee7af078dcd7f3ddfab", - "reference": "3ccaa29123548190af12fee7af078dcd7f3ddfab", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/9bb4e6c58b62c1e043be995c66abec7c97307aae", + "reference": "9bb4e6c58b62c1e043be995c66abec7c97307aae", "shasum": "" }, "require": { "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^13.3.0" + "phpunit/phpunit": "^13.3.1" }, "type": "library", "extra": { @@ -13501,7 +13553,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/7.0.1" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/7.0.2" }, "funding": [ { @@ -13521,7 +13573,7 @@ "type": "tidelift" } ], - "time": "2026-08-10T06:43:12+00:00" + "time": "2026-08-25T14:47:43+00:00" }, { "name": "phpunit/php-invoker", @@ -13745,16 +13797,16 @@ }, { "name": "phpunit/phpunit", - "version": "13.3.0", + "version": "13.3.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "346fcba6ce7ab89bb1b0675feac6bc29c0f7711b" + "reference": "fc024931d6ad047404e9d86536735923fe63a06b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/346fcba6ce7ab89bb1b0675feac6bc29c0f7711b", - "reference": "346fcba6ce7ab89bb1b0675feac6bc29c0f7711b", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/fc024931d6ad047404e9d86536735923fe63a06b", + "reference": "fc024931d6ad047404e9d86536735923fe63a06b", "shasum": "" }, "require": { @@ -13764,12 +13816,12 @@ "ext-libxml": "*", "ext-mbstring": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.13.4", + "myclabs/deep-copy": "^1.14.0", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.4.1", "phpunit/php-code-coverage": "^14.3", - "phpunit/php-file-iterator": "^7.0.0", + "phpunit/php-file-iterator": "^7.0.1", "phpunit/php-invoker": "^7.0.0", "phpunit/php-text-template": "^6.0.0", "phpunit/php-timer": "^9.0.0", @@ -13781,9 +13833,9 @@ "sebastian/file-filter": "^1.0", "sebastian/git-state": "^1.0", "sebastian/global-state": "^9.0.1", - "sebastian/object-enumerator": "^8.0.0", + "sebastian/object-enumerator": "^8.1.0", "sebastian/recursion-context": "^8.0.1", - "sebastian/type": "^7.0.1", + "sebastian/type": "^7.0.2", "sebastian/version": "^7.0.0", "staabm/side-effects-detector": "^1.0.5" }, @@ -13825,7 +13877,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/13.3.0" + "source": "https://github.com/sebastianbergmann/phpunit/tree/13.3.1" }, "funding": [ { @@ -13833,7 +13885,64 @@ "type": "other" } ], - "time": "2026-08-07T07:37:01+00:00" + "time": "2026-08-13T13:14:23+00:00" + }, + { + "name": "rector/rector", + "version": "2.6.6", + "source": { + "type": "git", + "url": "https://github.com/rectorphp/rector.git", + "reference": "ca069d6c79feaa6651b423c15d101a27a436093e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/ca069d6c79feaa6651b423c15d101a27a436093e", + "reference": "ca069d6c79feaa6651b423c15d101a27a436093e", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "phpstan/phpstan": "^2.2.10" + }, + "conflict": { + "rector/rector-doctrine": "*", + "rector/rector-downgrade-php": "*", + "rector/rector-phpunit": "*", + "rector/rector-symfony": "*" + }, + "bin": [ + "bin/rector" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Instant Upgrade and Automated Refactoring of any PHP code", + "homepage": "https://getrector.com/", + "keywords": [ + "automation", + "dev", + "migration", + "refactoring" + ], + "support": { + "issues": "https://github.com/rectorphp/rector/issues", + "source": "https://github.com/rectorphp/rector/tree/2.6.6" + }, + "funding": [ + { + "url": "https://github.com/tomasvotruba", + "type": "github" + } + ], + "time": "2026-09-02T09:38:46+00:00" }, { "name": "revolt/event-loop", @@ -14140,24 +14249,24 @@ }, { "name": "sebastian/diff", - "version": "9.0.0", + "version": "9.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "a3fb6a298a265ff487a91bbea46e03cd01dbb226" + "reference": "a2df6626c1baf31d5a88674882a3072f151b5a26" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/a3fb6a298a265ff487a91bbea46e03cd01dbb226", - "reference": "a3fb6a298a265ff487a91bbea46e03cd01dbb226", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/a2df6626c1baf31d5a88674882a3072f151b5a26", + "reference": "a2df6626c1baf31d5a88674882a3072f151b5a26", "shasum": "" }, "require": { "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^13.2", - "symfony/process": "^7.4.13" + "phpunit/phpunit": "^13.3.1", + "symfony/process": "^7.4.17" }, "type": "library", "extra": { @@ -14195,7 +14304,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/9.0.0" + "source": "https://github.com/sebastianbergmann/diff/tree/9.0.1" }, "funding": [ { @@ -14215,7 +14324,7 @@ "type": "tidelift" } ], - "time": "2026-06-05T03:04:51+00:00" + "time": "2026-08-25T15:38:55+00:00" }, { "name": "sebastian/environment", @@ -15067,16 +15176,16 @@ }, { "name": "symfony/yaml", - "version": "v8.1.2", + "version": "v8.1.6", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "faabdbe998e8c5c599dceffa27aa265b185c0736" + "reference": "0b4aa53a67f9fece88c665f1a1dadcfd25d93fe5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/faabdbe998e8c5c599dceffa27aa265b185c0736", - "reference": "faabdbe998e8c5c599dceffa27aa265b185c0736", + "url": "https://api.github.com/repos/symfony/yaml/zipball/0b4aa53a67f9fece88c665f1a1dadcfd25d93fe5", + "reference": "0b4aa53a67f9fece88c665f1a1dadcfd25d93fe5", "shasum": "" }, "require": { @@ -15119,7 +15228,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v8.1.2" + "source": "https://github.com/symfony/yaml/tree/v8.1.6" }, "funding": [ { @@ -15139,7 +15248,66 @@ "type": "tidelift" } ], - "time": "2026-07-22T15:42:13+00:00" + "time": "2026-08-30T01:03:44+00:00" + }, + { + "name": "symplify/rule-doc-generator-contracts", + "version": "11.2.0", + "source": { + "type": "git", + "url": "https://github.com/symplify/rule-doc-generator-contracts.git", + "reference": "479cfcfd46047f80624aba931d9789e50475b5c6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symplify/rule-doc-generator-contracts/zipball/479cfcfd46047f80624aba931d9789e50475b5c6", + "reference": "479cfcfd46047f80624aba931d9789e50475b5c6", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpstan/extension-installer": "^1.2", + "rector/rector": "^0.15.10", + "symplify/easy-ci": "^11.1", + "symplify/easy-coding-standard": "^11.1", + "symplify/easy-testing": "^11.1", + "symplify/phpstan-extensions": "^11.1", + "symplify/phpstan-rules": "11.2.3.72", + "tomasvotruba/unused-public": "^0.0.34" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "11.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symplify\\RuleDocGenerator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Contracts for production code of RuleDocGenerator", + "support": { + "source": "https://github.com/symplify/rule-doc-generator-contracts/tree/11.2.0" + }, + "funding": [ + { + "url": "https://www.paypal.me/rectorphp", + "type": "custom" + }, + { + "url": "https://github.com/tomasvotruba", + "type": "github" + } + ], + "time": "2024-03-18T22:02:54+00:00" }, { "name": "ta-tikoma/phpunit-architecture-test", diff --git a/package-lock.json b/package-lock.json index 588d535..8ee08b4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,34 +5,33 @@ "packages": { "": { "dependencies": { + "@fontsource-variable/instrument-sans": "^5.3.0", "@inertiajs/react": "^3.7.0", - "@inertiajs/vite": "^3.7.0", "@laravel/echo-react": "^2.4.0", "@laravel/passkeys": "^0.4.0", - "@lattice-php/core": "^0.59.0", - "@lattice-php/lattice": "^0.59.0", - "@lattice-php/ui": "^0.59.0", - "@tailwindcss/vite": "^4.3.3", - "@types/react": "^19.2.18", - "@types/react-dom": "^19.2.4", - "@vitejs/plugin-react": "^6.0.5", - "concurrently": "^10.0.5", - "laravel-echo": "^2.4.0", - "laravel-vite-plugin": "^3.2.0", + "@lattice-php/core": "^0.72.2", + "@lattice-php/form": "^0.72.2", + "@lattice-php/lattice": "^0.72.2", + "@lattice-php/ui": "^0.72.2", "pusher-js": "^8.6.0", "react": "^19.2.8", - "react-dom": "^19.2.8", - "tailwindcss": "^4.3.3", - "typescript": "^6.0.3", - "vite": "^8.2.1" + "react-dom": "^19.2.8" }, "devDependencies": { - "@laravel/vite-plugin-wayfinder": "^0.1.3", - "@types/node": "^24.13.3", + "@inertiajs/vite": "^3.7.0", + "@tailwindcss/vite": "^4.3.3", + "@types/node": "^26.4.1", + "@types/react": "^19.2.18", + "@types/react-dom": "^19.2.7", + "@vitejs/plugin-react": "^6.1.1", "babel-plugin-react-compiler": "^1.0.0", - "oxfmt": "^0.64.0", - "oxlint": "^1.79.0", - "playwright": "^1.62.1" + "laravel-vite-plugin": "^3.2.0", + "oxfmt": "^0.66.0", + "oxlint": "^1.81.0", + "playwright": "^1.62.1", + "tailwindcss": "^4.3.3", + "typescript": "^7.0.2", + "vite": "^8.2.2" } }, "node_modules/@atlaskit/pragmatic-drag-and-drop": { @@ -47,29 +46,51 @@ } }, "node_modules/@atlaskit/pragmatic-drag-and-drop-auto-scroll": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@atlaskit/pragmatic-drag-and-drop-auto-scroll/-/pragmatic-drag-and-drop-auto-scroll-3.0.0.tgz", - "integrity": "sha512-8TlkMi417zIPrTnCpbNV0Ce63JTKBn3dGkqiadkGQROvzDAox7Y9TYRHpvbQiEdtPoHWnmyRBi+RsGDxXsQxgQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@atlaskit/pragmatic-drag-and-drop-auto-scroll/-/pragmatic-drag-and-drop-auto-scroll-3.2.0.tgz", + "integrity": "sha512-vuL+AJae6c6lkmFd63v7c/7J7seyi7ZA8uMLNe9GvvApySToun3Zlv8SfyZU0d+wcNG4+Ix6qpRb8jOobZgNNg==", "license": "Apache-2.0", "dependencies": { - "@atlaskit/pragmatic-drag-and-drop": "^2.0.0", + "@atlaskit/pragmatic-drag-and-drop": "^3.1.0", "@babel/runtime": "^7.0.0" } }, + "node_modules/@atlaskit/pragmatic-drag-and-drop-auto-scroll/node_modules/@atlaskit/pragmatic-drag-and-drop": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@atlaskit/pragmatic-drag-and-drop/-/pragmatic-drag-and-drop-3.1.0.tgz", + "integrity": "sha512-VU+2Oh6OgvC6D1xiX3lfm1gZJsaSPD+ZKjAHodOQ9IO6RfOvAyReLlK5ut9gIUpPmbD8d09wlCs7y4A6/I8c5Q==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.0.0", + "bind-event-listener": "^3.0.0", + "raf-schd": "^4.0.3" + } + }, "node_modules/@atlaskit/pragmatic-drag-and-drop-hitbox": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@atlaskit/pragmatic-drag-and-drop-hitbox/-/pragmatic-drag-and-drop-hitbox-2.0.0.tgz", - "integrity": "sha512-vkXCB/23pT8YgYU8biGmR9uu0fr9oWoaq2GMSKyiNPk3reA12XVrCdgB2SLBoB24Ic1FOm9PdaQJ9ZSUQdCVpw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@atlaskit/pragmatic-drag-and-drop-hitbox/-/pragmatic-drag-and-drop-hitbox-2.2.0.tgz", + "integrity": "sha512-L0Wq4EKc9Yx+iywci3NLhwjsaru+hyZ9C/H7mz5pvrSh7vpp9q2YabRr85OnCLaY6equ5pxGVyI4PF3HP69ZMw==", "license": "Apache-2.0", "dependencies": { - "@atlaskit/pragmatic-drag-and-drop": "^2.0.0", + "@atlaskit/pragmatic-drag-and-drop": "^3.1.0", "@babel/runtime": "^7.0.0" } }, + "node_modules/@atlaskit/pragmatic-drag-and-drop-hitbox/node_modules/@atlaskit/pragmatic-drag-and-drop": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@atlaskit/pragmatic-drag-and-drop/-/pragmatic-drag-and-drop-3.1.0.tgz", + "integrity": "sha512-VU+2Oh6OgvC6D1xiX3lfm1gZJsaSPD+ZKjAHodOQ9IO6RfOvAyReLlK5ut9gIUpPmbD8d09wlCs7y4A6/I8c5Q==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.0.0", + "bind-event-listener": "^3.0.0", + "raf-schd": "^4.0.3" + } + }, "node_modules/@atlaskit/pragmatic-drag-and-drop-live-region": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@atlaskit/pragmatic-drag-and-drop-live-region/-/pragmatic-drag-and-drop-live-region-2.0.0.tgz", - "integrity": "sha512-GrlZdZQSw4yegSrU8EDcaO6IBDEAYbSMgv3tTTfkbdmOjpEnwXmNGHe7CiA3GR9LgUNiKpERR9tlfa+viXIGvA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@atlaskit/pragmatic-drag-and-drop-live-region/-/pragmatic-drag-and-drop-live-region-2.1.0.tgz", + "integrity": "sha512-7THqnYhsSQnVqyVBCdMvdjWTjE3bUd5WKqs8g2SVv6UgJTIKunVmCH5lg6oySmqGGyVtHyOf7aXgpVpgUS9kbg==", "license": "Apache-2.0", "dependencies": { "@babel/runtime": "^7.0.0" @@ -79,7 +100,7 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -89,7 +110,7 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -105,10 +126,10 @@ } }, "node_modules/@babel/types": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", - "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", - "devOptional": true, + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.29.7", @@ -213,9 +234,9 @@ } }, "node_modules/@codemirror/legacy-modes": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/@codemirror/legacy-modes/-/legacy-modes-6.5.3.tgz", - "integrity": "sha512-xCsmIzH78MyWkib9jlPaaun57XNkfbMIhagfaZVd0iLTqlpw3jXaIcbZm72MTmmn64eTZpBVNjbyYh+QXnxRsg==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/@codemirror/legacy-modes/-/legacy-modes-6.5.4.tgz", + "integrity": "sha512-/cZr6qZyl08iYNLGsJ862CXXNI51LryRFRE40ejgoIjXZz0C1rGkD3/Ek5jM/8w1ceRjqtt4qx/KLMh4zBTgew==", "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0" @@ -233,18 +254,18 @@ } }, "node_modules/@codemirror/state": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.7.1.tgz", - "integrity": "sha512-9QzNDgE4EYDnAHfrTlR2lwiPciiOymLtwKK+8yHQzCc7GXhAP9xdEbEJFy2IWB1j9UGUl9BsgMmTo/ImA02T7A==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.7.4.tgz", + "integrity": "sha512-QhQIVRY+xHZDxwOSFrJ1eUMapJBUID3IdeAjf7dHO7zBUzSkyooHiodnalz5MG3iHzwixKMlAAyn7244y537EA==", "license": "MIT", "dependencies": { "@marijn/find-cluster-break": "^1.0.0" } }, "node_modules/@codemirror/view": { - "version": "6.43.9", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.9.tgz", - "integrity": "sha512-sTuUzTpPMFebRhg6dawChoKKgndIwfjmJgKVxBefPElcU2NwQ6AFroupk0SFqEerQyZOGRfDNnSN8Dw/lMAsXw==", + "version": "6.43.11", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.11.tgz", + "integrity": "sha512-2+esucbQX6wB2JYi1eDvdCPFTA31BN8oSy6xCmk3G6CloV11yOvEjYk+gH7kLrP0MuHG94E8WDhjs5oMiu3+Wg==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.7.0", @@ -292,6 +313,15 @@ "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", "license": "MIT" }, + "node_modules/@fontsource-variable/instrument-sans": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@fontsource-variable/instrument-sans/-/instrument-sans-5.3.0.tgz", + "integrity": "sha512-u4gKbDBTNFGkg997tfQn3eHOhHuquWUFTRT/rwzuKtrxX5P2ekfs2x+LgBPP4P32+cC+vUwF1Cr+IdRoPQbrGw==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, "node_modules/@inertiajs/core": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/@inertiajs/core/-/core-3.7.0.tgz", @@ -332,6 +362,7 @@ "version": "3.7.0", "resolved": "https://registry.npmjs.org/@inertiajs/vite/-/vite-3.7.0.tgz", "integrity": "sha512-eoOqvIEgmsktC/b5NuZjsj3VvCJ7GsbvHFN2IgT/7DXjLVdXGygWeyYHmS57AGSbb6yOyebeBR6cYkk6YyHOmg==", + "dev": true, "license": "MIT", "dependencies": { "@inertiajs/core": "3.7.0", @@ -355,6 +386,7 @@ "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", @@ -365,6 +397,7 @@ "version": "2.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -381,9 +414,9 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { @@ -447,21 +480,14 @@ } } }, - "node_modules/@laravel/vite-plugin-wayfinder": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@laravel/vite-plugin-wayfinder/-/vite-plugin-wayfinder-0.1.7.tgz", - "integrity": "sha512-yZYIr1iwuCQ7LFI+GsJk9vacw1HWMp3ZlDlW0pdfz3zXyKeu4US7oH79KmQQ031L0cYaSyaUMo/Ha1D4BosKqw==", - "dev": true, - "license": "MIT" - }, "node_modules/@lattice-php/action": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/@lattice-php/action/-/action-0.59.0.tgz", - "integrity": "sha512-SSIPqjDJQu3XGHVpw9xaQ/XGIeTuBU6piSKsqRdBrA6p+tWIi6GvBrB/E3hrvM49h3eJ1TDeBMKnAAoWu4xm7g==", + "version": "0.72.2", + "resolved": "https://registry.npmjs.org/@lattice-php/action/-/action-0.72.2.tgz", + "integrity": "sha512-sCNTg/EhGcqT9hlEC4TjKCm+CugmEwLw7KRToF3XRV/HBHGP7AKDvJefpjtJfeFIc7xduneuAxYLriBkZze4qw==", "dependencies": { - "@lattice-php/core": "0.59.0", - "@lattice-php/form": "0.59.0", - "@lattice-php/ui": "0.59.0" + "@lattice-php/core": "0.72.2", + "@lattice-php/form": "0.72.2", + "@lattice-php/ui": "0.72.2" }, "peerDependencies": { "@inertiajs/core": "^3.0.0", @@ -471,24 +497,26 @@ } }, "node_modules/@lattice-php/core": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/@lattice-php/core/-/core-0.59.0.tgz", - "integrity": "sha512-PnCa0fAdm5yUpfeXgtl+jCRpx/CwtQ8e3U8Q3I6+5gvXkSMNgOYUNSeDHG9lPabBqa1nSzJ/qKU2OU5yAZvn7g==", + "version": "0.72.2", + "resolved": "https://registry.npmjs.org/@lattice-php/core/-/core-0.72.2.tgz", + "integrity": "sha512-xNKEQ2I2xQhIKbl70tC0NR5U8ABSM90j8cfyr/8bfhu0nq7qI0j8PO3UZiRpTESKAFMhr2JJegDdcZIisPo7jg==", "peerDependencies": { "react": "^19.0.0" } }, "node_modules/@lattice-php/form": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/@lattice-php/form/-/form-0.59.0.tgz", - "integrity": "sha512-SUxPqgeIcjsUmPG5zPgJXfIO0BnGlINchFnm6MiNXjcW0yg2EHa7nUGSMxa5IggqOhkcHkeU7NGqvYBCrqw9Iw==", + "version": "0.72.2", + "resolved": "https://registry.npmjs.org/@lattice-php/form/-/form-0.72.2.tgz", + "integrity": "sha512-+3SsoJuq9MbOLze4tN7HZizziRF2USrvbqytwz0nH5BWAjeLyQCeUrgUrmGOPF2ngYaFohUwCLuQ5ucf9sgBKg==", "dependencies": { + "@floating-ui/dom": "^1.6.0", "@internationalized/date": "3.12.3", - "@lattice-php/core": "0.59.0", - "@lattice-php/ui": "0.59.0", + "@lattice-php/core": "0.72.2", + "@lattice-php/ui": "0.72.2", "@tiptap/core": "^3.30.0", "@tiptap/extension-details": "^3.30.0", "@tiptap/extension-document": "^3.30.0", + "@tiptap/extension-floating-menu": "^3.30.0", "@tiptap/extension-highlight": "^3.30.0", "@tiptap/extension-paragraph": "^3.30.0", "@tiptap/extension-table": "^3.30.0", @@ -497,6 +525,7 @@ "@tiptap/extensions": "^3.30.0", "@tiptap/react": "^3.30.0", "@tiptap/starter-kit": "^3.30.0", + "@tiptap/suggestion": "^3.30.0", "@zag-js/date-picker": "^1.43.0", "@zag-js/react": "^1.43.0" }, @@ -516,22 +545,21 @@ } }, "node_modules/@lattice-php/lattice": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/@lattice-php/lattice/-/lattice-0.59.0.tgz", - "integrity": "sha512-sNYzZt0k9zlXIRdSzwdJtP+oIXN8Mdzxpiht9wxAs3LCwrZhiOwVXsqnZzYTFcJtmbs5FP62OP9SiaGo6hmldw==", + "version": "0.72.2", + "resolved": "https://registry.npmjs.org/@lattice-php/lattice/-/lattice-0.72.2.tgz", + "integrity": "sha512-7YW+wcu0r2mzfdMnSTCA1Z2bCbHSeOqp9De6N3/LmRnrEsfCawnsf9rqEPUwkjm7RzqrKnpd4MLUlFlpoCoOSA==", "license": "MIT", "dependencies": { "@atlaskit/pragmatic-drag-and-drop": "^2.0.2", "@atlaskit/pragmatic-drag-and-drop-auto-scroll": "^3.0.0", "@atlaskit/pragmatic-drag-and-drop-hitbox": "^2.0.0", "@atlaskit/pragmatic-drag-and-drop-live-region": "^2.0.0", - "@lattice-php/action": "0.59.0", - "@lattice-php/core": "0.59.0", - "@lattice-php/form": "0.59.0", - "@lattice-php/table": "0.59.0", - "@lattice-php/ui": "0.59.0", - "@lattice-php/vite-svg-sprite": "^0.3.0", - "@radix-ui/react-toast": "^1.2.23" + "@lattice-php/action": "0.72.2", + "@lattice-php/core": "0.72.2", + "@lattice-php/form": "0.72.2", + "@lattice-php/table": "0.72.2", + "@lattice-php/ui": "0.72.2", + "@lattice-php/vite-svg-sprite": "^0.3.0" }, "peerDependencies": { "@inertiajs/core": "^3.0.0", @@ -555,13 +583,13 @@ } }, "node_modules/@lattice-php/table": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/@lattice-php/table/-/table-0.59.0.tgz", - "integrity": "sha512-jcjbbn5t3YNpJJdxZLWDlUNY7EOvCrtf4zij9QjyOH1Ynd2jxJ8NYMp5IEO4Vwg8Hhy2wrk4PELgIwV2S+/lxw==", + "version": "0.72.2", + "resolved": "https://registry.npmjs.org/@lattice-php/table/-/table-0.72.2.tgz", + "integrity": "sha512-vKxkwAn4XoBlOdoTfNJ9KDEgPVCdFKG9qAWBIpXJKcWoPa+n1Is6Ito6a7DaizC67DW0MB8/2mIHRXksBDrhkg==", "dependencies": { - "@lattice-php/core": "0.59.0", - "@lattice-php/form": "0.59.0", - "@lattice-php/ui": "0.59.0" + "@lattice-php/core": "0.72.2", + "@lattice-php/form": "0.72.2", + "@lattice-php/ui": "0.72.2" }, "peerDependencies": { "@inertiajs/core": "^3.0.0", @@ -571,9 +599,9 @@ } }, "node_modules/@lattice-php/ui": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/@lattice-php/ui/-/ui-0.59.0.tgz", - "integrity": "sha512-hufkIPGvGCx1vLYpBUjqvgFrRwSGSyu7/+EuBxknMGwShKc1a1n5nCBtd1bPKKV/9g/g3UFzuSMojdbEJJYAbw==", + "version": "0.72.2", + "resolved": "https://registry.npmjs.org/@lattice-php/ui/-/ui-0.72.2.tgz", + "integrity": "sha512-FWqN6FEiP9gcYqf/GWQNCeukT85q6UvpU9sYiWyXuj+a1efo4Dvxd5yegputqQUKEoXsJsr9DPss4kOut44LVg==", "dependencies": { "@codemirror/lang-javascript": "^6.2.5", "@codemirror/lang-json": "^6.0.2", @@ -583,13 +611,14 @@ "@codemirror/state": "^6.7.1", "@codemirror/view": "^6.43.8", "@internationalized/date": "3.12.3", - "@lattice-php/core": "0.59.0", + "@lattice-php/core": "0.72.2", "@lezer/highlight": "^1.2.3", "@radix-ui/react-checkbox": "^1.3.11", "@radix-ui/react-dialog": "^1.1.23", "@radix-ui/react-label": "^2.1.15", "@radix-ui/react-popover": "^1.1.23", "@radix-ui/react-slot": "^1.3.3", + "@radix-ui/react-toast": "^1.2.23", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "i18next": "^26.3.6", @@ -685,9 +714,9 @@ } }, "node_modules/@lezer/php": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@lezer/php/-/php-1.0.5.tgz", - "integrity": "sha512-W7asp9DhM6q0W6DYNwIkLSKOvxlXRrif+UXBMxzsJUuqmhE7oVU+gS3THO4S/Puh7Xzgm858UNaFi6dxTP8dJA==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@lezer/php/-/php-1.0.6.tgz", + "integrity": "sha512-QJ2xNXPmsm/Z3IpThq8fnJrEIVpxhsIoj6GZBW0JYEd/l9zxpJZW216X4fzqQY4vgpdGIumypvI4uQjd4tnYtw==", "license": "MIT", "dependencies": { "@lezer/common": "^1.2.0", @@ -696,24 +725,24 @@ } }, "node_modules/@marijn/find-cluster-break": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.3.tgz", - "integrity": "sha512-FY+MKLBoTsLNJF/eLWaOsXGdz6uh3Iu1axjPf6TUq92IYumcTcXWHoS747JARLkcdlJ/Waiaxc5wQfFO8jC6NA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.4.tgz", + "integrity": "sha512-Wy0V7+SGUjnF9/TkiM1hKVDPj7jKXduPNboMVtHTA8dySMURWqfg/JZ9E2Sq8JgSJmkl7k7Qe9FLeMSrSraWmQ==", "license": "MIT" }, "node_modules/@oxc-project/types": { - "version": "0.146.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.146.0.tgz", - "integrity": "sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==", + "version": "0.148.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.148.0.tgz", + "integrity": "sha512-Nm4s/jB+4FpFsPhWGEC4h7rzksesmtnMXomo6rCMcg/b8zLQuOziRgkCS1fxDCXOlJB/6Q8oABOZ/OP6RIPj9A==", "license": "MIT", "funding": { - "url": "https://github.com/sponsors/Boshen" + "url": "https://github.com/sponsors/oxc-project" } }, "node_modules/@oxfmt/binding-android-arm-eabi": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm-eabi/-/binding-android-arm-eabi-0.64.0.tgz", - "integrity": "sha512-o6uzh/jTOQeAY5TdkAeXdqv7MBRcPxiRA08zrcBtkKj5cSu/FMu0Hl7Q6Fi1KCKyCWZ6lJVjBzdsJvsKltUsGQ==", + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm-eabi/-/binding-android-arm-eabi-0.66.0.tgz", + "integrity": "sha512-2Me9eoptv6ERdEuI2P8AOlYdHHraXebJaM6SC0kc2Dfb+mLrep2db+fedBPKaYn673h/vBgvP4tkOdAbaudX6w==", "cpu": [ "arm" ], @@ -728,9 +757,9 @@ } }, "node_modules/@oxfmt/binding-android-arm64": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm64/-/binding-android-arm64-0.64.0.tgz", - "integrity": "sha512-jRGSUeeP7p3Gynw2YaCVtjBIA6ZxY6bEB/ES5i54OhqmRTyuVg7ZgstEtzgq6GOAJd+2QZ5pvf+bFfmW5Mp9cw==", + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm64/-/binding-android-arm64-0.66.0.tgz", + "integrity": "sha512-u7O+bSSF0HGsDKkQQxBqvLGVepu93RA+JKu+ONqvfh4sCnCEbj31wZj4iG5gk3XfRwrmYj0/8catkO2LcblQKQ==", "cpu": [ "arm64" ], @@ -745,9 +774,9 @@ } }, "node_modules/@oxfmt/binding-darwin-arm64": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-arm64/-/binding-darwin-arm64-0.64.0.tgz", - "integrity": "sha512-JINwtU2lW7nOFSqi+H2qplipNUqah9Gc1jgGmB82kTD4UnZrZIVxCJ9qEmFiKfjNq27gYLFhrUb0to86aCwMjw==", + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-arm64/-/binding-darwin-arm64-0.66.0.tgz", + "integrity": "sha512-/ikyMIVjX/sdo7KtjxoEsSUosfPzveVhT9RWMx9yGqFDKFJ89JAEKuEeLBmurDjrkb4w8tOnAdSO3SBaplY3bw==", "cpu": [ "arm64" ], @@ -762,9 +791,9 @@ } }, "node_modules/@oxfmt/binding-darwin-x64": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-x64/-/binding-darwin-x64-0.64.0.tgz", - "integrity": "sha512-gCmuswrgrOSajV4HCRFkVCGIruPq8bjYuPYgSE2WQB3mD6XrdyZ3JMSRZCkQ8zCxOyGWriBo6QoZ5nmMHQ1BfA==", + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-x64/-/binding-darwin-x64-0.66.0.tgz", + "integrity": "sha512-q5xUsKeFqawa9NXa6ZGXWimFV19m8MogKPdTaSVDAAk2EQKBmBZRDeluwcl1p8ty/OFc9s9888OKEh3xfPVH0g==", "cpu": [ "x64" ], @@ -779,9 +808,9 @@ } }, "node_modules/@oxfmt/binding-freebsd-x64": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-freebsd-x64/-/binding-freebsd-x64-0.64.0.tgz", - "integrity": "sha512-Ab8g7a38pT0MMImjh7anRSTve6buWBIlcXIFBYa5xl4s6UxEgKSc2xOOhbGtLwvXnEi2PsEDGoJh3oUU7xkehQ==", + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-freebsd-x64/-/binding-freebsd-x64-0.66.0.tgz", + "integrity": "sha512-CR+x4VzMY0pRXLK/xFQ/RzsSFkP5t2Z2mef0QY6OP/rTRcMUoMLCOM62/3Fp/t0K+UDoBKxvMyeb6D0zPMjleA==", "cpu": [ "x64" ], @@ -796,9 +825,9 @@ } }, "node_modules/@oxfmt/binding-linux-arm-gnueabihf": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.64.0.tgz", - "integrity": "sha512-BgvS3CoQ+Xy2deoZqEN8JVKabcCZi2RxA3yant8G9OAv9KuPJ9TCjHkqigzdHUVwErZxEP5d2bzLIEyKYyBDLg==", + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.66.0.tgz", + "integrity": "sha512-ZEYmO/LbH9tTQCADILHGZE4GeOXOAj2VzedHkASNwjmwlwtutJCLpCJbIs37wRGTFgWRoEcD72jpMX+IBJUGjQ==", "cpu": [ "arm" ], @@ -813,9 +842,9 @@ } }, "node_modules/@oxfmt/binding-linux-arm-musleabihf": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.64.0.tgz", - "integrity": "sha512-QXpNxwoMj0YvnceCNZadNSden3bIcnvjn/sDp/rwZhRoZoZYGpHvtPyhGsdJz9uvT9GkaMW7SsLddurU56dt8w==", + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.66.0.tgz", + "integrity": "sha512-hNtR9/oU0CeTkq7JnRkmBQwqe17v2ZaAMLC4VcN7IIOWeRyWDk0knSPWS9iiLmtbZ2RRBBtsG01jQgkZmKCJeQ==", "cpu": [ "arm" ], @@ -830,9 +859,9 @@ } }, "node_modules/@oxfmt/binding-linux-arm64-gnu": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.64.0.tgz", - "integrity": "sha512-BBgH3I1ppDsI5pZ4Pdhw0ceYxwVCfbU/bZEBCeZ6caRS9x0ZabErxubP7riGUn11PXZBhe8DYdjkDKP1FlVQ5w==", + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.66.0.tgz", + "integrity": "sha512-uwOVQ8i6I1LT/+eDzfsgrrcZp8Fn6NPVUPn8fF5gdFGekFf0PddF+LEuwsD0/pbNUcKZhDj2rQ5UpITh9gF4iQ==", "cpu": [ "arm64" ], @@ -847,9 +876,9 @@ } }, "node_modules/@oxfmt/binding-linux-arm64-musl": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.64.0.tgz", - "integrity": "sha512-v19HSjC/BGXdt26qEvKZtwAHgGmQ2Agcap2kQP+KIqoRZqivVzYth3ui2dJA1i+6/fjpjga85lIOaJJjQ/bOOw==", + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.66.0.tgz", + "integrity": "sha512-tTkF2Dmx4nGAjmBlZb+UtTGqR/EK4ZrW9qBfzte07a9XWqzoGGKzpFFlyNDhQe+Uwql94+ReCTeNbhOXscw1Dg==", "cpu": [ "arm64" ], @@ -864,9 +893,9 @@ } }, "node_modules/@oxfmt/binding-linux-ppc64-gnu": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.64.0.tgz", - "integrity": "sha512-PElLnOo4xFTBZrxPhgTIj0eHqZXwEBQoNWtb7facUV170T0B0FRET0iNbb3LUeLWTybkUW+vsdyv4ihOdyXGyw==", + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.66.0.tgz", + "integrity": "sha512-F3cKHUav4yXOHn6GFnwpBhSYsJOYKKf9eqO/9jlEuqPxNw9zb98E9ZFct79gcg8pibUGkbveEu9WDlmXJpDzKw==", "cpu": [ "ppc64" ], @@ -881,9 +910,9 @@ } }, "node_modules/@oxfmt/binding-linux-riscv64-gnu": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.64.0.tgz", - "integrity": "sha512-Qzsg15n4F5CH+MorcRW4MkAEMiLzXmeG+DiDSbP/bBTqCmWOH3K9DHryNrve+JHlV0txS+B6Z9P5Xz+cmWeL+g==", + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.66.0.tgz", + "integrity": "sha512-K5fDaNZfDyQMYA/3qL21bqyN0X9T15LLwwbFPt2aHc94+ZG7bh0vZEsy2y7NlRnjjHFSwN+Hzg6ldJtbOriH4Q==", "cpu": [ "riscv64" ], @@ -898,9 +927,9 @@ } }, "node_modules/@oxfmt/binding-linux-riscv64-musl": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.64.0.tgz", - "integrity": "sha512-/GZ358wnQ/Ez4UVnCcZIi56JkY0sOdZ+B108pqXKqZz3jLS59F4KEAB1Qv3fRlObrFEk+3L2vUQ/xoPx+3vjXw==", + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.66.0.tgz", + "integrity": "sha512-44Yc+I+qOmTElRcEhm5hUKIUJEQIOugymz4ua4tB0Wox7tGAfIbjzmXz/HDAtw1Ij6gmBwZlzh4hc9679RhWeA==", "cpu": [ "riscv64" ], @@ -915,9 +944,9 @@ } }, "node_modules/@oxfmt/binding-linux-s390x-gnu": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.64.0.tgz", - "integrity": "sha512-/C9We3DXegowfLXtVCYHeNiU9azwCDr5cQkEtCVlc74vyn+lLQSPApJ1CZmxAduqeq/Oi3gQ+IVptyhCaTMtkQ==", + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.66.0.tgz", + "integrity": "sha512-1e29Eg9hEj2kRBB19M0seIehPbbXHCk35GvImjDvb79rjjYjXCRmtbUNHJcgoktZAMIzXrTbxDBKmTc1V4bg3A==", "cpu": [ "s390x" ], @@ -932,9 +961,9 @@ } }, "node_modules/@oxfmt/binding-linux-x64-gnu": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.64.0.tgz", - "integrity": "sha512-91KM2CeRWscIEHlj1NsW2WSnzGeq1Ehq+39bfDowTdkn+fcvK/x4Y1RcyqT7glyBjZio0ldkeCG6Usj3v7ASog==", + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.66.0.tgz", + "integrity": "sha512-vODY1UQo10gngn0+D4xHKU84F1Twm1LqrzV4SqPXvmQKSd87paehvZ6jqA5wKs6XQrlWul9clYMDVHcoW9CPMA==", "cpu": [ "x64" ], @@ -949,9 +978,9 @@ } }, "node_modules/@oxfmt/binding-linux-x64-musl": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-musl/-/binding-linux-x64-musl-0.64.0.tgz", - "integrity": "sha512-gw7uEk9I+7zoT1EYLra1eWArIzNcz8e3jkv+Noo2+o2T7wPvsNSQbfoa4DSfZlvn1i6mJ05RiZ4/omaXPDNhQg==", + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-musl/-/binding-linux-x64-musl-0.66.0.tgz", + "integrity": "sha512-YDzXx2JsT4+HL4MdkVrYjO55NS5lUKNm8rLC4ZPou8+seu0v0jhecSh+ufoO6+xEa8gccEezMlI2WHJi4ApUgw==", "cpu": [ "x64" ], @@ -966,9 +995,9 @@ } }, "node_modules/@oxfmt/binding-openharmony-arm64": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-openharmony-arm64/-/binding-openharmony-arm64-0.64.0.tgz", - "integrity": "sha512-HYHFf616FHSPSO07c09mjmXBfQ73wIVM3m0txOiooa5XZkGoxFd6B14PVj0LB0DXIqJ6wAO/dDR/NX/5UUaqnw==", + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-openharmony-arm64/-/binding-openharmony-arm64-0.66.0.tgz", + "integrity": "sha512-mJjUYd8lj0+j4JkYyEM+5qKBf1Rnrpgjn/SVYKJhicVDqLz566ooa7Fs8zflPqt+dnZDV7X054rVIQX6ZcQNlQ==", "cpu": [ "arm64" ], @@ -983,9 +1012,9 @@ } }, "node_modules/@oxfmt/binding-win32-arm64-msvc": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.64.0.tgz", - "integrity": "sha512-uQjFp081IZSWD6VAofX2iO2z01awAdHmfC+NrieWIPKrT2hZKQDyq/U18M7ifC0sm0Wz8aHY/p6+FDYIzs/CrQ==", + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.66.0.tgz", + "integrity": "sha512-soV+0vESv7e5ntCHWC61x4gg8OSak6IHHnWsZmHrJFlvMj2AK+kmldErCNkVkrvc1Ts2/++rJXn+IuAb2WMXhw==", "cpu": [ "arm64" ], @@ -1000,9 +1029,9 @@ } }, "node_modules/@oxfmt/binding-win32-ia32-msvc": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.64.0.tgz", - "integrity": "sha512-lNM6byTAQ881jugzFu8juJTbNRgsUTlswMA6pJmwi1XDvmIqnnb49lcUAs5gz94fCJLrVN+/X3s3jOKqx23WIQ==", + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.66.0.tgz", + "integrity": "sha512-YCPi23uRIEYuIKTZohAkKbPFpujQ5QBuUM5iDv+UqbCmTPAkaFsxjsSuB8xlBpRT0G7eP/4HMF+cPDSqHtOD9A==", "cpu": [ "ia32" ], @@ -1017,9 +1046,9 @@ } }, "node_modules/@oxfmt/binding-win32-x64-msvc": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.64.0.tgz", - "integrity": "sha512-BtmbtL/QjMtF1a6C3CqoDluH2IfB6fJt62E+B9RFfUPtFk4Iz9PFS6+y/SzzOvSxc7aUk2Kphwg7Dh8lMbwu6g==", + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.66.0.tgz", + "integrity": "sha512-bwTQcv/JVRPkOqQtMF0X7vpvpncDQiBcXHxZ9S2hR12Hlo8bvBdUR5x5XnxzDZ3kM0qoZw1rv7KaD66Ly+pFWA==", "cpu": [ "x64" ], @@ -1034,9 +1063,9 @@ } }, "node_modules/@oxlint/binding-android-arm-eabi": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.79.0.tgz", - "integrity": "sha512-TebFaaMklO/RXzTv7PucaCq9l3X6D1gA+C8H6K4njtjFOV+zWE9MKLpulcJZN9bzytbUbQIY0mZuz12nQ5Kv4Q==", + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.81.0.tgz", + "integrity": "sha512-IcCRsXiedJoJopY6mpZUBEeVFsUrutmrG7dZ87zMuKJlhg70Ora9bBl1WcCxZQtyI10YpnVdEso5oCg7YcfSHw==", "cpu": [ "arm" ], @@ -1051,9 +1080,9 @@ } }, "node_modules/@oxlint/binding-android-arm64": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.79.0.tgz", - "integrity": "sha512-KqqnOtAVgNsPPF0YSodkFZA1O80jcKoCZCTu3bgsszxA+MrMP9TLzfXitKjEj1FmrPprKDMdRDMmY3weESO9sg==", + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.81.0.tgz", + "integrity": "sha512-GRrIPyTGVhx3L3h+0T5xT2A0jFAcdPv4+IfuXpGDLIdl6XeYhgg/zw72A5ILZoUgRqZuM8F1y+V/gfDriXSxzQ==", "cpu": [ "arm64" ], @@ -1068,9 +1097,9 @@ } }, "node_modules/@oxlint/binding-darwin-arm64": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.79.0.tgz", - "integrity": "sha512-BVC2nsMzqQzRDPc5RhixkZ+m1p7iH4bxRRvqkbwDXX0PlQKm1BPy8J8cRjnAFafOq2QzI+BfO3vE8w2GZ3CBag==", + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.81.0.tgz", + "integrity": "sha512-qNQ9tXRgLuKbqSV1S2h9h4KPHjbovO7RRR2/enUOtHzTkFZ7B9X5zqqHJua8dRyc7dBy7Aoyq5pqTSLFVcAzGQ==", "cpu": [ "arm64" ], @@ -1085,9 +1114,9 @@ } }, "node_modules/@oxlint/binding-darwin-x64": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.79.0.tgz", - "integrity": "sha512-p6Lm+snmhGuLKL1+CpCV8L6ijkE/qJzK2H2jG9+eKJT0n31RbY4FLsdhexekgP3bLpw4Kgde+9DZuDZQ4yIInA==", + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.81.0.tgz", + "integrity": "sha512-q0QTm32jWga2Gv4j7IaVZN0jYMi9UV73sWVgFtDA4iIfqwMCLLZ3ve+9KwfYtsaKZSgQhmPaogeZWqDZpcY1Pw==", "cpu": [ "x64" ], @@ -1102,9 +1131,9 @@ } }, "node_modules/@oxlint/binding-freebsd-x64": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.79.0.tgz", - "integrity": "sha512-qDMm0dXZnoHyRqSL4N4xUq82T4sqK5cbKSjvd/dF/YbMUXc2R1wEPf+vmA5S0qUmi0nwXfNbjXBtZaIqzQLIMg==", + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.81.0.tgz", + "integrity": "sha512-/+8wVWDXEC7wHVAhOc59Fw/SkMc1arLkFD8iQCaSsmzenK1X4doFqquL9H1wrtGUzaiycVqkf/sSpcILK6W1UA==", "cpu": [ "x64" ], @@ -1119,9 +1148,9 @@ } }, "node_modules/@oxlint/binding-linux-arm-gnueabihf": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.79.0.tgz", - "integrity": "sha512-2od7s0nuKPzqyUZAWk9KkCyGg7eI9dwFPZg+20lB15fKFkVZ0c9ZFxqPfiBAyDTlTkh9stPI0t+JlPCqMbItVA==", + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.81.0.tgz", + "integrity": "sha512-4xt422FEgioRq9hAL4Tq7fujGUWnc8z1BJ+Oi8RN8vB8axaP+sdK6a2xdlcQCCYnJg9QMuMFS0AucuIFx/EacA==", "cpu": [ "arm" ], @@ -1136,9 +1165,9 @@ } }, "node_modules/@oxlint/binding-linux-arm-musleabihf": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.79.0.tgz", - "integrity": "sha512-ZOQUjkzDnvlhSE3+tWC3YXx94MMl+sYMlwH+u1+YGApGHOJP/YAc8ZBRFOXZ6eOBmxtXAWuS/fBcdZr8qqNO1A==", + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.81.0.tgz", + "integrity": "sha512-u3vna8KdGplH4DRCW9K54D68fcMo7IxVrkCJWwXnIhwtBdnDnYrmzOUA/XjmBlPpcLsgw9Z5BNdY4za9+Dj+MQ==", "cpu": [ "arm" ], @@ -1153,9 +1182,9 @@ } }, "node_modules/@oxlint/binding-linux-arm64-gnu": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.79.0.tgz", - "integrity": "sha512-lu158FR4nGqGeRS3BQvtG85wRgU/Fy4MD5Cxp1hzJXizGiLo6u2742wJSCDKh8cFcZntvX7fcxlq4mMmfryH1g==", + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.81.0.tgz", + "integrity": "sha512-3j9k+gsYsE7nv71GWotXsqsa2l9/aJenD7dVHNt/CBvsb0SgRjSMnHFeP59IXUAl1wvVFhqGl2wJNMwWU3UBlA==", "cpu": [ "arm64" ], @@ -1170,9 +1199,9 @@ } }, "node_modules/@oxlint/binding-linux-arm64-musl": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.79.0.tgz", - "integrity": "sha512-mbpKQeE2aflTjddaHK7MP8KP/OFbUM++lt5M635ENM8IyIdK0jm2t9pb+2v9mVVIvhF6TqA4l7F79Pll1mi+uw==", + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.81.0.tgz", + "integrity": "sha512-k5iAp3dNxW0/uDCBY+WSm8jKB2szu7SkEQZdgRRpDXvuDd69vvDcqhB3A/pWCfCwXyenjNjFn9Td1fVoyAc+Yg==", "cpu": [ "arm64" ], @@ -1187,9 +1216,9 @@ } }, "node_modules/@oxlint/binding-linux-ppc64-gnu": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.79.0.tgz", - "integrity": "sha512-WpGNua7gaxaHnpSDeog2ji8IDHn/QLPl9LPzwkR/FvVv58vT5BcXjRXnU+wbu3N75cpeha8CdC7ho/U2OIsB4g==", + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.81.0.tgz", + "integrity": "sha512-TFqLja3uYmVSte6nof9GWrex9Z8WgdZrNiLC6Te5rXGDqXB2y4j/26iFhwosXiAFqDhE9JJVuuCkDKLwptTn1g==", "cpu": [ "ppc64" ], @@ -1204,9 +1233,9 @@ } }, "node_modules/@oxlint/binding-linux-riscv64-gnu": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.79.0.tgz", - "integrity": "sha512-tK1E93A5LVzISg4ngpKJnfTs7EqtIUceGI7MQ4GyDjJiLi8wPCkEyKlj2xkyKWZ1yzkDJyLHTBJ5/iFWRdnJvg==", + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.81.0.tgz", + "integrity": "sha512-UEcySvGS0NOVo7h7n7CYyJL9+6gFAh7Zc/ToDXVScFvzHSTIxtzkMVU30rmQ6+nQ1LF+UdiRDdJajpDu+OylLg==", "cpu": [ "riscv64" ], @@ -1221,9 +1250,9 @@ } }, "node_modules/@oxlint/binding-linux-riscv64-musl": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.79.0.tgz", - "integrity": "sha512-qhQvUIrngXivA2A9pQ+xPCychztn/5qUv7yS3gDwXv3w7Rag+eTeeXWmRyx+t7XsW5x6LuY/8AsTq36UgFIblg==", + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.81.0.tgz", + "integrity": "sha512-H+diDbhD00+wI1IRP8Kz88x/lat+DgtoBJzoTthS16xkTJGNaEkfb8gzmd1rzc/2uDQQMl7GNl+JFUacVeWxIA==", "cpu": [ "riscv64" ], @@ -1238,9 +1267,9 @@ } }, "node_modules/@oxlint/binding-linux-s390x-gnu": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.79.0.tgz", - "integrity": "sha512-sv6AaVgU/eE6u+6WFiQVDcPPwTxP6IJMSB9k701W2r/r6Tx465e8vPvVyRxquNH4Vy6KwRNu90mVbxXJN8+5gg==", + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.81.0.tgz", + "integrity": "sha512-8znJ/5TekjOKg1j1Acho4PJMdiAHLtlcXuWEiipOhAMV6rQcXdmDdXCbheyDczN6TjBwiNfjcP81k4AthrKRzw==", "cpu": [ "s390x" ], @@ -1255,9 +1284,9 @@ } }, "node_modules/@oxlint/binding-linux-x64-gnu": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.79.0.tgz", - "integrity": "sha512-iFZL02deziHslb3jEX9KdqlAkYoo4fGyotchKDzdfK1f5mxlIBeiQeHhvK3iFpuEJSB4ma/qeFn9oxPiwnhUPQ==", + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.81.0.tgz", + "integrity": "sha512-Q2Wj70yFsvn5QjlmifFzbj4H+kJy53bwqc41o1fzoM7MpLV1NIbhg/LpWXRfC6KOkSAdUx1Wd8VJsdPmhp/HRA==", "cpu": [ "x64" ], @@ -1272,9 +1301,9 @@ } }, "node_modules/@oxlint/binding-linux-x64-musl": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.79.0.tgz", - "integrity": "sha512-3DtZR2raqObnh7wXZoFYFd0Fw7skBvcb3f7A+/lkEiDuh8hrE6vv9b/62Qxao1a9/OeHLw/FcXlXzgsW9wTRFg==", + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.81.0.tgz", + "integrity": "sha512-cPInHp/ddEe5qkyK2IiyQ8Q3Mp2oLLEhhsGgTK2oZx4L6+llGam1H1yBvJZ7qHfOXj8N3hxBS8sj4tO+gtFlIg==", "cpu": [ "x64" ], @@ -1289,9 +1318,9 @@ } }, "node_modules/@oxlint/binding-openharmony-arm64": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.79.0.tgz", - "integrity": "sha512-Oatt4GuA1WJkqzk2ozx4HrWROOi7opV3AKDw/U8qDIqeTqzsjn5K2x3REJMNjU3/KU/Bkq96Zi3CknaiDTaC/Q==", + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.81.0.tgz", + "integrity": "sha512-0CQxSX4ajqm07AHBf5U33qQzXKdd7wtq/oTL/7vpY6RNNuxrRi8W4bqUV1Jyu/vj+9KmxQyDhxfeVX1nQL6kfg==", "cpu": [ "arm64" ], @@ -1306,9 +1335,9 @@ } }, "node_modules/@oxlint/binding-win32-arm64-msvc": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.79.0.tgz", - "integrity": "sha512-NAgZr9Qp8nIA9rpo0JEvwiabTF/2UVqBNnupBG9X4kxXcQoScJUTi+qHhvabb9s/thgj5wQ4XcIaJvb+ZMgoKw==", + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.81.0.tgz", + "integrity": "sha512-l0hbeISm9673hVrrQU8j/p2M7YH9Ouoj7p7E/QM55NTrKVLP+P3PF8hLu+OY+x0VtGRW+ggiQKZqmdYps9H+TA==", "cpu": [ "arm64" ], @@ -1323,9 +1352,9 @@ } }, "node_modules/@oxlint/binding-win32-ia32-msvc": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.79.0.tgz", - "integrity": "sha512-+KyXjIvcpaXmWW/j9NNY5yWjrIVxaX18VyIheQy3jwc2GSYgpCr7MGI/HxIGQ/shAL5IWEKbhsqoMpAO5Stiog==", + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.81.0.tgz", + "integrity": "sha512-ksqPP5jbFXcYreEQ7zdJh06rJQBymCTyGRCdaXjfcf2aG4f8KxUWY5wcgYHmaTK+FJ4bPG5sUAdOX+6trnH1JA==", "cpu": [ "ia32" ], @@ -1340,9 +1369,9 @@ } }, "node_modules/@oxlint/binding-win32-x64-msvc": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.79.0.tgz", - "integrity": "sha512-mEelcCMMBS57sIXh2veGMNy+pQwuGtcMxHxGIZWQ5Ba9pJ5jCCUFOZB9E2JhBaxGsURe+WGe0zJp4RVre52gpQ==", + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.81.0.tgz", + "integrity": "sha512-IZuUCwGw9emG5JtCp+fYGB+Z4OWEoeEcM8R5BA1pYw63/ieYFVdcU2ylxTpHbVHSenZnsYE+ZZ20uHAJszQ4cA==", "cpu": [ "x64" ], @@ -1966,9 +1995,9 @@ } }, "node_modules/@rolldown/binding-android-arm-eabi": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.5.tgz", - "integrity": "sha512-DLe/i+l8ynIBY7XEQ191TeZvCoowIGa18R+dIV30GW7DiOtp74i/xX8hs8GUjW5ARV7VZuie3d6AumSmCwbeRA==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.7.tgz", + "integrity": "sha512-EypzgnYCwyVY4NDHKzGmNJT5b+XaQEBniHxsMdeIQLB/tcCzZnhqrzHpZFbX9iaxx+5RiB8caATBtfvZP7zVxQ==", "cpu": [ "arm" ], @@ -1982,9 +2011,9 @@ } }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.5.tgz", - "integrity": "sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.7.tgz", + "integrity": "sha512-l17HE9EweWaqJZhuUuNBN/FzM62xw+DECVnJyvMsxn8vJFAGLy5QfLDoYAcronkAN8VxKZHezDpulHDPx95vFw==", "cpu": [ "arm64" ], @@ -1998,9 +2027,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.5.tgz", - "integrity": "sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.7.tgz", + "integrity": "sha512-8ED8ELFvHXc6OCETIn4gXObPiaR6bckM/ipXtbzlPVDRMBfEGjCKgO90F9YtfdpDatVx/ZQw7aZ1vUMf/+T3Mw==", "cpu": [ "arm64" ], @@ -2014,9 +2043,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.5.tgz", - "integrity": "sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.7.tgz", + "integrity": "sha512-/WPripjtiAIZ2tWY7ddijORT0Ujg87wxWW/qcoFVCKAWVDPhtY0xr7Dj0M3GyNGz60jGwTElhro/mkF9dT7dDQ==", "cpu": [ "x64" ], @@ -2030,9 +2059,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.5.tgz", - "integrity": "sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.7.tgz", + "integrity": "sha512-14DI4NcqpvbICxSnGLx3PmtDaWqRP/KGSGb6C+JLLVPeZRl6dKdHba3pGsqT3vpdTqhEYIPG0MMQ8c0xYqoJxA==", "cpu": [ "x64" ], @@ -2046,9 +2075,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.5.tgz", - "integrity": "sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.7.tgz", + "integrity": "sha512-bxrWIRvHWQvbJwi+VIie/kDJmQxcNE6xxWwZdqF/ExVAigtHkv54WTLQPb+QsZdnFy18fg7JPfWGL0RH6vwIlQ==", "cpu": [ "arm" ], @@ -2062,9 +2091,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.5.tgz", - "integrity": "sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.7.tgz", + "integrity": "sha512-toOY2BChBZyuxU7OYX6Tn389di4IzAqPTycVcci0O7FSfBqzRB3RZn+K5Is6ANf4tmgRd/K1yZTsNTXbkXsnLg==", "cpu": [ "arm64" ], @@ -2078,9 +2107,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.5.tgz", - "integrity": "sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.7.tgz", + "integrity": "sha512-lAIXTH/aiLRLxsTgQvfhjo4K1ydWIp00+V0voOr9beb/9ZmkUFrSIb03dXNFRgMNvkE6oGsF10ioQ6UsI+vS5Q==", "cpu": [ "arm64" ], @@ -2094,9 +2123,9 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.5.tgz", - "integrity": "sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.7.tgz", + "integrity": "sha512-kdnwS28Pkenp/mZMRwjXXXwxQ7pIsm+bF919LUK93BOyhcLsrVKdP2p9fxpiPNPAbNuch8ypQt0pm2P2LYCAGg==", "cpu": [ "ppc64" ], @@ -2110,9 +2139,9 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.5.tgz", - "integrity": "sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.7.tgz", + "integrity": "sha512-516OdsyLdr5E65paF3yBF55t8mfm9+gmtCsK3xI7XKXIT7EfRlHhxL8K/NR6Hu8BWSgF5+1w74lTL0+nxcc8Qw==", "cpu": [ "s390x" ], @@ -2126,9 +2155,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.5.tgz", - "integrity": "sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.7.tgz", + "integrity": "sha512-r8/z8n7GFaYRln3xmP1Cxy0HH/HLM0uBUPkEuSVEfKGDA89M0FsZRZJRSwe/tJjRx+fpH/gjorfhB8tmEbSFLA==", "cpu": [ "x64" ], @@ -2142,9 +2171,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.5.tgz", - "integrity": "sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.7.tgz", + "integrity": "sha512-pAsE8iiDxUg1xBqdhrTfg45AVDVpirjz00sblEYClGNNcMnDb+e8beQgqIAw6LvauX/APvgxUnwrgun/YYGBhw==", "cpu": [ "x64" ], @@ -2158,9 +2187,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.5.tgz", - "integrity": "sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.7.tgz", + "integrity": "sha512-lTcIYmmnQQA8Or/2DatS6oSqcdLHvendjS+zLu+FwgToynWMRSmQdpM65fTANJgIS4mjbMOo5KT2lnT9SAb96w==", "cpu": [ "arm64" ], @@ -2174,9 +2203,9 @@ } }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.5.tgz", - "integrity": "sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.7.tgz", + "integrity": "sha512-e3Gu3WxbNk/UqQhxqU7YIYO+9ZBvWNz3U+h/qRFosscMFzdRPbXYSaSWgSnklv2fz1TgzBTcti2z35c/7irsHw==", "cpu": [ "arm64" ], @@ -2190,9 +2219,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.5.tgz", - "integrity": "sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.7.tgz", + "integrity": "sha512-W/jg5qoRSqjsEv0+dZi4e687mcHqmVuU0P4fK6qS/xjetW2Gmc1W8j//z5nAeNcC8Ttm0hV46IjcYeuVwYhuiw==", "cpu": [ "x64" ], @@ -2242,6 +2271,7 @@ "version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/remapping": "^2.3.5", @@ -2257,6 +2287,7 @@ "version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz", "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==", + "dev": true, "license": "MIT", "engines": { "node": ">= 20" @@ -2283,6 +2314,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2299,6 +2331,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2315,6 +2348,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2331,6 +2365,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2347,6 +2382,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2363,6 +2399,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2379,6 +2416,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2395,6 +2433,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2411,6 +2450,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2435,6 +2475,7 @@ "cpu": [ "wasm32" ], + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -2456,6 +2497,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2472,6 +2514,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2485,6 +2528,7 @@ "version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.3.tgz", "integrity": "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==", + "dev": true, "license": "MIT", "dependencies": { "@tailwindcss/node": "4.3.3", @@ -2496,9 +2540,9 @@ } }, "node_modules/@tiptap/core": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-3.30.2.tgz", - "integrity": "sha512-QbZC/s1OOqcoUdkhIY16TjR/gCtR0qAk9e4bJwUqOJqZuv5ozqCL5hzWm22jjTPp6c6Ei2tPd6t30VwfIKW4lQ==", + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-3.31.3.tgz", + "integrity": "sha512-Cz50pvciQrxdSxgTkHOVz0uD0Yl/8Xt0QatGD6ILm47jW8EzyHR9RkUGs/D5IqzXKuVPntfw1ttaT926vXfiRg==", "license": "MIT", "peer": true, "funding": { @@ -2506,40 +2550,40 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/pm": "3.30.2" + "@tiptap/pm": "3.31.3" } }, "node_modules/@tiptap/extension-blockquote": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-3.30.2.tgz", - "integrity": "sha512-BOkwhZenek7vzXBOgKppSrlx4YryBdAYu1p1MXKn0R9A9eNmE2HVhmm0gG49+E8BhsE/TG8wKVclwET42JJiIg==", + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-3.31.3.tgz", + "integrity": "sha512-fyY2XMbyDDDfOTQ1Qdrnqa1qwC9DWE4n7AfE0EKQI0G8MfLV8RaDlLDcOZDJ9JbMPY7/Gx7EjyK4NKxSW9n2hQ==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.30.2", - "@tiptap/pm": "3.30.2" + "@tiptap/core": "3.31.3", + "@tiptap/pm": "3.31.3" } }, "node_modules/@tiptap/extension-bold": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-3.30.2.tgz", - "integrity": "sha512-MsvJhPgYejY2D9MhwYJv8AmscozvLBI8qtJ7YLdYZBWkMR4bgmxHq5+xqEfBsao9bOMMwBon9p3+P+/Tq5ReWA==", + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-3.31.3.tgz", + "integrity": "sha512-dIuYhKk8TitKU/FeDpoTeWZhU42YgDN5npgWNjAmMmRktPdoxnH3/wGSiwXlqZgJWjehN7kPWDePWpJeAImGpQ==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.30.2" + "@tiptap/core": "3.31.3" } }, "node_modules/@tiptap/extension-bubble-menu": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-3.30.2.tgz", - "integrity": "sha512-oS0WiWNXHKpiPYMkcnHm1j7iEvufTGGtLFtcJJd3olb5OS6V2acoXVDL0nNJDmRQ32K3QXut3fbRcMseMxT+lw==", + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-3.31.3.tgz", + "integrity": "sha512-EV6ZnwKc++2OM/OcD54n8s1B7C9LP7GKAtdEPwu0t3BYJf3sG8Ueoinf7SgGPO9oMPg96GneOkDNm1urMV167g==", "license": "MIT", "optional": true, "dependencies": { @@ -2550,190 +2594,189 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.30.2", - "@tiptap/pm": "3.30.2" + "@tiptap/core": "3.31.3", + "@tiptap/pm": "3.31.3" } }, "node_modules/@tiptap/extension-bullet-list": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-3.30.2.tgz", - "integrity": "sha512-+awIL/TUz4aB3rL68igU1rWfaaoBIAkPcakkktkRq8gYf0bd9eSb48P6kHkpx/3q+JyK7g9vsnltLNHNh6twnA==", + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-3.31.3.tgz", + "integrity": "sha512-qEyyoPapPef4LO8XKaN83bxtaNzkJ4kFn/IxLnEKd4BJ3Mvi4MH2yJYlyDqwFnMoev4pMA1zBHRAt/C0THRmZw==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extension-list": "3.30.2" + "@tiptap/extension-list": "3.31.3" } }, "node_modules/@tiptap/extension-code": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-3.30.2.tgz", - "integrity": "sha512-r8EZk3R9yGpF6v5xxafAU1HwrD/e+RpbfnmVi2TeB/ZHAsVO62fW96E32G0t6IdaCtOFtAd85hkDAaOfCT4yGg==", + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-3.31.3.tgz", + "integrity": "sha512-SzxOqchrD2AcN3uT67PjKmRFEMOU3vNNiwNaamZJUbZrI6Hmy+bvdHJrc3jrIddyyCrAtsnAfRI0cmorW1jGfg==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.30.2" + "@tiptap/core": "3.31.3" } }, "node_modules/@tiptap/extension-code-block": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-3.30.2.tgz", - "integrity": "sha512-9otGKaQZmePHrLXFtCtz+BYDn5z4sSumTkUqQIQHz0gVxwPoTi7g51RedwxvViTb/zu2XV5ROXYLHIxKxypMPg==", + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-3.31.3.tgz", + "integrity": "sha512-nvknt4FhyJQjYcvxptmeUlFsIAc8ibua3E5BN4Pim374/9RWepH4cdE9X0/qUTtguHElLx0iKtSIY3rW2qGTFA==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.30.2", - "@tiptap/pm": "3.30.2" + "@tiptap/core": "3.31.3", + "@tiptap/pm": "3.31.3" } }, "node_modules/@tiptap/extension-details": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-details/-/extension-details-3.30.2.tgz", - "integrity": "sha512-TItNBcvwycW5Bpe+SH7bCYeBvMDmLvzsoY8uOn8PoJ/Chls6Wl+t89QWKo0bU5i7Tt1gdgMoTngb+WXpjP0fhQ==", + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-details/-/extension-details-3.31.3.tgz", + "integrity": "sha512-J5kdZy31wb97iKUR4sDsX0sEyRPlTijKKRAnVbInY2aNdFuNBTBdMPmblEJztxfMN+TmDrU2kCVv72J9B1SrJg==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.30.2", - "@tiptap/extension-text-style": "3.30.2", - "@tiptap/pm": "3.30.2" + "@tiptap/core": "3.31.3", + "@tiptap/extension-text-style": "3.31.3", + "@tiptap/pm": "3.31.3" } }, "node_modules/@tiptap/extension-document": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-3.30.2.tgz", - "integrity": "sha512-+xIv67V+/2L1uvz98FAT5W7kWEfHwfNV3MD7b4UsKPU0lhcCWuVOXy0JB8yYmdNExqpI7xT9g3MWzREoBvBQSg==", + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-3.31.3.tgz", + "integrity": "sha512-EexgmqnyDNyGlISxo7SMrp5MygpJYmqD+0cY5jB6L1U6L4CpKKRWUt8OO1sWzEHDE1+TTvwt+WIFoIWAziOtEA==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.30.2" + "@tiptap/core": "3.31.3" } }, "node_modules/@tiptap/extension-dropcursor": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-3.30.2.tgz", - "integrity": "sha512-nyRKUmItATnKI9AiRChmjhcBbCEsNxRu+AaCz+cx8EvnAcNHsVRdNYL5PmBs3WlNA/Et4Eb2DG0hVQDnNF61eg==", + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-3.31.3.tgz", + "integrity": "sha512-NWomSfu5CSC7VacnMSDzKT8qm66SzMfZwVPEtwY5bPpRTJgTiT1rNK0neDrrzfMN27MfylGyKWWf7Q5Qf8w/fg==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extensions": "3.30.2" + "@tiptap/extensions": "3.31.3" } }, "node_modules/@tiptap/extension-floating-menu": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-3.30.2.tgz", - "integrity": "sha512-A8PLvvh8W6PUMrqh+EpBerxm+Ucr0irGxJvwAnzYQmNGNIJ9U4OVgw4OcEU+9JH0gMmEzDcHzMPP2s/s1lIcyw==", + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-3.31.3.tgz", + "integrity": "sha512-rd4VJ9PGSP9Eop8ZTEwaLZcMzMXLuJKe3hUNf58rq+zANpwM+9fI+vB7g9MAc3eXwUNDxNDVACFIL2oeBqpQ3A==", "license": "MIT", - "optional": true, "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { "@floating-ui/dom": "^1.0.0", - "@tiptap/core": "3.30.2", - "@tiptap/pm": "3.30.2" + "@tiptap/core": "3.31.3", + "@tiptap/pm": "3.31.3" } }, "node_modules/@tiptap/extension-gapcursor": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-3.30.2.tgz", - "integrity": "sha512-7Xk0ut6FM+RAsvKxDN3bAtk7zvYZ6Aa8pawJ6s7dLAmLR9JwrZevlcL4FSrj4bR7rqKOj92RYCFxzgTEbWimag==", + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-3.31.3.tgz", + "integrity": "sha512-EBXKb1FrVStsNYCcRGtd9jmzveCvR+eqgg1rVqoONrqFK6U7bga6LN+1dMKroP1kliDVgveYkP3vRYxqw+rFqg==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extensions": "3.30.2" + "@tiptap/extensions": "3.31.3" } }, "node_modules/@tiptap/extension-hard-break": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-3.30.2.tgz", - "integrity": "sha512-IxSNgmG3d4OZdUTeebrOI7SxdIWXXJqlcGiSNDabWqxipUitfy3mZ3gDDE6G01koKxZRbhz4KIplAZlpxnTFSg==", + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-3.31.3.tgz", + "integrity": "sha512-QAdCvNO4+yW9ATwsrej11NTkDYFqPLIEQr3ARNrKOK1qaiS7A0fia2SEukb/hrkP3A6mbozhoQt2r2RGUf/DpQ==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.30.2" + "@tiptap/core": "3.31.3" } }, "node_modules/@tiptap/extension-heading": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-3.30.2.tgz", - "integrity": "sha512-PblDvgSJ05p1t6hzyPi02xeiBjB0M2abReoGEImqSWCy79UqnAGacgsZo4EeEawtJV1NEP8chhvmX+nRtzdT1A==", + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-3.31.3.tgz", + "integrity": "sha512-rk5VHMAeQcg06SLauN6EGdD2jc0O2qY8QkZYPd0LxNvLblw2BxBx+lxUQSYwLAT9Ie5914gKIK2YbRyO2Ts3ig==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.30.2" + "@tiptap/core": "3.31.3" } }, "node_modules/@tiptap/extension-highlight": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-highlight/-/extension-highlight-3.30.2.tgz", - "integrity": "sha512-LY1/LTEluP/z82JkoPVE3ffCVO7Bt6ltVeBMXsfb6S7GLS8eXput2KU1XlyLqTCQADvjaS1oTMfaplH+tS7Meg==", + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-highlight/-/extension-highlight-3.31.3.tgz", + "integrity": "sha512-97m1nDzTAjJaJZWe5hVOBMC2rjBZvEwTXA39zhjnaE/snb8Cy4H9A3+/sw9HQJBXMoG7tdOPG9kUlM3weYtLcQ==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.30.2" + "@tiptap/core": "3.31.3" } }, "node_modules/@tiptap/extension-horizontal-rule": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-3.30.2.tgz", - "integrity": "sha512-j8aswLTsuEdJKC62DF+kw0EgvIRL7QMUyAVp2fdjR0qgM0ZVlEwCC4qIEq3kK9tFVU4kRtQ5BSj/jn6QwrlbCA==", + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-3.31.3.tgz", + "integrity": "sha512-YnHGy2KShRwvCseAmmxl9VP7R0qaj8QMp3DA6DJWZqp7r5gLGvDkAqhedxqqefqsE4Y43hjkBdjtB9Ce78LkIw==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.30.2", - "@tiptap/pm": "3.30.2" + "@tiptap/core": "3.31.3", + "@tiptap/pm": "3.31.3" } }, "node_modules/@tiptap/extension-italic": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-3.30.2.tgz", - "integrity": "sha512-pp8uaiuXsUbLm5rYzR1jlWbwm1mAahRajdHwAKBtthFRB2rDvC7ZWhKaCSoKhZvfIDRmu9/B67+uAHoutL0dCA==", + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-3.31.3.tgz", + "integrity": "sha512-ibGvdvAPyfxBMUVNRI43eb9h2/Jka1MRG5GtnGqbcCX/2+Y/y0EOfFrPQPkuYphiWQYyu9+FzPKMB/pjuaLuKQ==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.30.2" + "@tiptap/core": "3.31.3" } }, "node_modules/@tiptap/extension-link": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-3.30.2.tgz", - "integrity": "sha512-jwdcymKcrbFpj5hRAuGVLCq8FieVkGFnENyroYmvkad+XAt8ZLy/MTFYRN6SK3ukH6PZMY7H4iObGtciQaC5nw==", + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-3.31.3.tgz", + "integrity": "sha512-986wOQzTL9Zr5lf84LCLpm+YOms8A0K39/8DVoqRfebqcOe0/eq4bnztmAlfabOd+kJY92g3AgZERFUx/w+dcw==", "license": "MIT", "dependencies": { "linkifyjs": "^4.3.3" @@ -2743,14 +2786,14 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.30.2", - "@tiptap/pm": "3.30.2" + "@tiptap/core": "3.31.3", + "@tiptap/pm": "3.31.3" } }, "node_modules/@tiptap/extension-list": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-list/-/extension-list-3.30.2.tgz", - "integrity": "sha512-MIUpo1Bd9Rf1Qg+TNYNwDZ4xsfFeQahjU9Xhy6UcaszKQzbAM7KCzn5BObNytK1NdcqNHsC8Wj5vFvMKEzrXdw==", + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list/-/extension-list-3.31.3.tgz", + "integrity": "sha512-LoveGnC0FVdCV4jUNBaG1ZA+KWE07+adzV3kGy6uUYFcJEjbVUHTnPDrBOob3IwOSO3sCwIkvQb6EVYeXn/4yg==", "license": "MIT", "peer": true, "funding": { @@ -2758,119 +2801,119 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.30.2", - "@tiptap/pm": "3.30.2" + "@tiptap/core": "3.31.3", + "@tiptap/pm": "3.31.3" } }, "node_modules/@tiptap/extension-list-item": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-3.30.2.tgz", - "integrity": "sha512-HWgRCRlGxulE+hN1VUcnWD6P2NE08VBgGtcaxOfdXVqaI93BCK6AhRQZGpLsfKgajLk+5DXTBraaitwnBqzCxg==", + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-3.31.3.tgz", + "integrity": "sha512-4QlKOriJJMvg95QJTEsy9BUYPBQ6UvJyb8WURRwdUtQUkkqb8h32lg/eyQUv2FzW9IT1AdUyNZfVaxH64kRfQA==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extension-list": "3.30.2" + "@tiptap/extension-list": "3.31.3" } }, "node_modules/@tiptap/extension-list-keymap": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-list-keymap/-/extension-list-keymap-3.30.2.tgz", - "integrity": "sha512-TTve3WOlQaYu1ahMqsQ/T0wzaxfgZvcOl3/OuPyInOi8QtxXhqGhFjmYe5jOr56G9W2QDuFWVsZecVwfDte9zg==", + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list-keymap/-/extension-list-keymap-3.31.3.tgz", + "integrity": "sha512-If8UOEdDZbPJU6iYTvLtH6DOp2KBy6BKxg9UELL1AevVetGHEF/7lW8hP50Gn1tHMVpPRqmhSzVrJRpEJJgb/Q==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extension-list": "3.30.2" + "@tiptap/extension-list": "3.31.3" } }, "node_modules/@tiptap/extension-ordered-list": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-3.30.2.tgz", - "integrity": "sha512-Z7OO1HcF0idda1n6vodXeQ3h2ylN9JR4IfIGUYkar5Xl9JusK8PDETTBQZQn//96p49I2d+GoWsD2LXPtjHXXg==", + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-3.31.3.tgz", + "integrity": "sha512-mp3g11NgA/PYu8rj7J7Ez3l4qBy6WfTSmHIG4PZvEGG5w2oUAIkgb9DU7nPPzjmeme27oazFYZw+AtZA0+u4tw==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extension-list": "3.30.2" + "@tiptap/extension-list": "3.31.3" } }, "node_modules/@tiptap/extension-paragraph": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-3.30.2.tgz", - "integrity": "sha512-ulEu3LNt+kPVAWEnrhoz13Fs8Q/v/8NUxQbAeteuBchQ8joxJXuWExhpy1fUfZir5+b+W5z7/NesgPjZQfv47w==", + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-3.31.3.tgz", + "integrity": "sha512-+iPku7wJfy5hbNDNLX8dveFtYVsZMmh7vztjuq8hT3mipSC4IByDehDbU8fzUCjfXiEzmI7mQn7c8LGmHULuzA==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.30.2" + "@tiptap/core": "3.31.3" } }, "node_modules/@tiptap/extension-strike": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-3.30.2.tgz", - "integrity": "sha512-fBLxMXz6hYIURzLOD+/L6aVATztsKham00ANWmGi13vN0hx2lQMYZffN+gR+QqiCDfMQxBXzrf5a7tJuDiQHLQ==", + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-3.31.3.tgz", + "integrity": "sha512-G29bhKttYwcKHT+BI6emWVFol3RO/gUXxQVcmr/iT8LXXy7j8J6HFUnsKM+Kg5YlP1rxMRgsa65dbrQVahZi0A==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.30.2" + "@tiptap/core": "3.31.3" } }, "node_modules/@tiptap/extension-table": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-table/-/extension-table-3.30.2.tgz", - "integrity": "sha512-zWp0ehZnx6N5lwRa8anSTn17GBEF3wxHXfOJGbBugf4Vwmp5keUEAXrgeIS4j7gIdxjN3XawdwjuMImG93N+Fg==", + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-table/-/extension-table-3.31.3.tgz", + "integrity": "sha512-7cnVPHhdiGGeauYqca6JVyPLTqZbqFEEk9nn2e2E8+fBo6zVtV07AktJBqth/XEzjZxcUmGxjoeuWYAisWjUHg==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.30.2", - "@tiptap/pm": "3.30.2" + "@tiptap/core": "3.31.3", + "@tiptap/pm": "3.31.3" } }, "node_modules/@tiptap/extension-text": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-3.30.2.tgz", - "integrity": "sha512-n/iZnirgRmXet6f97kolAnP3j8DsgLSiTbz/KLWc8eBYiFmkjRzkuisOm5xuGdfGIxwpB4x3tlSF4ef4DLnbRg==", + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-3.31.3.tgz", + "integrity": "sha512-gdsWtF+taeaCu6V+5Ct10fGo0ACUy1GnYtbb+mcathBt8OqbT+Ws60p/yEmKesBDz2Hn+B5IcWy6+2BBZl5ZTg==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.30.2" + "@tiptap/core": "3.31.3" } }, "node_modules/@tiptap/extension-text-align": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text-align/-/extension-text-align-3.30.2.tgz", - "integrity": "sha512-zexiz0uJlX2KzeAyYI/uEoBsl0Zw3Ua0CTV/kRKTnk7K9vCOnwvJXtXdkHA4WC12ACqUsPnyc4yMTwDR22fKFw==", + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text-align/-/extension-text-align-3.31.3.tgz", + "integrity": "sha512-26BJ7c28EyvHzJovNpuenKiIgfRI4KsT/OjBB00y58MyZ0kRXc6dwZVclw8y66clupKTLTWYCDUsy0P/xHj+cA==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.30.2" + "@tiptap/core": "3.31.3" } }, "node_modules/@tiptap/extension-text-style": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-3.30.2.tgz", - "integrity": "sha512-o3YMN3JNHg/rCCLZB3PUcAfl4bkrsXDoYoHRXvrbE9cl/RT+qAEFAAssI8kBC1fp9en9V2F4Z7Uy2uuzkbecKw==", + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-3.31.3.tgz", + "integrity": "sha512-wgjWWrjZwRZHiaDTQPX2am1y/4ePgRgGWF/2MOfSb7g4d5229p4aVtbT1JT7wu9z8OC482pEqcTlhdvgftvW7A==", "license": "MIT", "peer": true, "funding": { @@ -2878,26 +2921,26 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.30.2" + "@tiptap/core": "3.31.3" } }, "node_modules/@tiptap/extension-underline": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-3.30.2.tgz", - "integrity": "sha512-SZiTMnvqXcnrtJX+X25ZbYsuDO83haGOVMBD/O+mAWYNYXhaSc5Rkph5czzItxrd+Yyp/vs4PiwD7XTNbfqmpA==", + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-3.31.3.tgz", + "integrity": "sha512-HghdJaOwRqYzsAxqSyNyb+IWyOMcdCl8IoiBETA9BZCJAqdXzFLcuWp7CqCqJPam9dgkWosSoHqTCAO4nTBfpw==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.30.2" + "@tiptap/core": "3.31.3" } }, "node_modules/@tiptap/extensions": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/@tiptap/extensions/-/extensions-3.30.2.tgz", - "integrity": "sha512-2LqAHXk26QDsryW+beECxYeBzv5Ylk4GuB3cOmfghS7/G37R2W+Te3TkUK7BT0EWoDryvBT57/5q0DEFIhfZZg==", + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/extensions/-/extensions-3.31.3.tgz", + "integrity": "sha512-8sJNPGGUe8f3aDojcOW5cfVL7I5NrBbE0UWxG08qoi9Tea6qWbvQJsCR9tsrOapr/DaLr3kpbGZ9s1gEEfcNcA==", "license": "MIT", "peer": true, "funding": { @@ -2905,14 +2948,14 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.30.2", - "@tiptap/pm": "3.30.2" + "@tiptap/core": "3.31.3", + "@tiptap/pm": "3.31.3" } }, "node_modules/@tiptap/pm": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-3.30.2.tgz", - "integrity": "sha512-BJN8tUx4ppFN3R3cV/FJfrJbJkvo1lj4uciq+nwpjwzdRvFzqIuglWf+HLcJ6CwlYpLOHp7ArgkBg4Q5e60Gog==", + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-3.31.3.tgz", + "integrity": "sha512-sZime0SWsz/k62W2WvHx5Ig7G2h7kVhrrmnqy+wEgIHfDwEfOlelRjaWCiBCFlF7dxGUntJusCh9FxlLhni0Ag==", "license": "MIT", "peer": true, "dependencies": { @@ -2928,7 +2971,7 @@ "prosemirror-state": "^1.4.4", "prosemirror-tables": "^1.8.5", "prosemirror-transform": "^1.12.0", - "prosemirror-view": "^1.41.9" + "prosemirror-view": "^1.42.3" }, "funding": { "type": "github", @@ -2936,9 +2979,9 @@ } }, "node_modules/@tiptap/react": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-3.30.2.tgz", - "integrity": "sha512-7hGaTstpUeTmQ008mCPkjz+GSlChWhucgy+PeX0z93v4+nh7qM5F+0lh+kJ9zo6Os5abO7v36GtgHRZdQI6+FQ==", + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-3.31.3.tgz", + "integrity": "sha512-QiwQqvaLFLm5EMFu5tg7nAgXJxCUiUTLD8EsK+TqVV5P4bqOoMOCM39khbhXTJyahCuYpiFWx5YOSDtC/JiPtg==", "license": "MIT", "dependencies": { "@types/use-sync-external-store": "^0.0.6", @@ -2950,12 +2993,12 @@ "url": "https://github.com/sponsors/ueberdosis" }, "optionalDependencies": { - "@tiptap/extension-bubble-menu": "^3.30.2", - "@tiptap/extension-floating-menu": "^3.30.2" + "@tiptap/extension-bubble-menu": "^3.31.3", + "@tiptap/extension-floating-menu": "^3.31.3" }, "peerDependencies": { - "@tiptap/core": "3.30.2", - "@tiptap/pm": "3.30.2", + "@tiptap/core": "3.31.3", + "@tiptap/pm": "3.31.3", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0", @@ -2963,41 +3006,56 @@ } }, "node_modules/@tiptap/starter-kit": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-3.30.2.tgz", - "integrity": "sha512-fJSrhW1CyD4sjYA20evSP4Cp13B/HhbxCdM974K0xpHOVqvCtNU9w2s9hfq9mg2yGoU7MSNHKNYMkJjIi2/Xyw==", - "license": "MIT", - "dependencies": { - "@tiptap/core": "3.30.2", - "@tiptap/extension-blockquote": "3.30.2", - "@tiptap/extension-bold": "3.30.2", - "@tiptap/extension-bullet-list": "3.30.2", - "@tiptap/extension-code": "3.30.2", - "@tiptap/extension-code-block": "3.30.2", - "@tiptap/extension-document": "3.30.2", - "@tiptap/extension-dropcursor": "3.30.2", - "@tiptap/extension-gapcursor": "3.30.2", - "@tiptap/extension-hard-break": "3.30.2", - "@tiptap/extension-heading": "3.30.2", - "@tiptap/extension-horizontal-rule": "3.30.2", - "@tiptap/extension-italic": "3.30.2", - "@tiptap/extension-link": "3.30.2", - "@tiptap/extension-list": "3.30.2", - "@tiptap/extension-list-item": "3.30.2", - "@tiptap/extension-list-keymap": "3.30.2", - "@tiptap/extension-ordered-list": "3.30.2", - "@tiptap/extension-paragraph": "3.30.2", - "@tiptap/extension-strike": "3.30.2", - "@tiptap/extension-text": "3.30.2", - "@tiptap/extension-underline": "3.30.2", - "@tiptap/extensions": "3.30.2", - "@tiptap/pm": "3.30.2" + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-3.31.3.tgz", + "integrity": "sha512-WKof9RewdmGHvWJ1wn0/HVNG2mV+HOgVRyJkKekuM9fgr6BZAAH/xZsWE1eon+94JnQ+KtK2ThydXQM/qc6b2A==", + "license": "MIT", + "dependencies": { + "@tiptap/core": "3.31.3", + "@tiptap/extension-blockquote": "3.31.3", + "@tiptap/extension-bold": "3.31.3", + "@tiptap/extension-bullet-list": "3.31.3", + "@tiptap/extension-code": "3.31.3", + "@tiptap/extension-code-block": "3.31.3", + "@tiptap/extension-document": "3.31.3", + "@tiptap/extension-dropcursor": "3.31.3", + "@tiptap/extension-gapcursor": "3.31.3", + "@tiptap/extension-hard-break": "3.31.3", + "@tiptap/extension-heading": "3.31.3", + "@tiptap/extension-horizontal-rule": "3.31.3", + "@tiptap/extension-italic": "3.31.3", + "@tiptap/extension-link": "3.31.3", + "@tiptap/extension-list": "3.31.3", + "@tiptap/extension-list-item": "3.31.3", + "@tiptap/extension-list-keymap": "3.31.3", + "@tiptap/extension-ordered-list": "3.31.3", + "@tiptap/extension-paragraph": "3.31.3", + "@tiptap/extension-strike": "3.31.3", + "@tiptap/extension-text": "3.31.3", + "@tiptap/extension-underline": "3.31.3", + "@tiptap/extensions": "3.31.3", + "@tiptap/pm": "3.31.3" }, "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" } }, + "node_modules/@tiptap/suggestion": { + "version": "3.31.3", + "resolved": "https://registry.npmjs.org/@tiptap/suggestion/-/suggestion-3.31.3.tgz", + "integrity": "sha512-z1OQ/Yx6seMZehi1AcmNkyJ8qkHQzybArmCyRdmreS4YL9C4bPMBe5lbMfFsArYs+KD5JyHwps5j7J/YE5BIuw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@floating-ui/dom": "^1.0.0", + "@tiptap/core": "3.31.3", + "@tiptap/pm": "3.31.3" + } + }, "node_modules/@types/d3-array": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", @@ -3041,9 +3099,9 @@ } }, "node_modules/@types/d3-shape": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", - "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-kVd74ta9eof3eJOvbNd1vGKS/XERRyQbT26Og63hIsvDO84cjD5gEOhsXf26w3FSoNlPVz84DOFcKv/oou+fMw==", "license": "MIT", "dependencies": { "@types/d3-path": "*" @@ -3062,14 +3120,14 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.13.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", - "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", + "version": "26.4.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.4.1.tgz", + "integrity": "sha512-k97ENvZWtvA6yqz5/FS6a7duDgOPEeOQOc2iKS/nY6mX6qJUKtLnWzQS+Xj6tXweyj6ZcTAK2Qecetnvi9nCLA==", "devOptional": true, "license": "MIT", "peer": true, "dependencies": { - "undici-types": "~7.18.0" + "undici-types": "~8.3.0" } }, "node_modules/@types/react": { @@ -3083,9 +3141,9 @@ } }, "node_modules/@types/react-dom": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz", - "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.7.tgz", + "integrity": "sha512-I8bPpDLcHBv1qiIiXDCy71Rt8eQDKJP0sMSWJphDdAcdqiJ1sGpZamavoEIRZmYzjia9LuEb2HlYdDpmoENpvQ==", "license": "MIT", "peer": true, "peerDependencies": { @@ -3098,10 +3156,351 @@ "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", "license": "MIT" }, + "node_modules/@typescript/typescript-aix-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-aix-ppc64/-/typescript-aix-ppc64-7.0.2.tgz", + "integrity": "sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-darwin-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-arm64/-/typescript-darwin-arm64-7.0.2.tgz", + "integrity": "sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-darwin-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-x64/-/typescript-darwin-x64-7.0.2.tgz", + "integrity": "sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-freebsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-arm64/-/typescript-freebsd-arm64-7.0.2.tgz", + "integrity": "sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-freebsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-x64/-/typescript-freebsd-x64-7.0.2.tgz", + "integrity": "sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-arm": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm/-/typescript-linux-arm-7.0.2.tgz", + "integrity": "sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm64/-/typescript-linux-arm64-7.0.2.tgz", + "integrity": "sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-loong64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-loong64/-/typescript-linux-loong64-7.0.2.tgz", + "integrity": "sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-mips64el": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-mips64el/-/typescript-linux-mips64el-7.0.2.tgz", + "integrity": "sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-ppc64/-/typescript-linux-ppc64-7.0.2.tgz", + "integrity": "sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-riscv64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-riscv64/-/typescript-linux-riscv64-7.0.2.tgz", + "integrity": "sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-s390x": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-s390x/-/typescript-linux-s390x-7.0.2.tgz", + "integrity": "sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-x64/-/typescript-linux-x64-7.0.2.tgz", + "integrity": "sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-netbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-arm64/-/typescript-netbsd-arm64-7.0.2.tgz", + "integrity": "sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-netbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-x64/-/typescript-netbsd-x64-7.0.2.tgz", + "integrity": "sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-openbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-arm64/-/typescript-openbsd-arm64-7.0.2.tgz", + "integrity": "sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-openbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-x64/-/typescript-openbsd-x64-7.0.2.tgz", + "integrity": "sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-sunos-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-sunos-x64/-/typescript-sunos-x64-7.0.2.tgz", + "integrity": "sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-win32-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-arm64/-/typescript-win32-arm64-7.0.2.tgz", + "integrity": "sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-win32-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-x64/-/typescript-win32-x64-7.0.2.tgz", + "integrity": "sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16.20.0" + } + }, "node_modules/@vitejs/plugin-react": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.5.tgz", - "integrity": "sha512-BOVzne/NL162sMdResB25mUv+vWMF5NoAjNf09TeGlE7ZpszZWSD3winycicLJw72yeVsoCn/2kOhEuCvEShMA==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.1.1.tgz", + "integrity": "sha512-yxLaQV9gkhS8ezJqCM6+ndU7mDY6gqAg75NQ+0IjwEI8IYOmQCgkRwHKVSfWXW076DsqMo0Dk+0FK1U+M5RgFw==", + "dev": true, "license": "MIT", "dependencies": { "@rolldown/pluginutils": "^1.0.1" @@ -3112,6 +3511,7 @@ "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": { @@ -3120,111 +3520,114 @@ }, "babel-plugin-react-compiler": { "optional": true + }, + "oxc-transform-react": { + "optional": true } } }, "node_modules/@zag-js/anatomy": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/@zag-js/anatomy/-/anatomy-1.43.1.tgz", - "integrity": "sha512-ypfnye/hPBGmMjJVEFA7+YbsxMz4P+bVFjUNWc+Gf+4q0ia2x3CZsqPCrO02xx8qgX5KTirOunlzThTgkUY3vw==", + "version": "1.43.3", + "resolved": "https://registry.npmjs.org/@zag-js/anatomy/-/anatomy-1.43.3.tgz", + "integrity": "sha512-KzosWgu0TTtdBNHPUZg2W8E5JsGsExQ8oGkLDmV6Sym9twaATU2YVMCWsfitq3Isss4099wNMsHdjEPK2UyCjw==", "license": "MIT" }, "node_modules/@zag-js/core": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/@zag-js/core/-/core-1.43.1.tgz", - "integrity": "sha512-P6wDhPgXxjBn+BFGjZcSDP7rNLpV8Pr8mySVj47BZv8zaCLYf4o9uqV1f5ns7m3LJ1x0e7s20sqw5rzlWPXHRw==", + "version": "1.43.3", + "resolved": "https://registry.npmjs.org/@zag-js/core/-/core-1.43.3.tgz", + "integrity": "sha512-afREBcZWvPLHz/2AxJeuAP2o6+o3V7NZO/MutLhdclKaVSBlPzCr6qqP9k8hq1zOxk1jogKT5VVGielzWDY2Dw==", "license": "MIT", "dependencies": { - "@zag-js/dom-query": "1.43.1", - "@zag-js/utils": "1.43.1" + "@zag-js/dom-query": "1.43.3", + "@zag-js/utils": "1.43.3" } }, "node_modules/@zag-js/date-picker": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/@zag-js/date-picker/-/date-picker-1.43.1.tgz", - "integrity": "sha512-Xu83Of2hO6c4h1mDU8Kehi+eGqSxDnm49oyMhslV41ejBfBeiZOZCQLZpUauTacn1U85WZrscXQxkBZyJE+KEQ==", + "version": "1.43.3", + "resolved": "https://registry.npmjs.org/@zag-js/date-picker/-/date-picker-1.43.3.tgz", + "integrity": "sha512-2nQZsMkb1EddF6qTvjinsrZdZbXcor+VluniK85bg9JQsA4WvtkmIHpy/pMQQ6zS8i9fbMBYbYH7bQVbfk2JtA==", "license": "MIT", "dependencies": { - "@zag-js/anatomy": "1.43.1", - "@zag-js/core": "1.43.1", - "@zag-js/date-utils": "1.43.1", - "@zag-js/dismissable": "1.43.1", - "@zag-js/dom-query": "1.43.1", - "@zag-js/live-region": "1.43.1", - "@zag-js/popper": "1.43.1", - "@zag-js/types": "1.43.1", - "@zag-js/utils": "1.43.1" + "@zag-js/anatomy": "1.43.3", + "@zag-js/core": "1.43.3", + "@zag-js/date-utils": "1.43.3", + "@zag-js/dismissable": "1.43.3", + "@zag-js/dom-query": "1.43.3", + "@zag-js/live-region": "1.43.3", + "@zag-js/popper": "1.43.3", + "@zag-js/types": "1.43.3", + "@zag-js/utils": "1.43.3" }, "peerDependencies": { "@internationalized/date": ">=3.0.0" } }, "node_modules/@zag-js/date-utils": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/@zag-js/date-utils/-/date-utils-1.43.1.tgz", - "integrity": "sha512-JTCVzJbWUsu93ZtttIXi30Et2XJmXgCj73wdx/J0VgiXWcfG7HS2xyFvfIs49kxA6xPcJ5SxAg40rCfPuo+RbA==", + "version": "1.43.3", + "resolved": "https://registry.npmjs.org/@zag-js/date-utils/-/date-utils-1.43.3.tgz", + "integrity": "sha512-EUQ2OUJs7crXy3OOgt8DhI2pm/jH+5IF2hzxfI7YRiVuvBtL6YbzHAWrT+CpcMcJZwwMiM2WJ9+lph7V7SoyZQ==", "license": "MIT", "peerDependencies": { "@internationalized/date": ">=3.0.0" } }, "node_modules/@zag-js/dismissable": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/@zag-js/dismissable/-/dismissable-1.43.1.tgz", - "integrity": "sha512-LkKpguLvFC83Ry2VG8zBqdluADO/7b0Pwef5aBZFHYTevhh3v+AOJThqtc6a9vd55k8k0UL1X8JGos3NYU0n9w==", + "version": "1.43.3", + "resolved": "https://registry.npmjs.org/@zag-js/dismissable/-/dismissable-1.43.3.tgz", + "integrity": "sha512-3znmDAC6qv7I9h/ZInVE+sFxE2wcBeQhT0bEiUjXAlgFGgaVmgA6A0ElGI7CDrot8qhgC88BZQisMWfYRRWgeg==", "license": "MIT", "dependencies": { - "@zag-js/dom-query": "1.43.1", - "@zag-js/interact-outside": "1.43.1", - "@zag-js/utils": "1.43.1" + "@zag-js/dom-query": "1.43.3", + "@zag-js/interact-outside": "1.43.3", + "@zag-js/utils": "1.43.3" } }, "node_modules/@zag-js/dom-query": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/@zag-js/dom-query/-/dom-query-1.43.1.tgz", - "integrity": "sha512-EpxNajvnM5XfGKnKsJv0uWCA+4RbO/ve811IjZRyU56/H25JIitdmfWtqD6lhMtBkQuM6jkd5XEhkWWEJEXKeA==", + "version": "1.43.3", + "resolved": "https://registry.npmjs.org/@zag-js/dom-query/-/dom-query-1.43.3.tgz", + "integrity": "sha512-kpTTYMemMmHxhp4gyOllK7/Lf86AySTO+AlGds9iQM21eUwi1jvc9q3VTxP+qD/KwHePGftfPwkwxifC3iSGbw==", "license": "MIT", "dependencies": { - "@zag-js/types": "1.43.1" + "@zag-js/types": "1.43.3" } }, "node_modules/@zag-js/interact-outside": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/@zag-js/interact-outside/-/interact-outside-1.43.1.tgz", - "integrity": "sha512-KQCsiG2x1eYtf3BceYto3xKPbFpZP0weHcdxvOzr7Hcalrrlm4FcOn9KnfRYFWIVnF39CL8TAMptCnuoN8oAng==", + "version": "1.43.3", + "resolved": "https://registry.npmjs.org/@zag-js/interact-outside/-/interact-outside-1.43.3.tgz", + "integrity": "sha512-qgyAyWELSzFrHUtB6D7IzemI48NjX7E5oIDCXsz/DBPh+ybsK+pKMGsZkduTCK+uEqJcA/w+DAWaDUOxhjqvWA==", "license": "MIT", "dependencies": { - "@zag-js/dom-query": "1.43.1", - "@zag-js/utils": "1.43.1" + "@zag-js/dom-query": "1.43.3", + "@zag-js/utils": "1.43.3" } }, "node_modules/@zag-js/live-region": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/@zag-js/live-region/-/live-region-1.43.1.tgz", - "integrity": "sha512-Dy5kVWHJKwZSVH8HaTWvGJlc4+KLYfs81/vsnWm5sh1VR0Z+JhpXAwWfDUxbdPI64hIEMm5fFGZ5Zmo/bwCGzg==", + "version": "1.43.3", + "resolved": "https://registry.npmjs.org/@zag-js/live-region/-/live-region-1.43.3.tgz", + "integrity": "sha512-lB2ryGpRjTgbfJ5D86MQnvZRCJupKbpwS53jfCkEP0EBC9Tk7Crq9p0pobzXgH5U9fnjn4BPsqBSyuSOxPOJnw==", "license": "MIT" }, "node_modules/@zag-js/popper": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/@zag-js/popper/-/popper-1.43.1.tgz", - "integrity": "sha512-xqka/qkx3cdQ5lGH2xWqDKYGzAXcnvdfNTiQl8hSxDeyqcTTS8peitPscbikSBCT56i4dk5+72wKeDrSOuY9aw==", + "version": "1.43.3", + "resolved": "https://registry.npmjs.org/@zag-js/popper/-/popper-1.43.3.tgz", + "integrity": "sha512-99PPQerLylh+ouG16d0Go0UgpLR3rCQvWMmJoO5Ti8+2Ww3aqBNLTqpF0rJuLPe1Ps4BfEt5Lr4dYhL1ixgbRQ==", "license": "MIT", "dependencies": { "@floating-ui/dom": "^1.7.6", - "@zag-js/dom-query": "1.43.1", - "@zag-js/utils": "1.43.1" + "@zag-js/dom-query": "1.43.3", + "@zag-js/utils": "1.43.3" } }, "node_modules/@zag-js/react": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/@zag-js/react/-/react-1.43.1.tgz", - "integrity": "sha512-bSXhZqxuN/qzVJiDcIXDeDGOiJtrP4u7FXnZ1Jrwf0KlrlSIdq3sMQyzFHemcFxyt1fL7DCxwIqtcB1MfDCMHA==", + "version": "1.43.3", + "resolved": "https://registry.npmjs.org/@zag-js/react/-/react-1.43.3.tgz", + "integrity": "sha512-PVfq738OhicFsGOZNqrsBmdOHuh54XnIhkyJ9HSWDpzQcGHq4fuFWIvfmqW/5o/Xkj+JwFQLoIDVX/KHaUjcXA==", "license": "MIT", "dependencies": { - "@zag-js/core": "1.43.1", - "@zag-js/store": "1.43.1", - "@zag-js/types": "1.43.1", - "@zag-js/utils": "1.43.1" + "@zag-js/core": "1.43.3", + "@zag-js/store": "1.43.3", + "@zag-js/types": "1.43.3", + "@zag-js/utils": "1.43.3" }, "peerDependencies": { "react": ">=18.0.0", @@ -3232,53 +3635,29 @@ } }, "node_modules/@zag-js/store": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/@zag-js/store/-/store-1.43.1.tgz", - "integrity": "sha512-VazKYuNKXUb/bxoqAdfg1YXs8sO3UAoEMazAGJELMF2myxHdV0icE+a3LXbrhcZkwHh02SExY0kAdb2RI53WXg==", + "version": "1.43.3", + "resolved": "https://registry.npmjs.org/@zag-js/store/-/store-1.43.3.tgz", + "integrity": "sha512-NL3Uxk5Rszjd+X+cPXw0N7Kn5TNMyrS6cTMazlBOcN2+J68mzXhNFvM/0H38m0X+3ybK3sE5Ta6NPlhOQADRqw==", "license": "MIT", "dependencies": { "proxy-compare": "3.0.1" } }, "node_modules/@zag-js/types": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/@zag-js/types/-/types-1.43.1.tgz", - "integrity": "sha512-OOn9JRYoG7HmFmgqYL8qo1C6myZb5++cF5os/Mb4bqPWDYFUM12vHYlmaTNoG3ztypA1150YvEuIOpA4jacCww==", + "version": "1.43.3", + "resolved": "https://registry.npmjs.org/@zag-js/types/-/types-1.43.3.tgz", + "integrity": "sha512-QokzUgkJ7a/TRE8SAXqlm1XfiNDbyM8y+mx0PpmzHa8bvmWXLEe/Zx2TRz8aYoGim75NluYzDy3x+WWileF7uA==", "license": "MIT", "dependencies": { "csstype": "3.2.3" } }, "node_modules/@zag-js/utils": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/@zag-js/utils/-/utils-1.43.1.tgz", - "integrity": "sha512-EaHwhiNPCok4VAeBd508rvq64f+FsBrhEEJdytZA0Eo8AqP5SMp85dOfBjM98PSbfncmiykBYb4zS1hyyYpkgQ==", + "version": "1.43.3", + "resolved": "https://registry.npmjs.org/@zag-js/utils/-/utils-1.43.3.tgz", + "integrity": "sha512-9P9fvFFxuiDcLqX0BYgGNkf0/a/id32nHvQpwgv/Xv3b9n5yeyw2U8nKefpWr+1VfFsrpf2XMXiA2CDSWZgt2g==", "license": "MIT" }, - "node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/aria-hidden": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", @@ -3295,7 +3674,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-1.0.0.tgz", "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -3314,18 +3693,6 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "license": "ISC" }, - "node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/class-variance-authority": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", @@ -3338,20 +3705,6 @@ "url": "https://polar.sh/cva" } }, - "node_modules/cliui": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", - "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", - "license": "ISC", - "dependencies": { - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=20" - } - }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -3370,30 +3723,6 @@ "node": ">=16" } }, - "node_modules/concurrently": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-10.0.5.tgz", - "integrity": "sha512-JaP/CoftUrCcAFW/g//RbgEGwlelnEae6cfBLgH6ZdO6s8jPkn6p9SB9u6pdVxYXoiSnFqseOlHfrEfF82TVOg==", - "license": "MIT", - "dependencies": { - "chalk": "5.6.2", - "rxjs": "7.8.2", - "shell-quote": "1.9.0", - "supports-color": "10.2.2", - "tree-kill": "1.2.2", - "yargs": "18.0.0" - }, - "bin": { - "conc": "dist/bin/index.js", - "concurrently": "dist/bin/index.js" - }, - "engines": { - "node": ">=22" - }, - "funding": { - "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" - } - }, "node_modules/crelt": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.7.tgz", @@ -3401,16 +3730,16 @@ "license": "MIT" }, "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-6.0.0.tgz", + "integrity": "sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" + "css-what": "^7.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "nth-check": "^2.1.1" }, "funding": { "url": "https://github.com/sponsors/fb55" @@ -3430,9 +3759,9 @@ } }, "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-7.0.0.tgz", + "integrity": "sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==", "license": "BSD-2-Clause", "engines": { "node": ">= 6" @@ -3677,16 +4006,11 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT" - }, "node_modules/enhanced-resolve": { "version": "5.24.5", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", + "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -3709,24 +4033,17 @@ } }, "node_modules/es-toolkit": { - "version": "1.47.1", - "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.47.1.tgz", - "integrity": "sha512-5RAqEwf4P4E17p+W75KLOWw/nOvKZzSQpxM32IpI2KZLaVonjTrZ0Ai5ghMaVI9eKC2p8eoQgcBdkEDgzFk6+Q==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.52.0.tgz", + "integrity": "sha512-XTNEJQh1tY1ZJVcf6ayP/2n4ZPyaHlW2FWs7xvw5ddPuhUVjLD3olQVQS7kf58JbAB48iL0uL/jerTrjtV3lDA==", "license": "MIT", "workspaces": [ "docs", - "benchmarks" + "benchmarks", + "tests/types", + "tests/browser-compat" ] }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/eventemitter3": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", @@ -3734,9 +4051,9 @@ "license": "MIT" }, "node_modules/fast-equals": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.4.1.tgz", - "integrity": "sha512-DjlFSM5Pk9cGcL0q5QXl66eGzx0N6szNgaswwc5ZphlBohjTVJSnGgI+rJVOgOi65qUoQnDZN4nDqi33udtydQ==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.4.2.tgz", + "integrity": "sha512-Ywe6jodPTWOTL9/k0bV7gdfP8twKL5Y8I8CZ933fAY5gBekICZSUQTbyH6ut2NZCNyB05mSUwAuEqdEIaOOlDQ==", "license": "MIT", "engines": { "node": ">=6.0.0" @@ -3760,10 +4077,9 @@ } }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "hasInstallScript": true, "license": "MIT", "optional": true, @@ -3774,27 +4090,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-east-asian-width": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", - "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-nonce": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", @@ -3808,12 +4103,13 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, "license": "ISC" }, "node_modules/i18next": { - "version": "26.3.6", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-26.3.6.tgz", - "integrity": "sha512-Bu5Z2nAXgfVyM8xvW3jk9EKRIuX37PudsrBViThNFx7CR7aaYTpP01cxNB/E4c4UUzTDiAZRstEhsRfPOL/8xA==", + "version": "26.4.2", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-26.4.2.tgz", + "integrity": "sha512-RX+R0VLg13IbvRuJSxnqykUFS9vQZTl8wYpWPCIUDWVrSGjsQywB5Y+pjzrkboxGAuYfJZVH1InFTdgBdxq6ug==", "funding": [ { "type": "individual", @@ -3839,9 +4135,9 @@ } }, "node_modules/i18next-http-backend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-4.0.1.tgz", - "integrity": "sha512-O+7MwPCJIKCu68vho8JtD1HF8QHyMPzoChIDFfYCrpaDqX6oq3RqASujnpKEdnNCEOb+kLMOHTNTcGKpj7B1BA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-4.0.2.tgz", + "integrity": "sha512-oay62dIB2kL7+WHzoUXBjWfL3+mwijD3pQkQkIEaRLhy6kjXxUhrRenV0gInwlCASAaJaDy94+XvYizK+cAGdA==", "license": "MIT", "engines": { "node": ">=18" @@ -3880,32 +4176,12 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "devOptional": true, "license": "MIT", "bin": { "jiti": "lib/jiti-cli.mjs" } }, - "node_modules/laravel-echo": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/laravel-echo/-/laravel-echo-2.4.0.tgz", - "integrity": "sha512-8w0fAGSNt6THfbNyqdKc29bhfeNpJg13CGx2fcLgoX0/f0mTJm/AIkYTTakmcr9pc42ZB68cSoE00j4/xNaFGQ==", - "license": "MIT", - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "pusher-js": "*", - "socket.io-client": "*" - }, - "peerDependenciesMeta": { - "pusher-js": { - "optional": true - }, - "socket.io-client": { - "optional": true - } - } - }, "node_modules/laravel-precognition": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/laravel-precognition/-/laravel-precognition-2.0.0.tgz", @@ -3927,6 +4203,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-3.2.0.tgz", "integrity": "sha512-xSxY9Gzeb/eancd8WeK09piAFP+a6i5QIBqNCKNv9L0Eq6wziwzSem7F1GvMSrtjMh5F/QVKFxn8t9naGOA66A==", + "dev": true, "license": "MIT", "dependencies": { "picocolors": "^1.0.0", @@ -3953,6 +4230,7 @@ "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, "license": "MPL-2.0", "dependencies": { "detect-libc": "^2.0.3" @@ -3985,6 +4263,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -4005,6 +4284,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -4025,6 +4305,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -4045,6 +4326,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -4065,6 +4347,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -4085,6 +4368,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -4105,6 +4389,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -4125,6 +4410,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -4145,6 +4431,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -4165,6 +4452,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -4185,6 +4473,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -4208,6 +4497,7 @@ "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" @@ -4256,9 +4546,9 @@ "license": "MIT" }, "node_modules/oxfmt": { - "version": "0.64.0", - "resolved": "https://registry.npmjs.org/oxfmt/-/oxfmt-0.64.0.tgz", - "integrity": "sha512-XZ4GFBN/PLbXKq+0zrgpQfPKYuJlUuj+nzZJY7UpIbFMNyefNLCdN9EwViycNqnYcv0wrn0jXcQLlqJp8RCKBg==", + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/oxfmt/-/oxfmt-0.66.0.tgz", + "integrity": "sha512-FfvqR8RFtV6JJpRrpkfqyVCQ7HDvZ/VriWFx7veftCgL1B5ZO9qNr+1rvPieycMQnNfVG0PWyJQiy7p0hq1I5w==", "dev": true, "license": "MIT", "dependencies": { @@ -4271,28 +4561,28 @@ "node": "^20.19.0 || >=22.12.0" }, "funding": { - "url": "https://github.com/sponsors/Boshen" + "url": "https://github.com/sponsors/oxc-project" }, "optionalDependencies": { - "@oxfmt/binding-android-arm-eabi": "0.64.0", - "@oxfmt/binding-android-arm64": "0.64.0", - "@oxfmt/binding-darwin-arm64": "0.64.0", - "@oxfmt/binding-darwin-x64": "0.64.0", - "@oxfmt/binding-freebsd-x64": "0.64.0", - "@oxfmt/binding-linux-arm-gnueabihf": "0.64.0", - "@oxfmt/binding-linux-arm-musleabihf": "0.64.0", - "@oxfmt/binding-linux-arm64-gnu": "0.64.0", - "@oxfmt/binding-linux-arm64-musl": "0.64.0", - "@oxfmt/binding-linux-ppc64-gnu": "0.64.0", - "@oxfmt/binding-linux-riscv64-gnu": "0.64.0", - "@oxfmt/binding-linux-riscv64-musl": "0.64.0", - "@oxfmt/binding-linux-s390x-gnu": "0.64.0", - "@oxfmt/binding-linux-x64-gnu": "0.64.0", - "@oxfmt/binding-linux-x64-musl": "0.64.0", - "@oxfmt/binding-openharmony-arm64": "0.64.0", - "@oxfmt/binding-win32-arm64-msvc": "0.64.0", - "@oxfmt/binding-win32-ia32-msvc": "0.64.0", - "@oxfmt/binding-win32-x64-msvc": "0.64.0" + "@oxfmt/binding-android-arm-eabi": "0.66.0", + "@oxfmt/binding-android-arm64": "0.66.0", + "@oxfmt/binding-darwin-arm64": "0.66.0", + "@oxfmt/binding-darwin-x64": "0.66.0", + "@oxfmt/binding-freebsd-x64": "0.66.0", + "@oxfmt/binding-linux-arm-gnueabihf": "0.66.0", + "@oxfmt/binding-linux-arm-musleabihf": "0.66.0", + "@oxfmt/binding-linux-arm64-gnu": "0.66.0", + "@oxfmt/binding-linux-arm64-musl": "0.66.0", + "@oxfmt/binding-linux-ppc64-gnu": "0.66.0", + "@oxfmt/binding-linux-riscv64-gnu": "0.66.0", + "@oxfmt/binding-linux-riscv64-musl": "0.66.0", + "@oxfmt/binding-linux-s390x-gnu": "0.66.0", + "@oxfmt/binding-linux-x64-gnu": "0.66.0", + "@oxfmt/binding-linux-x64-musl": "0.66.0", + "@oxfmt/binding-openharmony-arm64": "0.66.0", + "@oxfmt/binding-win32-arm64-msvc": "0.66.0", + "@oxfmt/binding-win32-ia32-msvc": "0.66.0", + "@oxfmt/binding-win32-x64-msvc": "0.66.0" }, "peerDependencies": { "svelte": "^5.0.0", @@ -4308,9 +4598,9 @@ } }, "node_modules/oxlint": { - "version": "1.79.0", - "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.79.0.tgz", - "integrity": "sha512-hVJ9hq9m2unPS+Of4eJJgCPdIeCC+3DHEUX3tkmrPJr3OK2hz7PhXwgC+ZP71ZcYu8cCDEtQrqLxWNvxBppBVg==", + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.81.0.tgz", + "integrity": "sha512-HyrJYqeoOCL0iqaLEzGewGT48ZX99P3hxYh8udAF9RGGIghSamkXE4ClUyBpEDNqasamThgmlPbuMOe7SAZmHg==", "dev": true, "license": "MIT", "bin": { @@ -4320,28 +4610,28 @@ "node": "^20.19.0 || >=22.12.0" }, "funding": { - "url": "https://github.com/sponsors/Boshen" + "url": "https://github.com/sponsors/oxc-project" }, "optionalDependencies": { - "@oxlint/binding-android-arm-eabi": "1.79.0", - "@oxlint/binding-android-arm64": "1.79.0", - "@oxlint/binding-darwin-arm64": "1.79.0", - "@oxlint/binding-darwin-x64": "1.79.0", - "@oxlint/binding-freebsd-x64": "1.79.0", - "@oxlint/binding-linux-arm-gnueabihf": "1.79.0", - "@oxlint/binding-linux-arm-musleabihf": "1.79.0", - "@oxlint/binding-linux-arm64-gnu": "1.79.0", - "@oxlint/binding-linux-arm64-musl": "1.79.0", - "@oxlint/binding-linux-ppc64-gnu": "1.79.0", - "@oxlint/binding-linux-riscv64-gnu": "1.79.0", - "@oxlint/binding-linux-riscv64-musl": "1.79.0", - "@oxlint/binding-linux-s390x-gnu": "1.79.0", - "@oxlint/binding-linux-x64-gnu": "1.79.0", - "@oxlint/binding-linux-x64-musl": "1.79.0", - "@oxlint/binding-openharmony-arm64": "1.79.0", - "@oxlint/binding-win32-arm64-msvc": "1.79.0", - "@oxlint/binding-win32-ia32-msvc": "1.79.0", - "@oxlint/binding-win32-x64-msvc": "1.79.0" + "@oxlint/binding-android-arm-eabi": "1.81.0", + "@oxlint/binding-android-arm64": "1.81.0", + "@oxlint/binding-darwin-arm64": "1.81.0", + "@oxlint/binding-darwin-x64": "1.81.0", + "@oxlint/binding-freebsd-x64": "1.81.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.81.0", + "@oxlint/binding-linux-arm-musleabihf": "1.81.0", + "@oxlint/binding-linux-arm64-gnu": "1.81.0", + "@oxlint/binding-linux-arm64-musl": "1.81.0", + "@oxlint/binding-linux-ppc64-gnu": "1.81.0", + "@oxlint/binding-linux-riscv64-gnu": "1.81.0", + "@oxlint/binding-linux-riscv64-musl": "1.81.0", + "@oxlint/binding-linux-s390x-gnu": "1.81.0", + "@oxlint/binding-linux-x64-gnu": "1.81.0", + "@oxlint/binding-linux-x64-musl": "1.81.0", + "@oxlint/binding-openharmony-arm64": "1.81.0", + "@oxlint/binding-win32-arm64-msvc": "1.81.0", + "@oxlint/binding-win32-ia32-msvc": "1.81.0", + "@oxlint/binding-win32-x64-msvc": "1.81.0" }, "peerDependencies": { "oxlint-tsgolint": ">=7.0.2001", @@ -4363,9 +4653,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "license": "MIT", "peer": true, "engines": { @@ -4376,28 +4666,25 @@ } }, "node_modules/playwright": { - "version": "1.62.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.62.1.tgz", - "integrity": "sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg==", + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.63.0.tgz", + "integrity": "sha512-+7ziBLidS4NaNCdt57SUDT+wYmmd5fmiQejUic/kb+YsYSCPyOOE9sebzMjNmQrsnNpDJqd4WHvV/8lfKfUDUg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.62.1" + "playwright-core": "1.63.0" }, "bin": { "playwright": "cli.js" }, "engines": { "node": ">=20" - }, - "optionalDependencies": { - "fsevents": "2.3.2" } }, "node_modules/playwright-core": { - "version": "1.62.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.62.1.tgz", - "integrity": "sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==", + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.63.0.tgz", + "integrity": "sha512-rYCsBF/M5HjUch52bbtVONEFjv6Xu8sm8h72dNlR5bzIE1fvC/bxgspzkjSfU+MweEMmPM8KJebG6nnyxo5mCg==", "dev": true, "license": "Apache-2.0", "bin": { @@ -4408,9 +4695,9 @@ } }, "node_modules/postcss": { - "version": "8.5.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", - "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "version": "8.5.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", + "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", "funding": [ { "type": "opencollective", @@ -4427,7 +4714,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.17", + "nanoid": "^3.3.18", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -4436,9 +4723,9 @@ } }, "node_modules/prosemirror-changeset": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.4.1.tgz", - "integrity": "sha512-96WBLhOaYhJ+kPhLg3uW359Tz6I/MfcrQfL4EGv4SrcqKEMC1gmoGrXHecPE8eOwTVCJ4IwgfzM8fFad25wNfw==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.4.2.tgz", + "integrity": "sha512-ViYrjMSg3YFiXwIhKaluu+/mi3Yrxt6AR8ri14ulTaGcZtXO1CThl7A2gv79qx5fQnOw8woKwyBU2u+9PVCm3w==", "license": "MIT", "dependencies": { "prosemirror-transform": "^1.0.0" @@ -4555,18 +4842,18 @@ } }, "node_modules/prosemirror-transform": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.12.0.tgz", - "integrity": "sha512-GxboyN4AMIsoHNtz5uf2r2Ru551i5hWeCMD6E2Ib4Eogqoub0NflniaBPVQ4MrGE5yZ8JV9tUHg9qcZTTrcN4w==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.12.1.tgz", + "integrity": "sha512-t4F5615FycnCqsX7ShTUs8+jfnwcf46kuFRvSl/3qFx2QTZ4DjgowesLHQXcFP7G//TjesqZG3WtgL7vdyVJyA==", "license": "MIT", "dependencies": { "prosemirror-model": "^1.21.0" } }, "node_modules/prosemirror-view": { - "version": "1.42.2", - "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.42.2.tgz", - "integrity": "sha512-Pdg0l5kXm8aLDquFAnQFTCITg0q44sLqBlHlpsVLD9segdOao8TOfQdAhCrCXyVgPSRr6UDDROOIWA3bIrN9YQ==", + "version": "1.42.3", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.42.3.tgz", + "integrity": "sha512-oTN7EtH+CpwxU9NrwEYWd0UZ4JUx7l048l5A2Xppm4p/60isZYLnth9QVQmC3VRIvdrIWCxwZSd+Uz791G31/w==", "license": "MIT", "dependencies": { "prosemirror-model": "^1.25.8", @@ -4607,9 +4894,9 @@ } }, "node_modules/react-colorful": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.8.0.tgz", - "integrity": "sha512-Wy9OzPfjSN9bF12OB8N7UQvlsZ0I+7wHxpN+bV5BjNQGxOj6IiwkRjevJK9yOBjJWGQvAaf1OXtn8rUeEatAng==", + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.8.1.tgz", + "integrity": "sha512-oz68bhsnFWnpDf1ZR8daiQbYpXUnM2h2J6hl9Zg2rTpM/DU6vCqe1E+CpqmqLnJucMZetHZeifSAfJ+geN9lcA==", "license": "MIT", "peerDependencies": { "react": ">=16.8.0", @@ -4782,12 +5069,12 @@ "license": "MIT" }, "node_modules/rolldown": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.5.tgz", - "integrity": "sha512-VD2IE5PUG4Oj8zz2VGykiYd5wbnjdIiSsNQb8Qu5B+noEp+A78mu2iVvpp27g8es14Tk9rofNs5Tku9iQCS4fA==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.7.tgz", + "integrity": "sha512-g0EtLvBjTUB7jhyV0S/TCup3v/XSVl45vUIGbOGU4QPiyjTenCe4mKuFvW9fEgYmS2Fo42AUssRmNuMziXdrig==", "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.146.0", + "@oxc-project/types": "=0.148.0", "@rolldown/pluginutils": "^1.0.0" }, "bin": { @@ -4797,21 +5084,21 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm-eabi": "1.2.5", - "@rolldown/binding-android-arm64": "1.2.5", - "@rolldown/binding-darwin-arm64": "1.2.5", - "@rolldown/binding-darwin-x64": "1.2.5", - "@rolldown/binding-freebsd-x64": "1.2.5", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.5", - "@rolldown/binding-linux-arm64-gnu": "1.2.5", - "@rolldown/binding-linux-arm64-musl": "1.2.5", - "@rolldown/binding-linux-ppc64-gnu": "1.2.5", - "@rolldown/binding-linux-s390x-gnu": "1.2.5", - "@rolldown/binding-linux-x64-gnu": "1.2.5", - "@rolldown/binding-linux-x64-musl": "1.2.5", - "@rolldown/binding-openharmony-arm64": "1.2.5", - "@rolldown/binding-win32-arm64-msvc": "1.2.5", - "@rolldown/binding-win32-x64-msvc": "1.2.5" + "@rolldown/binding-android-arm-eabi": "1.2.7", + "@rolldown/binding-android-arm64": "1.2.7", + "@rolldown/binding-darwin-arm64": "1.2.7", + "@rolldown/binding-darwin-x64": "1.2.7", + "@rolldown/binding-freebsd-x64": "1.2.7", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.7", + "@rolldown/binding-linux-arm64-gnu": "1.2.7", + "@rolldown/binding-linux-arm64-musl": "1.2.7", + "@rolldown/binding-linux-ppc64-gnu": "1.2.7", + "@rolldown/binding-linux-s390x-gnu": "1.2.7", + "@rolldown/binding-linux-x64-gnu": "1.2.7", + "@rolldown/binding-linux-x64-musl": "1.2.7", + "@rolldown/binding-openharmony-arm64": "1.2.7", + "@rolldown/binding-win32-arm64-msvc": "1.2.7", + "@rolldown/binding-win32-x64-msvc": "1.2.7" } }, "node_modules/rope-sequence": { @@ -4820,15 +5107,6 @@ "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==", "license": "MIT" }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, "node_modules/sax": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz", @@ -4844,18 +5122,6 @@ "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", "license": "MIT" }, - "node_modules/shell-quote": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.9.0.tgz", - "integrity": "sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -4865,69 +5131,25 @@ "node": ">=0.10.0" } }, - "node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/style-mod": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz", "integrity": "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==", "license": "MIT" }, - "node_modules/supports-color": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", - "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/svgo": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.2.tgz", - "integrity": "sha512-ekx94z1rRc5LDi6oSUaeRnYhd0UOJxdtQCL2rF8xpWxD3TPAsISWOrxezqGovqS38GRZOdpDfvQe3ts6F7nsng==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.1.0.tgz", + "integrity": "sha512-bkxnTg1kSU0guhIBmibA6UUhrQmPVA1XsQLN+ylCd+UWzbnLkySOcXpyk1mrl05f+pcaCx2eHb+sp6BgMZWX+Q==", "license": "MIT", "dependencies": { "commander": "^11.1.0", - "css-select": "^5.1.0", + "css-select": "^6.0.0", "css-tree": "^3.0.1", - "css-what": "^6.1.0", + "css-what": "^7.0.0", "csso": "^5.0.5", "picocolors": "^1.1.1", - "sax": "^1.5.0" + "sax": "1.6.1" }, "bin": { "svgo": "bin/svgo.js" @@ -4954,12 +5176,14 @@ "version": "4.3.3", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz", "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==", + "dev": true, "license": "MIT" }, "node_modules/tapable": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -5001,15 +5225,6 @@ "node": "^20.0.0 || >=22.0.0" } }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "license": "MIT", - "bin": { - "tree-kill": "cli.js" - } - }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -5023,23 +5238,45 @@ "license": "Unlicense" }, "node_modules/typescript": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", - "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-7.0.2.tgz", + "integrity": "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==", + "devOptional": true, "license": "Apache-2.0", "peer": true, "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "tsc": "bin/tsc" }, "engines": { - "node": ">=14.17" + "node": ">=16.20.0" + }, + "optionalDependencies": { + "@typescript/typescript-aix-ppc64": "7.0.2", + "@typescript/typescript-darwin-arm64": "7.0.2", + "@typescript/typescript-darwin-x64": "7.0.2", + "@typescript/typescript-freebsd-arm64": "7.0.2", + "@typescript/typescript-freebsd-x64": "7.0.2", + "@typescript/typescript-linux-arm": "7.0.2", + "@typescript/typescript-linux-arm64": "7.0.2", + "@typescript/typescript-linux-loong64": "7.0.2", + "@typescript/typescript-linux-mips64el": "7.0.2", + "@typescript/typescript-linux-ppc64": "7.0.2", + "@typescript/typescript-linux-riscv64": "7.0.2", + "@typescript/typescript-linux-s390x": "7.0.2", + "@typescript/typescript-linux-x64": "7.0.2", + "@typescript/typescript-netbsd-arm64": "7.0.2", + "@typescript/typescript-netbsd-x64": "7.0.2", + "@typescript/typescript-openbsd-arm64": "7.0.2", + "@typescript/typescript-openbsd-x64": "7.0.2", + "@typescript/typescript-sunos-x64": "7.0.2", + "@typescript/typescript-win32-arm64": "7.0.2", + "@typescript/typescript-win32-x64": "7.0.2" } }, "node_modules/undici-types": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", - "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", + "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", "devOptional": true, "license": "MIT" }, @@ -5118,16 +5355,16 @@ } }, "node_modules/vite": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.1.tgz", - "integrity": "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", + "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", "license": "MIT", "peer": true, "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.5", - "postcss": "^8.5.25", - "rolldown": "~1.2.1", + "postcss": "^8.5.26", + "rolldown": "~1.2.4", "tinyglobby": "^0.2.17" }, "bin": { @@ -5144,7 +5381,7 @@ }, "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", @@ -5199,6 +5436,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.2.0.tgz", "integrity": "sha512-kz18NW79x0IHbxRSHm0jttP4zoO9P9gXh+n6UTwlNKnviTTEpOlum6oS9SmecrTtSr+muHEn5TUuC75UovQzcA==", + "dev": true, "license": "MIT", "dependencies": { "picocolors": "^1.0.0", @@ -5209,6 +5447,7 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, "license": "MIT", "engines": { "node": ">=8.6" @@ -5217,20 +5456,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/vite/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/vite/node_modules/lightningcss": { "version": "1.33.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", @@ -5485,58 +5710,6 @@ "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", "license": "MIT" - }, - "node_modules/wrap-ansi": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", - "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", - "license": "MIT", - "dependencies": { - "cliui": "^9.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "string-width": "^7.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^22.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" - } - }, - "node_modules/yargs-parser": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", - "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", - "license": "ISC", - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" - } } } } diff --git a/package.json b/package.json index 399bd40..f46a140 100644 --- a/package.json +++ b/package.json @@ -4,42 +4,40 @@ "type": "module", "scripts": { "build": "vite build", - "build:ssr": "vite build && vite build --ssr", "dev": "vite", - "format": "oxfmt --write \"resources/js/**/*.{ts,tsx}\" \"!resources/js/types/sprite-icons.ts\"", - "format:check": "oxfmt --check \"resources/js/**/*.{ts,tsx}\" \"!resources/js/types/sprite-icons.ts\"", + "format": "oxfmt --write \"resources/js/**/*.{ts,tsx}\" \"!resources/js/types/sprite-icons.ts\" \"**/*.md\"", + "format:check": "oxfmt --check \"resources/js/**/*.{ts,tsx}\" \"!resources/js/types/sprite-icons.ts\" \"**/*.md\"", "lint": "oxlint resources/js --fix", "lint:check": "oxlint resources/js", "types:check": "tsc --noEmit" }, "devDependencies": { - "@laravel/vite-plugin-wayfinder": "^0.1.3", - "@types/node": "^24.13.3", + "@inertiajs/vite": "^3.7.0", + "@tailwindcss/vite": "^4.3.3", + "@types/node": "^26.4.1", + "@types/react": "^19.2.18", + "@types/react-dom": "^19.2.7", + "@vitejs/plugin-react": "^6.1.1", "babel-plugin-react-compiler": "^1.0.0", - "oxfmt": "^0.64.0", - "oxlint": "^1.79.0", - "playwright": "^1.62.1" + "laravel-vite-plugin": "^3.2.0", + "oxfmt": "^0.66.0", + "oxlint": "^1.81.0", + "playwright": "^1.62.1", + "tailwindcss": "^4.3.3", + "typescript": "^7.0.2", + "vite": "^8.2.2" }, "dependencies": { + "@fontsource-variable/instrument-sans": "^5.3.0", "@inertiajs/react": "^3.7.0", - "@inertiajs/vite": "^3.7.0", "@laravel/echo-react": "^2.4.0", "@laravel/passkeys": "^0.4.0", - "@lattice-php/core": "^0.59.0", - "@lattice-php/lattice": "^0.59.0", - "@lattice-php/ui": "^0.59.0", - "@tailwindcss/vite": "^4.3.3", - "@types/react": "^19.2.18", - "@types/react-dom": "^19.2.4", - "@vitejs/plugin-react": "^6.0.5", - "concurrently": "^10.0.5", - "laravel-echo": "^2.4.0", - "laravel-vite-plugin": "^3.2.0", + "@lattice-php/core": "^0.72.2", + "@lattice-php/form": "^0.72.2", + "@lattice-php/lattice": "^0.72.2", + "@lattice-php/ui": "^0.72.2", "pusher-js": "^8.6.0", "react": "^19.2.8", - "react-dom": "^19.2.8", - "tailwindcss": "^4.3.3", - "typescript": "^6.0.3", - "vite": "^8.2.1" + "react-dom": "^19.2.8" } } diff --git a/phpstan.neon b/phpstan.neon index 5b69ce0..b574b9e 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -1,11 +1,15 @@ includes: - vendor/larastan/larastan/extension.neon - vendor/nesbot/carbon/extension.neon + - vendor/pestphp/pest-plugin-phpstan/extension.neon parameters: paths: - app/ + - tests/ + + tmpDir: .phpstan-cache # Level 10 is the highest level - level: 5 + level: 8 diff --git a/rector.php b/rector.php new file mode 100644 index 0000000..4a9929c --- /dev/null +++ b/rector.php @@ -0,0 +1,31 @@ +withPaths([ + __DIR__.'/app', + __DIR__.'/tests', + ]) + ->withCache(__DIR__.'/.rector-cache') + ->withPhpVersion(PhpVersion::PHP_84) + ->withSets([ + PestSetList::CODING_STYLE, + LevelSetList::UP_TO_PHP_84, + LaravelSetList::LARAVEL_130, + LaravelSetList::LARAVEL_CODE_QUALITY, + ]) + ->withSkip([ + AppToResolveRector::class, + // Rewrites Event::dispatch() into event(new \Fully\Qualified) — a + // fully qualified name inline reads worse than the static call. + DispatchToHelperFunctionsRector::class, + ]); diff --git a/resources/css/app.css b/resources/css/app.css index 99e21db..da792a3 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -1,18 +1,25 @@ @import 'tailwindcss'; @import '@lattice-php/lattice/css'; +@import '@fontsource-variable/instrument-sans/wght.css'; @source '../views'; @source '../../vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php'; @custom-variant dark (&:is(.dark *)); -@theme { - --font-sans: - 'Instrument Sans', ui-sans-serif, system-ui, sans-serif, +/* + * Lattice owns the design tokens (--lt-*, cascade-layered defaults); unlayered + * overrides here win regardless of import order. + */ +:root { + --lt-font-sans: + 'Instrument Sans Variable', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; +} +@theme { /* Bigger type scale — overrides lattice's compact default --text-* tokens. */ --text-xs: 0.75rem; --text-xs--line-height: 1rem; diff --git a/resources/js/components/passkey-registration.tsx b/resources/js/components/passkey-registration.tsx index b8d930c..c7fe612 100644 --- a/resources/js/components/passkey-registration.tsx +++ b/resources/js/components/passkey-registration.tsx @@ -1,13 +1,8 @@ import { usePasskeyRegister } from "@laravel/passkeys/react"; import type { RendererComponent } from "@lattice-php/lattice"; -import { Button, Input, InputError, Label, useT } from "@lattice-php/ui"; -import { useState } from "react"; - -declare module "@lattice-php/core" { - interface ComponentProps { - "settings.passkey-registration": Record; - } -} +import { Input, InputError, Label } from "@lattice-php/form"; +import { Button, useT } from "@lattice-php/ui"; +import { type FormEvent, useState } from "react"; function suggestedPasskeyName(connector: string): string { const ua = navigator.userAgent; @@ -41,7 +36,7 @@ const PasskeyRegistration: RendererComponent<"settings.passkey-registration"> = }, }); - async function handleSubmit(event: React.FormEvent): Promise { + async function handleSubmit(event: FormEvent): Promise { event.preventDefault(); if (name.trim()) { diff --git a/resources/js/components/passkey-verify.tsx b/resources/js/components/passkey-verify.tsx index ffc46fb..bf7d11e 100644 --- a/resources/js/components/passkey-verify.tsx +++ b/resources/js/components/passkey-verify.tsx @@ -2,28 +2,17 @@ import type { UrlMethodPair } from "@inertiajs/core"; import { router } from "@inertiajs/react"; import { usePasskeyVerify } from "@laravel/passkeys/react"; import type { RendererComponent } from "@lattice-php/lattice"; -import { Button, IconRenderer, InputError, Spinner, useT } from "@lattice-php/ui"; - -declare module "@lattice-php/core" { - interface ComponentProps { - "auth.passkey-verify": { - label?: string; - loadingLabel?: string; - optionsUrl?: string; - separator?: string; - submitUrl?: string; - }; - } -} +import { InputError } from "@lattice-php/form"; +import { Button, IconRenderer, Spinner, useT } from "@lattice-php/ui"; type PasskeyVerifyProps = { routes?: { options: UrlMethodPair; submit: UrlMethodPair; }; - label?: string; - loadingLabel?: string; - separator?: string; + label?: string | null; + loadingLabel?: string | null; + separator?: string | null; }; function PasskeyVerify({ routes, label, loadingLabel, separator }: PasskeyVerifyProps = {}) { diff --git a/resources/js/lattice/generated.d.ts b/resources/js/lattice/generated.d.ts new file mode 100644 index 0000000..a4d07d1 --- /dev/null +++ b/resources/js/lattice/generated.d.ts @@ -0,0 +1,15 @@ +// This file is generated by `php artisan lattice:typescript`. Do not edit. +declare module "@lattice-php/core" { + interface ComponentProps { + "auth.passkey-verify": { + label: string | null; + loadingLabel: string | null; + optionsUrl: string; + separator: string | null; + submitUrl: string; + }; + "settings.passkey-registration": Record; + } +} + +export {}; diff --git a/resources/js/types/sprite-icons.ts b/resources/js/types/sprite-icons.ts index af04c55..14f4eb9 100644 --- a/resources/js/types/sprite-icons.ts +++ b/resources/js/types/sprite-icons.ts @@ -6,6 +6,8 @@ export const iconNames = [ "align-left", "align-right", "arrow-down", + "arrow-left-to-line", + "arrow-right-to-line", "arrow-up", "bell", "bold", @@ -22,6 +24,7 @@ export const iconNames = [ "clock", "code", "code-xml", + "columns-2", "columns-3", "copy", "corner-down-right", @@ -34,11 +37,17 @@ export const iconNames = [ "heading-1", "heading-2", "heading-3", + "heading-4", + "heading-5", + "heading-6", "highlighter", + "image", + "images", "info", "italic", "key-round", "layout-dashboard", + "layout-template", "link", "list", "list-ordered", @@ -48,21 +57,26 @@ export const iconNames = [ "logo", "minus", "more-horizontal", + "move-vertical", "panel-left", "pencil", "pencil-line", + "pilcrow", "plus", "quote", + "redo-2", "rotate-ccw", "rows-3", "search", "send", "settings", "smile", + "square", "strikethrough", "table", "trash-2", "underline", + "undo-2", "users", "x", ] as const; @@ -76,6 +90,8 @@ declare module "@lattice-php/ui" { "align-left": true; "align-right": true; "arrow-down": true; + "arrow-left-to-line": true; + "arrow-right-to-line": true; "arrow-up": true; bell: true; bold: true; @@ -92,6 +108,7 @@ declare module "@lattice-php/ui" { clock: true; code: true; "code-xml": true; + "columns-2": true; "columns-3": true; copy: true; "corner-down-right": true; @@ -104,11 +121,17 @@ declare module "@lattice-php/ui" { "heading-1": true; "heading-2": true; "heading-3": true; + "heading-4": true; + "heading-5": true; + "heading-6": true; highlighter: true; + image: true; + images: true; info: true; italic: true; "key-round": true; "layout-dashboard": true; + "layout-template": true; link: true; list: true; "list-ordered": true; @@ -118,21 +141,26 @@ declare module "@lattice-php/ui" { logo: true; minus: true; "more-horizontal": true; + "move-vertical": true; "panel-left": true; pencil: true; "pencil-line": true; + pilcrow: true; plus: true; quote: true; + "redo-2": true; "rotate-ccw": true; "rows-3": true; search: true; send: true; settings: true; smile: true; + square: true; strikethrough: true; table: true; "trash-2": true; underline: true; + "undo-2": true; users: true; x: true; } diff --git a/resources/views/app.blade.php b/resources/views/app.blade.php index 54594b5..590f57f 100644 --- a/resources/views/app.blade.php +++ b/resources/views/app.blade.php @@ -19,7 +19,7 @@ })(); - {{-- Inline style matching lattice's default theme background, applied before the stylesheet loads. --}} + {{-- Inline style to set the HTML background color before the stylesheet loads; values mirror lattice's --lt-bg defaults --}}