diff --git a/PRODUCT.md b/PRODUCT.md
new file mode 100644
index 0000000..4c4cce4
--- /dev/null
+++ b/PRODUCT.md
@@ -0,0 +1,37 @@
+# Product
+
+## Register
+
+product
+
+## Users and purpose
+
+TaskNotes users planning task dates and dependencies on a timeline. The task
+ledger and timeline represent the same records, not a separate planning database.
+
+## Brand
+
+Use the existing TaskNotes family language: quiet paper, legible type, precise
+rules, restrained blue. Preserve the visual system in [DESIGN.md](DESIGN.md).
+
+## Anti-references
+
+Do not introduce a dashboard sidebar or decorative status cards. Do not expose
+internal identifiers or protocol terminology in ordinary sign-in messages.
+
+## Principles
+
+- Preserve one authoritative ledger/timeline scroll and task-row geometry.
+- Keep task edits and collection readiness honest; transport is not saved proof.
+- Sign-in follows the shared SDK lifecycle, with clear plain-language status.
+- Preserve the working runtime until native composition is qualified.
+
+## Accessibility
+
+Keep complete control names, keyboard operation, visible focus, light/dark
+appearance and reduced motion. Status must be written, not colour-only.
+
+## Sources
+
+Existing README.md and DESIGN.md; the coordinator's decided sign-in copy.
+This records existing product context, not a new visual direction.
diff --git a/README.md b/README.md
index b7900ff..4759962 100644
--- a/README.md
+++ b/README.md
@@ -38,7 +38,10 @@ Planner discovers Obsidian Bases views with `type: tasknotesPlanner`. Selecting
one executes its standard Base filters and ordering through mdbase. Saving a
view creates or updates a source under `TaskNotes/Views/`, with the current
project, status, priority, completed-task preference, and zoom stored in the
-view. TaskNotes can show the same filtered result as a compact list and hand it
+view. The normal collection setup declares `md` and `base` in
+`settings.record_extensions`, preserving Markdown and existing extensions: the
+canonical `obsidian.base` type requires YAML document records, not opaque files.
+TaskNotes can show the same filtered result as a compact list and hand it
off to Planner for timeline work.
## Timeline interactions
@@ -69,7 +72,10 @@ pnpm dev
```
Open [http://127.0.0.1:4174/?demo=1](http://127.0.0.1:4174/?demo=1) for the
-sample plan, or remove `?demo=1` to connect an mdbase collection. Use
+sample plan, or remove `?demo=1` to connect an mdbase collection. The sample
+collection is labelled **Sample tasks**; its changes reset when you leave or
+reload. Choose its collection name to return to the connection screen. Leaving
+the sample also removes its URL flag, so reload does not reopen it. Use
`127.0.0.1`, not the `localhost` alias: the manifest and callback share this
single development origin.
@@ -134,6 +140,12 @@ signed release. This v2 draft must not deploy before the qualified v2 writer.
The production declaration assumes `https://planner.tasknotes.dev/`. Update the
homepage, icon, and redirect URI together if the deployment origin changes.
+## New SDK migration
+
+The existing Connect session remains the default. A native SDK data adapter is
+being prepared separately; it is not yet a browser sign-in mode. See
+[its behavior, pinned artifact, and remaining dependencies](docs/new-sdk.md).
+
## Repository structure
```text
diff --git a/docs/capability-v2-migration.md b/docs/capability-v2-migration.md
index 2eec5ce..be5a518 100644
--- a/docs/capability-v2-migration.md
+++ b/docs/capability-v2-migration.md
@@ -87,8 +87,10 @@ deletion. These are atomic group meanings, not independently requested operation
permissions. Setup assessment/application is handled by Connect's separate
setup flow, with the existing provisions unchanged.
-No `records.create`, `records.delete`, `offline.replica`, `files.*`, or
-`background.schedule` is requested. Full-collection authorization remains
+No `records.create`, `records.delete`, `offline.replica`, or
+`background.schedule` is requested. Collection file actions `list`, `read`,
+`replace` and `move` are declared because next accounts approve
+`collection.read` and `records.edit` together with their matching file actions. Full-collection authorization remains
necessary for Bases, while the application continues to select and mutate task
records through `tasknotes.task` only. No app capability aliases or fabricated
SDK groups were introduced; session state handling remains SDK-owned.
diff --git a/docs/new-sdk.md b/docs/new-sdk.md
new file mode 100644
index 0000000..638cb53
--- /dev/null
+++ b/docs/new-sdk.md
@@ -0,0 +1,281 @@
+# New SDK data adapter
+
+## Current unified SDK intake — 2026-10-14
+
+SDK `72f8ea6caeafa4b089d3ee14c3b38ce492511a2c` replaces the prior
+`3f417b6d` intake below. Original archive SHA256:
+`d58ee0fb78f2a3bfb49cc70e92bea69fe2292eb2b1cfff0cd9c222efba6d9374`.
+The ordinary Sign in / Add chooser owns one popup and the original Native
+preparation, callback and custody ACK. The callback page delivers only; the
+original SDK closes after completion. No app-side alternate protocol, scope,
+key transfer or grant-store migration is introduced. Application declaration and
+storage identities remain unchanged. Tests and LAB builds do not prove Native
+admission, READ/edit/reload or production release qualification.
+
+## Prior intake notes (superseded SDK pin)
+
+
+`NextPlannerRepository` implements `PlannerRepository` directly on the pinned
+`@mdbase-dev/sdk` package. The existing Connect session remains the application
+default. There is **no working new-SDK browser sign-in switch in this change**;
+this data adapter is a foundation for the shared SDK web sign-in integration.
+The opt-in SDK sign-in UI below does not change the default runtime.
+Do not use it as evidence of launch readiness or a deployed app.
+
+## Data behavior
+
+- Requires the exact portable `tasknotes.task` version and digest from the native
+ catalog. Only implementing types are queried; canonical fields are mapped to
+ each provider's actual field names. No default task-type fallback exists.
+- Reads effective metadata without task bodies. Incomplete query results and
+ duplicate portable task IDs are refused rather than published as a complete
+ plan. Nested field-reference bindings are explicitly unsupported until the
+ shared SDK provides nested updates.
+- Reads the current task before editing, checks its portable identity and type,
+ applies explicit CAS, and settles the write with `client.save()`: confirmed,
+ or saved on this device while offline or the service is busy. Portable
+ completion and dependency behavior still comes from `@tasknotes/model`.
+- Unconfirmed writes belong to the SDK's write ledger, which persists them,
+ restores them on reload and settles them from receipts. Planner keeps no
+ pending-write list of its own and does not block edits behind one. A write
+ the log refuses later appears as a dismissible notice (`client.ledger`
+ rejected entries, acknowledged on dismiss). Protected/conflicted tasks must
+ be resolved in TaskNotes.
+- The change subscription is established before loading a snapshot. Repository
+ disposal aborts outstanding work and closes the watch, not the session-owned
+ SDK client.
+
+## Saved views and dependencies
+
+`NextPlannerViews` uses only the public native AppBases discovery, source-read,
+and execution methods. It carries native record UUID, source SHA and original
+ordinal unchanged. Options come from that exact source; filtering and ordering
+remain native. Row metadata is read in bounded parallel batches and checked
+against the native row revisions. There is no generic saved-view RPC fallback.
+
+The generic renderer change in mdbase-next PR #802 is merged, but its native
+runtime/trust still needs qualification and delivery. Native refusal remains an
+error, not an empty catalog or an all-tasks fallback.
+
+Saved-view writes use the shared SDK #804 `views.createSource`,
+`views.updateSource`, and `views.getSourceRecord` APIs. Updates require the actual
+full source at the selected UUID/path/revision, and change Planner-owned fields
+at the original ordinal. Root metadata, siblings, renderer aliases and unknown
+options are retained through the YAML document model; unsupported/aliased
+selected declarations, including anchors anywhere in the selected subtree,
+are refused before capture rather than risking shared-node sibling changes.
+View writability uses the supplied role/capability and current native source
+state; create/edit preflight refuses unsupported grants before minting an intent
+or calling the source helper. Native enforcement remains authoritative.
+Serialization can
+change YAML formatting. New sources use a separate captured record UUID under
+`TaskNotes/Views/`, not a name-based overwrite.
+
+View writes settle through `client.save()` too. A saved result requires an
+unprotected current full-source readback and native discovery of the same
+UUID/source revision/original ordinal. No separate autosave/session engine is
+introduced.
+
+Shared web sign-in and manifest-driven setup must be integrated from the SDK;
+Planner does not implement private auth/route/grant protocols or a second setup
+engine. The application will not switch its data path until those dependencies
+are available and tested.
+
+## Planned SDK application entry
+
+The integration target is one public SDK entry: declare the application, obtain
+its lifecycle session, authorize in a user gesture, select a collection, and use
+its current scoped connection for records, files and people. Since `7193fd0d`
+the development archive carries the live composition (LAB environment only);
+it is not release- or native-qualified.
+TaskNotes is the first consumer and Planner follows after qualified delivery.
+
+Planner supplies only its declaration: identity, name, origin/environment and
+manifest. The SDK owns authenticated native assets/trust, Worker and SQL plumbing,
+DB names, setup journal, current semantic/catalog readiness, original recovery
+and the existing people directory engine. New namespaces are SDK-derived from
+registered app identity. Optional storage compatibility is declaration data for
+existing installations, not an app-owned engine or permission to replace them.
+Planner has no original native journal requiring a compatibility override.
+
+`dev.tasknotes.planner` is manifest identity, not evidence of a registered native
+application UUID. The typed registration binding must be settled before database
+allocation; prototype UUIDs or namespace strings cannot stand in for registration.
+The scoped records service must retain the same public borrowed `MdbaseClient`
+used by `NextPlannerRepository` and `NextPlannerViews`, including receipts,
+watches and native AppBases/source APIs. Accessors do not add consent: Planner's
+manifest omits files and people. Only the canonical shared manifest compiler may
+interpret authorization; no duplicate compiler or implicit widening is supplied.
+
+The local per-app loader/factory/inventory prototypes are frozen, source-only
+experiments, not an integration recipe. Do not copy them into another app or the
+SDK. Native open/readiness/recovery requires qualified delivery and genuine local
+acceptance, independently of source tests or archive qualification.
+
+## Public-entry source port
+
+The port branch targets the public application entry at SDK dev source
+`3f417b6d941a42444f17568d7489071d23fcb141`, original `sdk-dev-3f417b6d` cut (earlier pins, including distinct `sdk-dev-2e2ae687-n1`, remain in history). `createPlannerApplication`
+supplies only the unchanged manifest (logical ID, name, homepage origin) and the
+environment; the SDK registers the manifest and rebinds to the actual registered
+ID before any storage. No prototype UUID or storage override is used. `App`
+accepts that SDK entry optionally.
+
+The existing ledger receives `NextPlannerRepository` over the selected
+connection's **same borrowed client**, only when the SDK reports current semantic
+readiness and a current selected connection. UI teardown releases repository
+watches/scope, never the SDK client. Collection changes await SDK selection
+clearing and show close refusals without discarding the current ledger. Sign-out
+waits for successful physical close; late actions from retired UI owners cannot
+publish sign-out for a replacement owner. Identity uses the SDK's existing
+canonical email or GitHub provider/login fields, never an account UUID or a
+fabricated email.
+
+When the
+SDK reports `setup_required` (status or readiness assessment), the gate offers
+**Set up TaskNotes Planner**, which reads the SDK setup plan and reviews its
+plain summary, changes, conflicts and refusal. Confirm applies that original
+plan; nothing-to-review keeps `configure()`. Unknown outcomes re-assess through
+the SDK without claiming no writes or automatically submitting a fresh mutation.
+Planner keeps no setup engine and never infers READY from a configure/apply
+result: the ledger still waits for current SDK readiness. A failed or
+missing settled readiness check offers **Check again**, which calls the SDK's
+`assess()` with the current caller signal. Incompatible collections and retired
+connections show a clear explanation and **Choose another collection**, rather
+than an endless Opening message. Active SDK checks remain loading states; no
+repository is allocated until aggregate readiness and the original connection
+are current. Registered binding and popup reopen/expiry helpers remain producer work.
+
+A link that requests an unapproved collection (`selection.state`
+`approval_required`) or an invalid one offers **Approve this collection** or
+**Choose another collection** (`chooseAnother()`); Planner never falls back to
+another collection.
+
+**Live hookup:** `plannerSdk()` is the page's one `MdbaseConnect`. Builds with
+`VITE_MDBASE_ENV=lab` lazily render `App` over it (`components/root.tsx`); other
+builds keep the existing Connect runtime because the SDK refuses production
+(`application_production_trust_unavailable`). A LAB build also needs
+`TASKNOTES_PLANNER_URL` set to its served origin so the manifest homepage matches.
+`vite.config.ts` excludes the SDK from dev pre-bundling and emits ES workers.
+The previous production build passed at `38001079`: it emits the SDK Worker,
+`runtime-lab.wasm`, `sqlite3.wasm` and `sqlite3.js` once each, and the wasm
+matches the SDK's asset pins. Live LAB registration and readiness have not been
+exercised. Old local data and
+pending writes need no cutover handoff for any app; ongoing new-SDK recovery
+remains mandatory.
+
+The original DEV/LAB intake `sdk-dev-3f417b6d` is installed through a
+normal file dependency. It bundles the original beta129 protocol archive
+(`c280cd194ffd`); Planner retains its direct `d765e675c3da` protocol dependency
+for legacy packages. This archive has no vendor warnings; the earlier unused
+protocol exception is not carried forward. Both original archives remain immutable. There are no aliases, API casts,
+private source copies or package rewrites. This intake permits source typechecking,
+not release or native qualification. UI lifecycle stand-ins and MemoryReplica
+rendering tests do not qualify runtime, native initialization, registration or
+end-to-end operation. No deployment or LAB pin change is enabled.
+
+The current cut adds SDK-owned lazy Worker startup, pairing only from a sign-in
+gesture, native-return opening and refused/expired sign-in recovery. SDK refusal
+copy is rendered unchanged; Sign in stays enabled while authorizing and invokes
+SDK `approve()`. Planner supplies no pairing or renewal engine.
+
+## Artifact and checks
+
+The SDK tarball and its source commit/SHA256 are recorded in
+`vendor/mdbase-next-sdk.json`. It is supplied by the release workstream, not npm.
+The current pin is the **development intake, not release-qualified**, from exact
+SDK source `3f417b6d941a42444f17568d7489071d23fcb141`, original `4c` cut:
+4346749-byte SDK archive, SHA256
+`0c5f04c6adad67d747055ebe12963403e374aefde0999861d759f35e4e118ba6`
+(live `MdbaseConnect` entry: registration, storage, Worker and runtime, with
+plain-Vite-emittable Worker and native assets since `d53d7d76`,
+`snapshot.selection` and `approve`/`reauthorize`/`chooseAnother`; packages the
+native runtime/SQLite wasm, `describe({ definitions })`, collection selection
+and `files.grant`; adds contract-scoped `getContract` and contract
+create/update/delete/rename, `files.watch` and `createType` in `df091839`;
+MemoryReplica serves contract-scoped records from declared `MemoryContract`s in
+`38001079`; `n1` adds atomic contract body/field updates and promotion, explicit
+fixture digests; `4b` delivers public error/status helpers and portable/native-origin
+sign-in APIs; `6a` includes registration-refusal guidance, Private-collection
+availability reasons and collection deletion APIs; `993` adds owner-binding fixes
+and public setup assessment, with the original 3555291-byte native runtime matching
+`9f90af73e1591cafe9c35bdd42f18ae49d5a91a0186e78695e841fecabcd833a`;
+`41c` adds per-type readiness options, SDK user-facing title/message/action labels,
+log-service CORS support and a thin-client entry).
+The direct legacy protocol beta129 dependency archive (source `d765e675c3da`) is
+70702 bytes with SHA256
+`2769616d8ba1a9cbb3dd689fa1ca0b1e2b42e5442634635f2cd4a87f5ec9020f`; it replaces
+the earlier protocol718 `dfc5db0d` archive, including as the pnpm override for
+the legacy Connect packages. SHA256/SHA512 were checked against the release
+manifest. Relative to `e519009a`, the entry adds `assess()`, `configure()` and
+`MdbaseApplicationConnection.displayName`, and the `@mdbase-dev/sdk/testing`
+`createApplicationFixture` seam.
+This dependency change does not by itself qualify native sign-in, READY,
+deployment or a change to the held LAB SDK.
+
+The previous original release-qualified `b9965703` archive is retained, including SDK837's
+host/caller lifetime composition fix and SDK832's optional bounded
+`problemDetail`, plus the earlier public factory and provider-receipt helpers.
+Release qualified all 278 archive members, 1678 SDK tests and five browser-bundle
+checks (with three existing WASM-gated skips); the original 750928-byte archive
+is retained unchanged. Planner consumes SDK snapshots directly and does not
+introduce a diagnostic parser, raw-error logging or retry authority. This pin
+activates no new factory or per-app native composition.
+The new entry source port does not change Planner's native read/write implementation.
+Archive SHA256/SHA512 were verified. This is source/package qualification, not
+per-app trust/origin/runtime/session/operation acceptance or a published release.
+The earlier SDK807 `5ba1314b` archive remains held and must not be reused; no
+browser/session path is enabled by this dependency update.
+
+Task edits are written through the `tasknotes.task` contract
+(`update(record, {contract, patch, unset, ifRevision})`): Planner sends contract
+fields and Core maps them to the type's record fields. Task reads still map the
+record fields client-side.
+
+Unit tests use the SDK's MemoryReplica for record/receipt frames, with synthetic
+native contract metadata, a declared `tasknotes.task` `MemoryContract` for
+contract writes, and mocked AppBases results. SDK811's shared synthetic
+parser now handles `create.document`; the source-create test no longer installs
+an app-side fixture bridge and still asserts the exact document submission. These tests are not LAB, native renderer,
+source-parser, sign-in, or end-to-end evidence. Run `pnpm verify` and
+`pnpm test:e2e` for the existing application checks.
+
+## Public SDK sign-in UI
+
+The existing source-only `createNativeSignIn(options)` binding uses the pinned
+SDK's actual `AppWebSignInSession`. Its lower-level explicit release, identity,
+origin, runtime, locks and signal inputs support conformance checks, not the
+planned app integration. They will move behind the shared application entry;
+apps must not add new runtime, Worker, SQL or setup glue to complete this binding.
+The existing screen accepts its binding and an `onSignedOut` callback through
+`ConnectionGate`'s optional `nativeSignIn` prop. The owner closes the borrowed SDK
+session on teardown and creates a fresh instance only after confirmed close or
+explicit sign-in.
+
+The UI reserves a named 620×760 Connect popup synchronously before SDK
+start/expiry renewal, using the same app-owned pattern as TaskNotes. The trusted
+Connect popup keeps its opener for parent-owned cross-origin closure; the tab
+fallback detaches its opener before navigation (noopener semantics). No secrets,
+postMessage approval callback or storage callback use the opener. The SDK
+supplies the validated navigation URI and detects approval. The UI retains its
+original handle after handoff and closes it on completed or terminal public SDK
+statuses, never while authorizing additional consent, even if already paired.
+Only the owned popup is cleaned up on view teardown, not the borrowed session.
+A detached fallback tab is not claimed parent-closeable after crossing origins.
+It renders actual
+SDK status/email, tab reopening, blocked-popup and interrupted states. Local
+**Sign out** waits for SDK `close()`; it neither revokes membership nor erases
+protected sign-in stores. **Forget collection** calls the SDK's selected-ID
+`forget` action. Failed or retired actions cannot publish another owner's state.
+
+The collection callback explicitly refuses with
+**Opening collections isn't available in this build yet.** It does not return a
+fake connection, setup result or saved state. No setup, offline-sync or reminder
+promise is displayed without its real capability. A generic SDK refusal does
+not prove a user decline, so the UI does not invent that state.
+
+Focused presentation and React forwarding tests use labelled SDK stand-ins, not
+native sign-in/LAB qualification. The public application entry, authenticated SDK
+asset delivery, registered identity and current setup/people composition remain
+required before a native runnable URL exists. The future entry must retain this
+screen's popup, selection and lifetime behavior without per-app infrastructure.
diff --git a/docs/offline-shell.md b/docs/offline-shell.md
new file mode 100644
index 0000000..5afa9c3
--- /dev/null
+++ b/docs/offline-shell.md
@@ -0,0 +1,11 @@
+# Offline app shell
+
+The production build uses `@mdbase-dev/sdk/offline-shell/build` to precache the
+public app shell, scripts, lazy chunks, fonts and packaged WASM as one release.
+A previously opened app can reload its shell without connectivity. This does
+not grant collection access or make uncached files and remote services available
+offline; collection recovery and sync remain the SDK's responsibility.
+
+Updates do not reload open tabs. An incomplete deployment does not replace the
+last successfully cached release. Shell caching never stores authentication or
+collection API responses.
diff --git a/docs/releases/unreleased.md b/docs/releases/unreleased.md
new file mode 100644
index 0000000..0b890d4
--- /dev/null
+++ b/docs/releases/unreleased.md
@@ -0,0 +1,15 @@
+# Unreleased
+
+- Stack schedule date and time controls on phone screens so the full date, including its year, remains readable.
+
+- Flag tasks scheduled after their due date in the ledger instead of displaying a reversed range. Their original dates remain available in the inspector, which also rejects adjacent reversed all-day dates.
+
+- Save schedule edits immediately after changing a task's priority or status, without requiring a reload when the collection's task bindings have not changed.
+
+- Keep the inspector's status, priority and projects in sync when a task changes, including completion from its ledger row, without discarding unsaved date edits.
+
+- Wrap phone-sized ledger titles onto two lines so similar task names can be distinguished. Ledger rows, task bars and dependency lines remain aligned.
+
+- Drag an unscheduled task by its title onto a date in the timeline or its header. Drops outside the timeline explain why the schedule stayed unchanged; clicking a title still opens the task editor.
+
+- Keep Save view available at phone widths as a labelled icon button, instead of hiding it.
diff --git a/e2e/fixtures/phone-ledger.html b/e2e/fixtures/phone-ledger.html
new file mode 100644
index 0000000..81c6fc6
--- /dev/null
+++ b/e2e/fixtures/phone-ledger.html
@@ -0,0 +1,48 @@
+
+
+
+
+
+ Planner phone fixture
+
+
+
+
+
+
diff --git a/e2e/phone-planner.spec.ts b/e2e/phone-planner.spec.ts
new file mode 100644
index 0000000..4e98df1
--- /dev/null
+++ b/e2e/phone-planner.spec.ts
@@ -0,0 +1,210 @@
+import { expect, test } from "@playwright/test";
+
+// These checks use only the in-memory sample collection, never a real account.
+test.beforeEach(async ({ context, baseURL }) => {
+ if (!baseURL) throw new Error("A loopback application URL is required");
+ const app = new URL(baseURL);
+ if (!["127.0.0.1", "localhost", "[::1]"].includes(app.hostname)) {
+ throw new Error("Sample checks must run against a loopback application");
+ }
+ await context.route("**/*", (route) =>
+ new URL(route.request().url()).origin === app.origin
+ ? route.continue()
+ : route.abort("blockedbyclient"),
+ );
+ await context.routeWebSocket("**/*", (socket) => {
+ if (new URL(socket.url()).host === app.host) socket.connectToServer();
+ else socket.close();
+ });
+});
+
+for (const width of [320, 390]) {
+ test(`Save view stays available at ${width}px`, async ({ page }) => {
+ await page.setViewportSize({ width, height: 844 });
+ await page.goto("/?demo=1");
+ await expect(page.locator(".gantt-scroll")).toBeVisible();
+ const save = page.getByRole("button", { name: "Save view", exact: true });
+ await expect(save).toBeVisible();
+ const bounds = await save.boundingBox();
+ expect(bounds).not.toBeNull();
+ expect(bounds!.width).toBeGreaterThanOrEqual(44);
+ expect(bounds!.x + bounds!.width).toBeLessThanOrEqual(width);
+ expect(
+ await page.evaluate(() => document.documentElement.scrollWidth),
+ ).toBeLessThanOrEqual(width);
+ await save.click();
+ const dialog = page.getByRole("dialog", { name: "Create Planner view" });
+ await expect(dialog).toBeVisible();
+ await dialog.getByLabel("View name").fill("[test] Phone plan");
+ await dialog
+ .getByRole("button", { name: "Save view", exact: true })
+ .click();
+ await expect(dialog).toBeHidden();
+ await expect(
+ page
+ .getByRole("combobox", { name: "Planner view" })
+ .locator("option:checked"),
+ ).toHaveText("[test] Phone plan");
+ await expect(
+ page.getByRole("button", { name: "Save changes", exact: true }),
+ ).toBeVisible();
+ });
+}
+
+test("schedule dates and times have full-width rows on phones", async ({
+ page,
+}) => {
+ for (const width of [320, 390]) {
+ await page.setViewportSize({ width, height: 844 });
+ await page.goto("/?demo=1");
+ await page
+ .getByRole("button", { name: /Select to edit or drag/ })
+ .first()
+ .click();
+ const inspector = page.locator(".task-inspector");
+ for (const field of ["Scheduled", "Due"]) {
+ const date = inspector.getByLabel(field, { exact: true });
+ const time = inspector.getByLabel(`${field} time`, { exact: true });
+ await date.fill("2026-11-07");
+ const dateBounds = await date.boundingBox();
+ const timeBounds = await time.boundingBox();
+ expect(dateBounds).not.toBeNull();
+ expect(timeBounds).not.toBeNull();
+ expect(dateBounds!.width).toBeGreaterThanOrEqual(240);
+ expect(timeBounds!.width).toBeGreaterThanOrEqual(240);
+ expect(timeBounds!.y).toBeGreaterThanOrEqual(
+ dateBounds!.y + dateBounds!.height,
+ );
+ expect(dateBounds!.x + dateBounds!.width).toBeLessThanOrEqual(width);
+ }
+ expect(
+ await page.evaluate(() => document.documentElement.scrollWidth),
+ ).toBeLessThanOrEqual(width);
+ }
+});
+
+test("an unscheduled title can drop onto a date header and still opens the editor on click", async ({
+ page,
+}) => {
+ await page.goto("/?demo=1");
+ const title = page
+ .getByRole("button", { name: /not scheduled. Select to edit or drag/ })
+ .first();
+ await expect(title).toBeVisible();
+ const name = await title.locator("strong").innerText();
+ const ledger = page.locator(".task-ledger-main").filter({ hasText: name });
+ const source = await title.boundingBox();
+ const header = await page.locator(".timeline-header").boundingBox();
+ const corner = await page.locator(".gantt-corner").boundingBox();
+ if (!source || !header || !corner)
+ throw new Error("Drag geometry unavailable");
+ await page.mouse.move(
+ source.x + source.width / 2,
+ source.y + source.height / 2,
+ );
+ await page.mouse.down();
+ await page.mouse.move(
+ corner.x + corner.width + 200,
+ header.y + header.height / 2,
+ {
+ steps: 12,
+ },
+ );
+ await page.mouse.up();
+ await expect(page.locator(".gantt-interaction-message")).toHaveText(
+ "Schedule saved",
+ );
+ await expect(ledger).not.toContainText("Not scheduled");
+ await expect(page.locator(".task-inspector")).toHaveCount(0);
+ await ledger.click();
+ await expect(page.locator(".task-inspector")).toBeVisible();
+});
+
+const phonePrefix = "[test] bugfix3 same-prefix phone task";
+
+for (const width of [320, 390]) {
+ test(`same-prefix titles remain distinguishable with aligned rows at ${width}px`, async ({
+ page,
+ }) => {
+ await page.setViewportSize({ width, height: 844 });
+ await page.goto("/e2e/fixtures/phone-ledger.html");
+ await page.getByLabel(/^Search tasks/).fill(phonePrefix);
+ await expect(page.locator(".task-row")).toHaveCount(2);
+ await page.evaluate(() => document.fonts.ready);
+ for (const suffix of ["alpha", "beta"]) {
+ const title = page
+ .locator(".ledger-title strong")
+ .filter({ hasText: `${phonePrefix} ${suffix}` });
+ await expect(title).toHaveCSS("white-space", "normal");
+ expect(
+ await title.evaluate((element, suffix) => {
+ const text = element.firstChild;
+ const start = element.textContent!.lastIndexOf(suffix);
+ if (!text || start < 0) throw new Error("Title suffix is missing");
+ const range = document.createRange();
+ range.setStart(text, start);
+ range.setEnd(text, start + suffix.length);
+ const glyphs = range.getBoundingClientRect();
+ const bounds = element.getBoundingClientRect();
+ return (
+ glyphs.top >= bounds.top - 1 &&
+ glyphs.bottom <= bounds.bottom + 1 &&
+ glyphs.left >= bounds.left - 1 &&
+ glyphs.right <= bounds.right + 1
+ );
+ }, suffix),
+ ).toBe(true);
+ }
+ for (const row of await page.locator(".task-row").all()) {
+ expect((await row.boundingBox())!.height).toBe(65);
+ expect((await row.locator(".task-ledger").boundingBox())!.height).toBe(
+ 65,
+ );
+ expect((await row.locator(".timeline-row").boundingBox())!.height).toBe(
+ 65,
+ );
+ const bounds = (await row.boundingBox())!;
+ const action = (await row
+ .locator(".unscheduled-row-action")
+ .boundingBox())!;
+ expect(
+ Math.abs(action.y + action.height / 2 - bounds.y - bounds.height / 2),
+ ).toBeLessThanOrEqual(1);
+ }
+ await expect(page.locator(".dependency-layer")).toHaveAttribute(
+ "height",
+ "165",
+ );
+ expect(
+ await page.evaluate(() => document.documentElement.scrollWidth),
+ ).toBeLessThanOrEqual(width);
+ });
+}
+
+test("row completion and reopening refresh the inspector without discarding a date draft", async ({
+ page,
+}) => {
+ await page.goto("/e2e/fixtures/phone-ledger.html");
+ await page.getByLabel(/^Search tasks/).fill(phonePrefix);
+ await page.getByRole("button", { name: "Completed", exact: true }).click();
+ const title = `${phonePrefix} alpha`;
+ await page.locator(".task-ledger-main").filter({ hasText: title }).click();
+ const inspector = page.locator(".task-inspector");
+ await inspector.getByLabel("Scheduled", { exact: true }).fill("2026-11-07");
+ await page
+ .getByRole("button", { name: `Complete ${title}`, exact: true })
+ .click();
+ await expect(inspector.getByLabel(/^Status/)).toHaveValue("done");
+ await expect(inspector.locator(".inspector-title p")).toContainText("Done");
+ await expect(inspector.getByLabel("Scheduled", { exact: true })).toHaveValue(
+ "2026-11-07",
+ );
+ await page
+ .getByRole("button", { name: `Reopen ${title}`, exact: true })
+ .click();
+ await expect(inspector.getByLabel(/^Status/)).toHaveValue("open");
+ await expect(inspector.locator(".inspector-title p")).toContainText("Open");
+ await expect(inspector.getByLabel("Scheduled", { exact: true })).toHaveValue(
+ "2026-11-07",
+ );
+});
diff --git a/package.json b/package.json
index e2d2369..941a4e2 100644
--- a/package.json
+++ b/package.json
@@ -11,12 +11,15 @@
"dev": "pnpm manifest:dev && vite",
"dev:e2e": "pnpm manifest:dev && vite --mode e2e",
"deploy:dev": "node scripts/deploy-pages-dev.mjs",
+ "deploy:lab": "MDBASE_ENV=lab node scripts/deploy-pages-dev.mjs",
"deploy:production": "node scripts/deploy-pages-production.mjs",
"build": "pnpm manifest && tsc -b && vite build && node scripts/write-static-routes.mjs && node scripts/verify-build.mjs",
+ "build:lab": "VITE_MDBASE_ENV=lab pnpm build",
"preview": "vite preview",
"typecheck": "tsc -b --pretty false",
"lint": "eslint .",
"test": "vitest run",
+ "test:deployment": "node --test scripts/deployment-environment.node-test.mjs",
"test:e2e": "playwright test",
"test:production-smoke": "node scripts/production-smoke.mjs",
"format": "prettier --write .",
@@ -27,7 +30,9 @@
"@fontsource/atkinson-hyperlegible": "5.3.0",
"@fontsource/azeret-mono": "5.3.0",
"@mdbase-dev/connect": "file:vendor/mdbase-dev-connect-0.1.0-beta.96-56ed32ffde05.tgz",
- "@tasknotes/model": "file:vendor/tasknotes-model-0.3.0-rc.11.tgz",
+ "@mdbase-dev/sdk": "file:vendor/mdbase-dev-sdk-dev-72f8ea6c.tgz",
+ "@mdbase-dev/ui": "file:vendor/ui-dev-9553ad66.tgz",
+ "@tasknotes/model": "file:vendor/tasknotes-model-0.3.0-rc.15.tgz",
"lucide-react": "1.25.0",
"react": "19.2.8",
"react-dom": "19.2.8",
@@ -35,7 +40,7 @@
},
"devDependencies": {
"@eslint/js": "10.0.1",
- "@mdbase-dev/connect-protocol": "file:vendor/mdbase-dev-connect-protocol-0.1.0-beta.96-56ed32ffde05.tgz",
+ "@mdbase-dev/connect-protocol": "file:vendor/mdbase-dev-connect-protocol-0.1.0-beta.129-d765e675c3da.tgz",
"@playwright/test": "1.61.1",
"@testing-library/jest-dom": "7.0.0",
"@testing-library/react": "16.3.2",
@@ -56,7 +61,7 @@
},
"pnpm": {
"overrides": {
- "@mdbase-dev/connect-protocol": "file:vendor/mdbase-dev-connect-protocol-0.1.0-beta.96-56ed32ffde05.tgz",
+ "@mdbase-dev/connect-protocol": "file:vendor/mdbase-dev-connect-protocol-0.1.0-beta.129-d765e675c3da.tgz",
"@mdbase-dev/connect-sync": "file:vendor/mdbase-dev-connect-sync-0.1.0-beta.96-56ed32ffde05.tgz"
}
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 40758ed..010bfe9 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -1,28 +1,35 @@
-lockfileVersion: "9.0"
+lockfileVersion: '9.0'
settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
overrides:
- "@mdbase-dev/connect-protocol": file:vendor/mdbase-dev-connect-protocol-0.1.0-beta.96-56ed32ffde05.tgz
- "@mdbase-dev/connect-sync": file:vendor/mdbase-dev-connect-sync-0.1.0-beta.96-56ed32ffde05.tgz
+ '@mdbase-dev/connect-protocol': file:vendor/mdbase-dev-connect-protocol-0.1.0-beta.129-d765e675c3da.tgz
+ '@mdbase-dev/connect-sync': file:vendor/mdbase-dev-connect-sync-0.1.0-beta.96-56ed32ffde05.tgz
importers:
+
.:
dependencies:
- "@fontsource/atkinson-hyperlegible":
+ '@fontsource/atkinson-hyperlegible':
specifier: 5.3.0
version: 5.3.0
- "@fontsource/azeret-mono":
+ '@fontsource/azeret-mono':
specifier: 5.3.0
version: 5.3.0
- "@mdbase-dev/connect":
+ '@mdbase-dev/connect':
specifier: file:vendor/mdbase-dev-connect-0.1.0-beta.96-56ed32ffde05.tgz
version: file:vendor/mdbase-dev-connect-0.1.0-beta.96-56ed32ffde05.tgz
- "@tasknotes/model":
- specifier: file:vendor/tasknotes-model-0.3.0-rc.11.tgz
- version: file:vendor/tasknotes-model-0.3.0-rc.11.tgz
+ '@mdbase-dev/sdk':
+ specifier: file:vendor/mdbase-dev-sdk-dev-72f8ea6c.tgz
+ version: file:vendor/mdbase-dev-sdk-dev-72f8ea6c.tgz
+ '@mdbase-dev/ui':
+ specifier: file:vendor/ui-dev-9553ad66.tgz
+ version: file:vendor/ui-dev-9553ad66.tgz(@mdbase-dev/sdk@file:vendor/mdbase-dev-sdk-dev-72f8ea6c.tgz)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ '@tasknotes/model':
+ specifier: file:vendor/tasknotes-model-0.3.0-rc.15.tgz
+ version: file:vendor/tasknotes-model-0.3.0-rc.15.tgz
lucide-react:
specifier: 1.25.0
version: 1.25.0(react@19.2.8)
@@ -36,31 +43,31 @@ importers:
specifier: 2.8.2
version: 2.8.2
devDependencies:
- "@eslint/js":
+ '@eslint/js':
specifier: 10.0.1
version: 10.0.1(eslint@10.7.0)
- "@mdbase-dev/connect-protocol":
- specifier: file:vendor/mdbase-dev-connect-protocol-0.1.0-beta.96-56ed32ffde05.tgz
- version: file:vendor/mdbase-dev-connect-protocol-0.1.0-beta.96-56ed32ffde05.tgz
- "@playwright/test":
+ '@mdbase-dev/connect-protocol':
+ specifier: file:vendor/mdbase-dev-connect-protocol-0.1.0-beta.129-d765e675c3da.tgz
+ version: file:vendor/mdbase-dev-connect-protocol-0.1.0-beta.129-d765e675c3da.tgz
+ '@playwright/test':
specifier: 1.61.1
version: 1.61.1
- "@testing-library/jest-dom":
+ '@testing-library/jest-dom':
specifier: 7.0.0
version: 7.0.0(@testing-library/dom@10.4.1)
- "@testing-library/react":
+ '@testing-library/react':
specifier: 16.3.2
version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
- "@types/node":
+ '@types/node':
specifier: 26.2.0
version: 26.2.0
- "@types/react":
+ '@types/react':
specifier: 19.2.17
version: 19.2.17
- "@types/react-dom":
+ '@types/react-dom':
specifier: 19.2.3
version: 19.2.3(@types/react@19.2.17)
- "@vitejs/plugin-react":
+ '@vitejs/plugin-react':
specifier: 6.0.3
version: 6.0.3(vite@8.1.5(@types/node@26.2.0)(yaml@2.8.2))
eslint:
@@ -77,7 +84,7 @@ importers:
version: 17.7.0
jsdom:
specifier: 29.1.1
- version: 29.1.1
+ version: 29.1.1(@noble/hashes@2.4.0)
prettier:
specifier: 3.9.6
version: 3.9.6
@@ -92,802 +99,532 @@ importers:
version: 8.1.5(@types/node@26.2.0)(yaml@2.8.2)
vitest:
specifier: 4.1.10
- version: 4.1.10(@types/node@26.2.0)(jsdom@29.1.1)(vite@8.1.5(@types/node@26.2.0)(yaml@2.8.2))
+ version: 4.1.10(@types/node@26.2.0)(jsdom@29.1.1(@noble/hashes@2.4.0))(vite@8.1.5(@types/node@26.2.0)(yaml@2.8.2))
packages:
- "@adobe/css-tools@4.5.0":
- resolution:
- {
- integrity: sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==,
- }
-
- "@asamuzakjp/css-color@5.1.11":
- resolution:
- {
- integrity: sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==,
- }
- engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 }
-
- "@asamuzakjp/dom-selector@7.1.1":
- resolution:
- {
- integrity: sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==,
- }
- engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 }
-
- "@asamuzakjp/generational-cache@1.0.1":
- resolution:
- {
- integrity: sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==,
- }
- engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 }
-
- "@asamuzakjp/nwsapi@2.3.9":
- resolution:
- {
- integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==,
- }
-
- "@babel/code-frame@7.29.7":
- resolution:
- {
- integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==,
- }
- engines: { node: ">=6.9.0" }
-
- "@babel/compat-data@7.29.7":
- resolution:
- {
- integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==,
- }
- engines: { node: ">=6.9.0" }
-
- "@babel/core@7.29.7":
- resolution:
- {
- integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==,
- }
- engines: { node: ">=6.9.0" }
-
- "@babel/generator@7.29.8":
- resolution:
- {
- integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==,
- }
- engines: { node: ">=6.9.0" }
-
- "@babel/helper-compilation-targets@7.29.7":
- resolution:
- {
- integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==,
- }
- engines: { node: ">=6.9.0" }
-
- "@babel/helper-globals@7.29.7":
- resolution:
- {
- integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==,
- }
- engines: { node: ">=6.9.0" }
-
- "@babel/helper-module-imports@7.29.7":
- resolution:
- {
- integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==,
- }
- engines: { node: ">=6.9.0" }
-
- "@babel/helper-module-transforms@7.29.7":
- resolution:
- {
- integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==,
- }
- engines: { node: ">=6.9.0" }
+
+ '@adobe/css-tools@4.5.0':
+ resolution: {integrity: sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==}
+
+ '@asamuzakjp/css-color@5.1.11':
+ resolution: {integrity: sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==}
+ engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
+
+ '@asamuzakjp/dom-selector@7.1.1':
+ resolution: {integrity: sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==}
+ engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
+
+ '@asamuzakjp/generational-cache@1.0.1':
+ resolution: {integrity: sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==}
+ engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
+
+ '@asamuzakjp/nwsapi@2.3.9':
+ resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==}
+
+ '@babel/code-frame@7.29.7':
+ resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/compat-data@7.29.7':
+ resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/core@7.29.7':
+ resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/generator@7.29.8':
+ resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-compilation-targets@7.29.7':
+ resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-globals@7.29.7':
+ resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-imports@7.29.7':
+ resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-transforms@7.29.7':
+ resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==}
+ engines: {node: '>=6.9.0'}
peerDependencies:
- "@babel/core": ^7.0.0
-
- "@babel/helper-string-parser@7.29.7":
- resolution:
- {
- integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==,
- }
- engines: { node: ">=6.9.0" }
-
- "@babel/helper-validator-identifier@7.29.7":
- resolution:
- {
- integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==,
- }
- engines: { node: ">=6.9.0" }
-
- "@babel/helper-validator-option@7.29.7":
- resolution:
- {
- integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==,
- }
- engines: { node: ">=6.9.0" }
-
- "@babel/helpers@7.29.7":
- resolution:
- {
- integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==,
- }
- engines: { node: ">=6.9.0" }
-
- "@babel/parser@7.29.8":
- resolution:
- {
- integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==,
- }
- engines: { node: ">=6.0.0" }
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-string-parser@7.29.7':
+ resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-identifier@7.29.7':
+ resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-option@7.29.7':
+ resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helpers@7.29.7':
+ resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/parser@7.29.8':
+ resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==}
+ engines: {node: '>=6.0.0'}
hasBin: true
- "@babel/runtime@7.29.7":
- resolution:
- {
- integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==,
- }
- engines: { node: ">=6.9.0" }
-
- "@babel/template@7.29.7":
- resolution:
- {
- integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==,
- }
- engines: { node: ">=6.9.0" }
-
- "@babel/traverse@7.29.8":
- resolution:
- {
- integrity: sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==,
- }
- engines: { node: ">=6.9.0" }
-
- "@babel/types@7.29.8":
- resolution:
- {
- integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==,
- }
- engines: { node: ">=6.9.0" }
-
- "@bramus/specificity@2.4.2":
- resolution:
- {
- integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==,
- }
+ '@babel/runtime@7.29.7':
+ resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/template@7.29.7':
+ resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/traverse@7.29.8':
+ resolution: {integrity: sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.29.8':
+ resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==}
+ engines: {node: '>=6.9.0'}
+
+ '@bramus/specificity@2.4.2':
+ resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==}
hasBin: true
- "@csstools/color-helpers@6.1.1":
- resolution:
- {
- integrity: sha512-gLNsunvwf3mCi5u5o46/Z/JcJMnhbHSaZ69rkgPzNM3J4s8hWwpPUQB6/tt0EDFyCiWzxANlx+2LJwpYj4zS1w==,
- }
- engines: { node: ">=20.19.0" }
-
- "@csstools/css-calc@3.3.0":
- resolution:
- {
- integrity: sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==,
- }
- engines: { node: ">=20.19.0" }
+ '@csstools/color-helpers@6.1.1':
+ resolution: {integrity: sha512-gLNsunvwf3mCi5u5o46/Z/JcJMnhbHSaZ69rkgPzNM3J4s8hWwpPUQB6/tt0EDFyCiWzxANlx+2LJwpYj4zS1w==}
+ engines: {node: '>=20.19.0'}
+
+ '@csstools/css-calc@3.3.0':
+ resolution: {integrity: sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==}
+ engines: {node: '>=20.19.0'}
peerDependencies:
- "@csstools/css-parser-algorithms": ^4.0.0
- "@csstools/css-tokenizer": ^4.0.0
-
- "@csstools/css-color-parser@4.2.0":
- resolution:
- {
- integrity: sha512-5+5LEmFuY1AjXdYhmgjTJogtQnP1evJ1zrBZGUNZ0thkpwnnmKxcHdAMn/OtFjAb25zA+jKDVYVRl+5G7rjv1A==,
- }
- engines: { node: ">=20.19.0" }
+ '@csstools/css-parser-algorithms': ^4.0.0
+ '@csstools/css-tokenizer': ^4.0.0
+
+ '@csstools/css-color-parser@4.2.0':
+ resolution: {integrity: sha512-5+5LEmFuY1AjXdYhmgjTJogtQnP1evJ1zrBZGUNZ0thkpwnnmKxcHdAMn/OtFjAb25zA+jKDVYVRl+5G7rjv1A==}
+ engines: {node: '>=20.19.0'}
peerDependencies:
- "@csstools/css-parser-algorithms": ^4.0.0
- "@csstools/css-tokenizer": ^4.0.0
-
- "@csstools/css-parser-algorithms@4.0.0":
- resolution:
- {
- integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==,
- }
- engines: { node: ">=20.19.0" }
+ '@csstools/css-parser-algorithms': ^4.0.0
+ '@csstools/css-tokenizer': ^4.0.0
+
+ '@csstools/css-parser-algorithms@4.0.0':
+ resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==}
+ engines: {node: '>=20.19.0'}
peerDependencies:
- "@csstools/css-tokenizer": ^4.0.0
+ '@csstools/css-tokenizer': ^4.0.0
- "@csstools/css-syntax-patches-for-csstree@1.1.8":
- resolution:
- {
- integrity: sha512-CpMLjAvwQg3BL5S0IeqsZNMH7EQrEWi0kLKOC13ZBF0ZwERiLWlibNPJr8G1kdU3Ms/r2KiNrF81pUh2HwAHdg==,
- }
+ '@csstools/css-syntax-patches-for-csstree@1.1.8':
+ resolution: {integrity: sha512-CpMLjAvwQg3BL5S0IeqsZNMH7EQrEWi0kLKOC13ZBF0ZwERiLWlibNPJr8G1kdU3Ms/r2KiNrF81pUh2HwAHdg==}
peerDependencies:
css-tree: ^3.2.1
peerDependenciesMeta:
css-tree:
optional: true
- "@csstools/css-tokenizer@4.0.0":
- resolution:
- {
- integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==,
- }
- engines: { node: ">=20.19.0" }
-
- "@emnapi/core@1.11.1":
- resolution:
- {
- integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==,
- }
-
- "@emnapi/runtime@1.11.1":
- resolution:
- {
- integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==,
- }
-
- "@emnapi/wasi-threads@1.2.2":
- resolution:
- {
- integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==,
- }
-
- "@eslint-community/eslint-utils@4.10.1":
- resolution:
- {
- integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==,
- }
- engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 }
+ '@csstools/css-tokenizer@4.0.0':
+ resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==}
+ engines: {node: '>=20.19.0'}
+
+ '@emnapi/core@1.11.1':
+ resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==}
+
+ '@emnapi/runtime@1.11.1':
+ resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==}
+
+ '@emnapi/wasi-threads@1.2.2':
+ resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==}
+
+ '@eslint-community/eslint-utils@4.10.1':
+ resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
- "@eslint-community/regexpp@4.12.2":
- resolution:
- {
- integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==,
- }
- engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 }
-
- "@eslint/config-array@0.23.5":
- resolution:
- {
- integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==,
- }
- engines: { node: ^20.19.0 || ^22.13.0 || >=24 }
-
- "@eslint/config-helpers@0.6.0":
- resolution:
- {
- integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==,
- }
- engines: { node: ^20.19.0 || ^22.13.0 || >=24 }
-
- "@eslint/core@1.2.1":
- resolution:
- {
- integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==,
- }
- engines: { node: ^20.19.0 || ^22.13.0 || >=24 }
-
- "@eslint/js@10.0.1":
- resolution:
- {
- integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==,
- }
- engines: { node: ^20.19.0 || ^22.13.0 || >=24 }
+ '@eslint-community/regexpp@4.12.2':
+ resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+
+ '@eslint/config-array@0.23.5':
+ resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+ '@eslint/config-helpers@0.6.0':
+ resolution: {integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+ '@eslint/core@1.2.1':
+ resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+ '@eslint/js@10.0.1':
+ resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
peerDependencies:
eslint: ^10.0.0
peerDependenciesMeta:
eslint:
optional: true
- "@eslint/object-schema@3.0.5":
- resolution:
- {
- integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==,
- }
- engines: { node: ^20.19.0 || ^22.13.0 || >=24 }
-
- "@eslint/plugin-kit@0.7.2":
- resolution:
- {
- integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==,
- }
- engines: { node: ^20.19.0 || ^22.13.0 || >=24 }
-
- "@exodus/bytes@1.15.1":
- resolution:
- {
- integrity: sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==,
- }
- engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 }
+ '@eslint/object-schema@3.0.5':
+ resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+ '@eslint/plugin-kit@0.7.2':
+ resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+ '@exodus/bytes@1.15.1':
+ resolution: {integrity: sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==}
+ engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
peerDependencies:
- "@noble/hashes": ^1.8.0 || ^2.0.0
+ '@noble/hashes': ^1.8.0 || ^2.0.0
peerDependenciesMeta:
- "@noble/hashes":
+ '@noble/hashes':
optional: true
- "@fontsource/atkinson-hyperlegible@5.3.0":
- resolution:
- {
- integrity: sha512-Sp8Ve8+rQmENY2Lv02VH7sLpntzTTvnncnJMTbRE7DX6TLxGraN4ykZfzaUWIoCFmaomwkvNiqmlPkrKBuDoSA==,
- }
-
- "@fontsource/azeret-mono@5.3.0":
- resolution:
- {
- integrity: sha512-Ag/+gN67fUry7i1yLlTnk16Rr1nnTQI2YefA/G7tYcCSr/+TC/ayMrE8Km7O0OKRgI/B5Mfel46Gq9IGY50Uaw==,
- }
-
- "@humanfs/core@0.19.2":
- resolution:
- {
- integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==,
- }
- engines: { node: ">=18.18.0" }
-
- "@humanfs/node@0.16.8":
- resolution:
- {
- integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==,
- }
- engines: { node: ">=18.18.0" }
-
- "@humanfs/types@0.15.0":
- resolution:
- {
- integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==,
- }
- engines: { node: ">=18.18.0" }
-
- "@humanwhocodes/module-importer@1.0.1":
- resolution:
- {
- integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==,
- }
- engines: { node: ">=12.22" }
-
- "@humanwhocodes/retry@0.4.3":
- resolution:
- {
- integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==,
- }
- engines: { node: ">=18.18" }
-
- "@jridgewell/gen-mapping@0.3.13":
- resolution:
- {
- integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==,
- }
-
- "@jridgewell/remapping@2.3.5":
- resolution:
- {
- integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==,
- }
-
- "@jridgewell/resolve-uri@3.1.2":
- resolution:
- {
- integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==,
- }
- engines: { node: ">=6.0.0" }
-
- "@jridgewell/sourcemap-codec@1.5.5":
- resolution:
- {
- integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==,
- }
-
- "@jridgewell/trace-mapping@0.3.31":
- resolution:
- {
- integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==,
- }
-
- "@mdbase-dev/connect-protocol@file:vendor/mdbase-dev-connect-protocol-0.1.0-beta.96-56ed32ffde05.tgz":
- resolution:
- {
- integrity: sha512-prz8clP0Vpu8HQ4ucr+ss4am2sLQpFTOjXBSRcaU8/RIdDM7tZurOYHP/y0LdDkViJ9pODfD6R82umpdvMQYhQ==,
- tarball: file:vendor/mdbase-dev-connect-protocol-0.1.0-beta.96-56ed32ffde05.tgz,
- }
- version: 0.1.0-beta.96
+ '@fontsource-variable/atkinson-hyperlegible-next@5.3.0':
+ resolution: {integrity: sha512-UnLzNUy1RWoLDfydAatP4NaRm99X/WbQEph7q/PymJnCFIOOwKOx3pBmp5ys8trO0dM+CKGuJgeZP9fAR4mQpA==}
+
+ '@fontsource/atkinson-hyperlegible@5.3.0':
+ resolution: {integrity: sha512-Sp8Ve8+rQmENY2Lv02VH7sLpntzTTvnncnJMTbRE7DX6TLxGraN4ykZfzaUWIoCFmaomwkvNiqmlPkrKBuDoSA==}
+
+ '@fontsource/azeret-mono@5.3.0':
+ resolution: {integrity: sha512-Ag/+gN67fUry7i1yLlTnk16Rr1nnTQI2YefA/G7tYcCSr/+TC/ayMrE8Km7O0OKRgI/B5Mfel46Gq9IGY50Uaw==}
+
+ '@humanfs/core@0.19.2':
+ resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanfs/node@0.16.8':
+ resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanfs/types@0.15.0':
+ resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanwhocodes/module-importer@1.0.1':
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+ engines: {node: '>=12.22'}
- "@mdbase-dev/connect@file:vendor/mdbase-dev-connect-0.1.0-beta.96-56ed32ffde05.tgz":
- resolution:
- {
- integrity: sha512-7k2TL4IVu4IyWSs+1DuSDrY/Vw0vAHlpgL3Zq9R/Bb1I61TMwTTQ2p/aYx400FT69qQGO1CA6SHs7oHNroHh5w==,
- tarball: file:vendor/mdbase-dev-connect-0.1.0-beta.96-56ed32ffde05.tgz,
- }
+ '@humanwhocodes/retry@0.4.3':
+ resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
+ engines: {node: '>=18.18'}
+
+ '@jridgewell/gen-mapping@0.3.13':
+ resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
+
+ '@jridgewell/remapping@2.3.5':
+ resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
+
+ '@jridgewell/resolve-uri@3.1.2':
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/sourcemap-codec@1.5.5':
+ resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
+
+ '@jridgewell/trace-mapping@0.3.31':
+ resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
+
+ '@mdbase-dev/connect-protocol@file:vendor/mdbase-dev-connect-protocol-0.1.0-beta.129-d765e675c3da.tgz':
+ resolution: {integrity: sha512-PFG1qmAzmcyJjmZLmGz4eoOOZRDgvTvDZATf6IGBccNHRc1eGZtMm7ZUA7gNAxuO5KerrN6mDIB9qQnpojyOAg==, tarball: file:vendor/mdbase-dev-connect-protocol-0.1.0-beta.129-d765e675c3da.tgz}
+ version: 0.1.0-beta.129
+
+ '@mdbase-dev/connect@file:vendor/mdbase-dev-connect-0.1.0-beta.96-56ed32ffde05.tgz':
+ resolution: {integrity: sha512-7k2TL4IVu4IyWSs+1DuSDrY/Vw0vAHlpgL3Zq9R/Bb1I61TMwTTQ2p/aYx400FT69qQGO1CA6SHs7oHNroHh5w==, tarball: file:vendor/mdbase-dev-connect-0.1.0-beta.96-56ed32ffde05.tgz}
version: 0.1.0-beta.96
- "@napi-rs/wasm-runtime@1.2.3":
- resolution:
- {
- integrity: sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==,
- }
- engines: { node: ^20.19.0 || ^22.13.0 || >=23.5.0 }
+ '@mdbase-dev/sdk@file:vendor/mdbase-dev-sdk-dev-72f8ea6c.tgz':
+ resolution: {integrity: sha512-I3El81MZdAor5ojYpkzgv1QeH5DF8LuGmST6oYIH00dWhI7RPCJC8kflif9Rwp7TiuXpZzSF44PBS41Mx3Tv1g==, tarball: file:vendor/mdbase-dev-sdk-dev-72f8ea6c.tgz}
+ version: 0.0.0
+ engines: {node: '>=20'}
+ bundledDependencies:
+ - '@mdbase-dev/connect-protocol'
+
+ '@mdbase-dev/ui@file:vendor/ui-dev-9553ad66.tgz':
+ resolution: {integrity: sha512-PqMWvJ2ZbNaLxWTum2m7vmcCbOGdM5qldnphPwqyGBo/mcpvjfk5tHkil/vXLc+LuG7HEyZOLh+tZyUXtMv7QQ==, tarball: file:vendor/ui-dev-9553ad66.tgz}
+ version: 0.1.0-beta.129
+ peerDependencies:
+ '@codemirror/view': ^6.0.0
+ '@mdbase-dev/sdk': '*'
+ react: ^19.2.0
+ react-dom: ^19.2.0
+ peerDependenciesMeta:
+ '@codemirror/view':
+ optional: true
+ '@mdbase-dev/sdk':
+ optional: true
+ react-dom:
+ optional: true
+
+ '@napi-rs/wasm-runtime@1.2.3':
+ resolution: {integrity: sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0}
peerDependencies:
- "@emnapi/core": ^1.7.1 || ^2.0.0-alpha.4
- "@emnapi/runtime": ^1.7.1 || ^2.0.0-alpha.4
-
- "@oxc-project/types@0.139.0":
- resolution:
- {
- integrity: sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==,
- }
-
- "@playwright/test@1.61.1":
- resolution:
- {
- integrity: sha512-8nKv6+0RJSL9FE4jYOEGXnPeM/Hg12qZpmqzZjRh3qM0Y7c3z1mrOTfFLids72RDQYVh9WpLEfR5WdpNX4fkig==,
- }
- engines: { node: ">=18" }
+ '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4
+ '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.4
+
+ '@noble/ciphers@2.4.0':
+ resolution: {integrity: sha512-AnjFn0Jv92laAkvMrghlFZq4qQCIN/4DxFV/eooqtC2YTjB7kBeLMS2T9KJX4Dn+ZVXLOwK0lSgqDtx9gvxtiw==}
+ engines: {node: '>= 20.19.0'}
+
+ '@noble/curves@2.4.0':
+ resolution: {integrity: sha512-P4/62zrgfH33CneE3Dn4WhJVA22YUU0eR51wKIan4NVRvwsA0YnPTwWGpNbpuacSujmSFLvyzpyuR30+fbq2Ew==}
+ engines: {node: '>= 20.19.0'}
+
+ '@noble/hashes@2.4.0':
+ resolution: {integrity: sha512-X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA==}
+ engines: {node: '>= 20.19.0'}
+
+ '@oxc-project/types@0.139.0':
+ resolution: {integrity: sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==}
+
+ '@playwright/test@1.61.1':
+ resolution: {integrity: sha512-8nKv6+0RJSL9FE4jYOEGXnPeM/Hg12qZpmqzZjRh3qM0Y7c3z1mrOTfFLids72RDQYVh9WpLEfR5WdpNX4fkig==}
+ engines: {node: '>=18'}
hasBin: true
- "@rolldown/binding-android-arm64@1.1.5":
- resolution:
- {
- integrity: sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==,
- }
- engines: { node: ^20.19.0 || >=22.12.0 }
+ '@rolldown/binding-android-arm64@1.1.5':
+ resolution: {integrity: sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [android]
- "@rolldown/binding-darwin-arm64@1.1.5":
- resolution:
- {
- integrity: sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==,
- }
- engines: { node: ^20.19.0 || >=22.12.0 }
+ '@rolldown/binding-darwin-arm64@1.1.5':
+ resolution: {integrity: sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [darwin]
- "@rolldown/binding-darwin-x64@1.1.5":
- resolution:
- {
- integrity: sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==,
- }
- engines: { node: ^20.19.0 || >=22.12.0 }
+ '@rolldown/binding-darwin-x64@1.1.5':
+ resolution: {integrity: sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [darwin]
- "@rolldown/binding-freebsd-x64@1.1.5":
- resolution:
- {
- integrity: sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==,
- }
- engines: { node: ^20.19.0 || >=22.12.0 }
+ '@rolldown/binding-freebsd-x64@1.1.5':
+ resolution: {integrity: sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [freebsd]
- "@rolldown/binding-linux-arm-gnueabihf@1.1.5":
- resolution:
- {
- integrity: sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==,
- }
- engines: { node: ^20.19.0 || >=22.12.0 }
+ '@rolldown/binding-linux-arm-gnueabihf@1.1.5':
+ resolution: {integrity: sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [linux]
- "@rolldown/binding-linux-arm64-gnu@1.1.5":
- resolution:
- {
- integrity: sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==,
- }
- engines: { node: ^20.19.0 || >=22.12.0 }
+ '@rolldown/binding-linux-arm64-gnu@1.1.5':
+ resolution: {integrity: sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
- "@rolldown/binding-linux-arm64-musl@1.1.5":
- resolution:
- {
- integrity: sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==,
- }
- engines: { node: ^20.19.0 || >=22.12.0 }
+ '@rolldown/binding-linux-arm64-musl@1.1.5':
+ resolution: {integrity: sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
- "@rolldown/binding-linux-ppc64-gnu@1.1.5":
- resolution:
- {
- integrity: sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==,
- }
- engines: { node: ^20.19.0 || >=22.12.0 }
+ '@rolldown/binding-linux-ppc64-gnu@1.1.5':
+ resolution: {integrity: sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [ppc64]
os: [linux]
- "@rolldown/binding-linux-s390x-gnu@1.1.5":
- resolution:
- {
- integrity: sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==,
- }
- engines: { node: ^20.19.0 || >=22.12.0 }
+ '@rolldown/binding-linux-s390x-gnu@1.1.5':
+ resolution: {integrity: sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [s390x]
os: [linux]
- "@rolldown/binding-linux-x64-gnu@1.1.5":
- resolution:
- {
- integrity: sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==,
- }
- engines: { node: ^20.19.0 || >=22.12.0 }
+ '@rolldown/binding-linux-x64-gnu@1.1.5':
+ resolution: {integrity: sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
- "@rolldown/binding-linux-x64-musl@1.1.5":
- resolution:
- {
- integrity: sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==,
- }
- engines: { node: ^20.19.0 || >=22.12.0 }
+ '@rolldown/binding-linux-x64-musl@1.1.5':
+ resolution: {integrity: sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
- "@rolldown/binding-openharmony-arm64@1.1.5":
- resolution:
- {
- integrity: sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==,
- }
- engines: { node: ^20.19.0 || >=22.12.0 }
+ '@rolldown/binding-openharmony-arm64@1.1.5':
+ resolution: {integrity: sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [openharmony]
- "@rolldown/binding-wasm32-wasi@1.1.5":
- resolution:
- {
- integrity: sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==,
- }
- engines: { node: ^20.19.0 || >=22.12.0 }
+ '@rolldown/binding-wasm32-wasi@1.1.5':
+ resolution: {integrity: sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [wasm32]
- "@rolldown/binding-win32-arm64-msvc@1.1.5":
- resolution:
- {
- integrity: sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==,
- }
- engines: { node: ^20.19.0 || >=22.12.0 }
+ '@rolldown/binding-win32-arm64-msvc@1.1.5':
+ resolution: {integrity: sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [win32]
- "@rolldown/binding-win32-x64-msvc@1.1.5":
- resolution:
- {
- integrity: sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==,
- }
- engines: { node: ^20.19.0 || >=22.12.0 }
+ '@rolldown/binding-win32-x64-msvc@1.1.5':
+ resolution: {integrity: sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [win32]
- "@rolldown/pluginutils@1.0.1":
- resolution:
- {
- integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==,
- }
-
- "@standard-schema/spec@1.1.0":
- resolution:
- {
- integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==,
- }
-
- "@tasknotes/model@file:vendor/tasknotes-model-0.3.0-rc.11.tgz":
- resolution:
- {
- integrity: sha512-67Sb9vqmhfXf2wXo7956w4JijzUyMYNngQ8xjjpHl6m02hVnv8H2N9iICaHS4191Ym6pEARuOUO9LYa4NKcB8w==,
- tarball: file:vendor/tasknotes-model-0.3.0-rc.11.tgz,
- }
- version: 0.3.0-rc.11
-
- "@testing-library/dom@10.4.1":
- resolution:
- {
- integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==,
- }
- engines: { node: ">=18" }
-
- "@testing-library/jest-dom@7.0.0":
- resolution:
- {
- integrity: sha512-HKAH9C6mBo5yBG6yRO5i43L2iisencAo5z+o5P/saHUoY+miC5ivXRxHBJcFyB5ypPNxHJdK3BoF/3O4DIptMg==,
- }
- engines: { node: ">=22", npm: ">=6", yarn: ">=1" }
+ '@rolldown/pluginutils@1.0.1':
+ resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==}
+
+ '@standard-schema/spec@1.1.0':
+ resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
+
+ '@tasknotes/model@file:vendor/tasknotes-model-0.3.0-rc.15.tgz':
+ resolution: {integrity: sha512-tsQ/Gmhi12QfKlrgJG5UEVQhbDAJz2Q1tu+UzVlsE3hDCEenZ09ByehbKjmFa75Epvr0bMOhzc8POa6NULhFgw==, tarball: file:vendor/tasknotes-model-0.3.0-rc.15.tgz}
+ version: 0.3.0-rc.15
+
+ '@testing-library/dom@10.4.1':
+ resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==}
+ engines: {node: '>=18'}
+
+ '@testing-library/jest-dom@7.0.0':
+ resolution: {integrity: sha512-HKAH9C6mBo5yBG6yRO5i43L2iisencAo5z+o5P/saHUoY+miC5ivXRxHBJcFyB5ypPNxHJdK3BoF/3O4DIptMg==}
+ engines: {node: '>=22', npm: '>=6', yarn: '>=1'}
peerDependencies:
- "@testing-library/dom": ">=10 <11"
-
- "@testing-library/react@16.3.2":
- resolution:
- {
- integrity: sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==,
- }
- engines: { node: ">=18" }
+ '@testing-library/dom': '>=10 <11'
+
+ '@testing-library/react@16.3.2':
+ resolution: {integrity: sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==}
+ engines: {node: '>=18'}
peerDependencies:
- "@testing-library/dom": ^10.0.0
- "@types/react": ^18.0.0 || ^19.0.0
- "@types/react-dom": ^18.0.0 || ^19.0.0
+ '@testing-library/dom': ^10.0.0
+ '@types/react': ^18.0.0 || ^19.0.0
+ '@types/react-dom': ^18.0.0 || ^19.0.0
react: ^18.0.0 || ^19.0.0
react-dom: ^18.0.0 || ^19.0.0
peerDependenciesMeta:
- "@types/react":
+ '@types/react':
optional: true
- "@types/react-dom":
+ '@types/react-dom':
optional: true
- "@tybys/wasm-util@0.10.3":
- resolution:
- {
- integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==,
- }
-
- "@types/aria-query@5.0.4":
- resolution:
- {
- integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==,
- }
-
- "@types/chai@5.2.3":
- resolution:
- {
- integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==,
- }
-
- "@types/deep-eql@4.0.2":
- resolution:
- {
- integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==,
- }
-
- "@types/esrecurse@4.3.1":
- resolution:
- {
- integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==,
- }
-
- "@types/estree@1.0.9":
- resolution:
- {
- integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==,
- }
-
- "@types/json-schema@7.0.15":
- resolution:
- {
- integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==,
- }
-
- "@types/node@26.2.0":
- resolution:
- {
- integrity: sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg==,
- }
-
- "@types/react-dom@19.2.3":
- resolution:
- {
- integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==,
- }
+ '@tybys/wasm-util@0.10.3':
+ resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==}
+
+ '@types/aria-query@5.0.4':
+ resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==}
+
+ '@types/chai@5.2.3':
+ resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==}
+
+ '@types/deep-eql@4.0.2':
+ resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==}
+
+ '@types/esrecurse@4.3.1':
+ resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==}
+
+ '@types/estree@1.0.9':
+ resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==}
+
+ '@types/json-schema@7.0.15':
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
+ '@types/node@26.2.0':
+ resolution: {integrity: sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg==}
+
+ '@types/react-dom@19.2.3':
+ resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==}
peerDependencies:
- "@types/react": ^19.2.0
-
- "@types/react@19.2.17":
- resolution:
- {
- integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==,
- }
-
- "@typescript-eslint/eslint-plugin@8.65.0":
- resolution:
- {
- integrity: sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA==,
- }
- engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
+ '@types/react': ^19.2.0
+
+ '@types/react@19.2.17':
+ resolution: {integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==}
+
+ '@typescript-eslint/eslint-plugin@8.65.0':
+ resolution: {integrity: sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- "@typescript-eslint/parser": ^8.65.0
+ '@typescript-eslint/parser': ^8.65.0
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
- typescript: ">=4.8.4 <6.1.0"
-
- "@typescript-eslint/parser@8.65.0":
- resolution:
- {
- integrity: sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==,
- }
- engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
+ typescript: '>=4.8.4 <6.1.0'
+
+ '@typescript-eslint/parser@8.65.0':
+ resolution: {integrity: sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
- typescript: ">=4.8.4 <6.1.0"
-
- "@typescript-eslint/project-service@8.65.0":
- resolution:
- {
- integrity: sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==,
- }
- engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
+ typescript: '>=4.8.4 <6.1.0'
+
+ '@typescript-eslint/project-service@8.65.0':
+ resolution: {integrity: sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- typescript: ">=4.8.4 <6.1.0"
-
- "@typescript-eslint/scope-manager@8.65.0":
- resolution:
- {
- integrity: sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==,
- }
- engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
-
- "@typescript-eslint/tsconfig-utils@8.65.0":
- resolution:
- {
- integrity: sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==,
- }
- engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
+ typescript: '>=4.8.4 <6.1.0'
+
+ '@typescript-eslint/scope-manager@8.65.0':
+ resolution: {integrity: sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/tsconfig-utils@8.65.0':
+ resolution: {integrity: sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- typescript: ">=4.8.4 <6.1.0"
-
- "@typescript-eslint/type-utils@8.65.0":
- resolution:
- {
- integrity: sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g==,
- }
- engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
+ typescript: '>=4.8.4 <6.1.0'
+
+ '@typescript-eslint/type-utils@8.65.0':
+ resolution: {integrity: sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
- typescript: ">=4.8.4 <6.1.0"
-
- "@typescript-eslint/types@8.65.0":
- resolution:
- {
- integrity: sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==,
- }
- engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
-
- "@typescript-eslint/typescript-estree@8.65.0":
- resolution:
- {
- integrity: sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==,
- }
- engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
+ typescript: '>=4.8.4 <6.1.0'
+
+ '@typescript-eslint/types@8.65.0':
+ resolution: {integrity: sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/typescript-estree@8.65.0':
+ resolution: {integrity: sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- typescript: ">=4.8.4 <6.1.0"
-
- "@typescript-eslint/utils@8.65.0":
- resolution:
- {
- integrity: sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==,
- }
- engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
+ typescript: '>=4.8.4 <6.1.0'
+
+ '@typescript-eslint/utils@8.65.0':
+ resolution: {integrity: sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
- typescript: ">=4.8.4 <6.1.0"
-
- "@typescript-eslint/visitor-keys@8.65.0":
- resolution:
- {
- integrity: sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==,
- }
- engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
-
- "@vitejs/plugin-react@6.0.3":
- resolution:
- {
- integrity: sha512-vmFvco5/QuC2f9Oj+wTk0+9XeDFkHxSamwZKYc7MxYwKICfvUvlMhqKI0VuICPltGqh1neqBKDvO4kes1ya8vg==,
- }
- engines: { node: ^20.19.0 || >=22.12.0 }
+ typescript: '>=4.8.4 <6.1.0'
+
+ '@typescript-eslint/visitor-keys@8.65.0':
+ resolution: {integrity: sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@vitejs/plugin-react@6.0.3':
+ resolution: {integrity: sha512-vmFvco5/QuC2f9Oj+wTk0+9XeDFkHxSamwZKYc7MxYwKICfvUvlMhqKI0VuICPltGqh1neqBKDvO4kes1ya8vg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
peerDependencies:
- "@rolldown/plugin-babel": ^0.1.7 || ^0.2.0
+ '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0
babel-plugin-react-compiler: ^1.0.0
vite: ^8.0.0
peerDependenciesMeta:
- "@rolldown/plugin-babel":
+ '@rolldown/plugin-babel':
optional: true
babel-plugin-react-compiler:
optional: true
- "@vitest/expect@4.1.10":
- resolution:
- {
- integrity: sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==,
- }
-
- "@vitest/mocker@4.1.10":
- resolution:
- {
- integrity: sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==,
- }
+ '@vitest/expect@4.1.10':
+ resolution: {integrity: sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==}
+
+ '@vitest/mocker@4.1.10':
+ resolution: {integrity: sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==}
peerDependencies:
msw: ^2.4.9
vite: ^6.0.0 || ^7.0.0 || ^8.0.0
@@ -897,57 +634,33 @@ packages:
vite:
optional: true
- "@vitest/pretty-format@4.1.10":
- resolution:
- {
- integrity: sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==,
- }
-
- "@vitest/runner@4.1.10":
- resolution:
- {
- integrity: sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==,
- }
-
- "@vitest/snapshot@4.1.10":
- resolution:
- {
- integrity: sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==,
- }
-
- "@vitest/spy@4.1.10":
- resolution:
- {
- integrity: sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==,
- }
-
- "@vitest/utils@4.1.10":
- resolution:
- {
- integrity: sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==,
- }
+ '@vitest/pretty-format@4.1.10':
+ resolution: {integrity: sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==}
+
+ '@vitest/runner@4.1.10':
+ resolution: {integrity: sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==}
+
+ '@vitest/snapshot@4.1.10':
+ resolution: {integrity: sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==}
+
+ '@vitest/spy@4.1.10':
+ resolution: {integrity: sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==}
+
+ '@vitest/utils@4.1.10':
+ resolution: {integrity: sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==}
acorn-jsx@5.3.2:
- resolution:
- {
- integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==,
- }
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
peerDependencies:
acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
acorn@8.18.0:
- resolution:
- {
- integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==,
- }
- engines: { node: ">=0.4.0" }
+ resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==}
+ engines: {node: '>=0.4.0'}
hasBin: true
ajv-formats@3.0.1:
- resolution:
- {
- integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==,
- }
+ resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==}
peerDependencies:
ajv: ^8.0.0
peerDependenciesMeta:
@@ -955,351 +668,201 @@ packages:
optional: true
ajv@6.15.0:
- resolution:
- {
- integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==,
- }
+ resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==}
ajv@8.20.0:
- resolution:
- {
- integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==,
- }
+ resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==}
ansi-regex@5.0.1:
- resolution:
- {
- integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==,
- }
- engines: { node: ">=8" }
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
ansi-styles@5.2.0:
- resolution:
- {
- integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==,
- }
- engines: { node: ">=10" }
+ resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
+ engines: {node: '>=10'}
aria-query@5.3.0:
- resolution:
- {
- integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==,
- }
+ resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
aria-query@5.3.2:
- resolution:
- {
- integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==,
- }
- engines: { node: ">= 0.4" }
+ resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
+ engines: {node: '>= 0.4'}
assertion-error@2.0.1:
- resolution:
- {
- integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==,
- }
- engines: { node: ">=12" }
+ resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
+ engines: {node: '>=12'}
balanced-match@4.0.4:
- resolution:
- {
- integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==,
- }
- engines: { node: 18 || 20 || >=22 }
+ resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==}
+ engines: {node: 18 || 20 || >=22}
baseline-browser-mapping@2.11.14:
- resolution:
- {
- integrity: sha512-JyJ954WzuIR8/FFzX0o5krdSTrBAkcCSRfWSleRsIHSWV+cZe2FI1PKggVkFke1hBldRs+LRxUczzE9iPmgZww==,
- }
- engines: { node: ">=6.0.0" }
+ resolution: {integrity: sha512-JyJ954WzuIR8/FFzX0o5krdSTrBAkcCSRfWSleRsIHSWV+cZe2FI1PKggVkFke1hBldRs+LRxUczzE9iPmgZww==}
+ engines: {node: '>=6.0.0'}
hasBin: true
bidi-js@1.0.3:
- resolution:
- {
- integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==,
- }
+ resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==}
brace-expansion@5.0.9:
- resolution:
- {
- integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==,
- }
- engines: { node: 20 || >=22 }
+ resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==}
+ engines: {node: 20 || >=22}
browserslist@4.28.8:
- resolution:
- {
- integrity: sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==,
- }
- engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 }
+ resolution: {integrity: sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
caniuse-lite@1.0.30001809:
- resolution:
- {
- integrity: sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==,
- }
+ resolution: {integrity: sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==}
chai@6.2.2:
- resolution:
- {
- integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==,
- }
- engines: { node: ">=18" }
+ resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==}
+ engines: {node: '>=18'}
convert-source-map@2.0.0:
- resolution:
- {
- integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==,
- }
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
cross-spawn@7.0.6:
- resolution:
- {
- integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==,
- }
- engines: { node: ">= 8" }
+ resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+ engines: {node: '>= 8'}
css-tree@3.2.1:
- resolution:
- {
- integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==,
- }
- engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0 }
+ resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
css.escape@1.5.1:
- resolution:
- {
- integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==,
- }
+ resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==}
csstype@3.2.3:
- resolution:
- {
- integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==,
- }
+ resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
data-urls@7.0.0:
- resolution:
- {
- integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==,
- }
- engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 }
+ resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==}
+ engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
debug@4.4.3:
- resolution:
- {
- integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==,
- }
- engines: { node: ">=6.0" }
+ resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
+ engines: {node: '>=6.0'}
peerDependencies:
- supports-color: "*"
+ supports-color: '*'
peerDependenciesMeta:
supports-color:
optional: true
decimal.js@10.6.0:
- resolution:
- {
- integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==,
- }
+ resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==}
deep-is@0.1.4:
- resolution:
- {
- integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==,
- }
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
dequal@2.0.3:
- resolution:
- {
- integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==,
- }
- engines: { node: ">=6" }
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
detect-libc@2.1.2:
- resolution:
- {
- integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==,
- }
- engines: { node: ">=8" }
+ resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
+ engines: {node: '>=8'}
dom-accessibility-api@0.5.16:
- resolution:
- {
- integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==,
- }
+ resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==}
dom-accessibility-api@0.6.3:
- resolution:
- {
- integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==,
- }
+ resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==}
electron-to-chromium@1.5.407:
- resolution:
- {
- integrity: sha512-4R8XgQOdfxexCd/u63lRm6wCHjECwI45MV9wxAs2ggtfWe2hwlo1ql97jKsju2IcJ+jFSTwBssyYoiWhh7mauQ==,
- }
+ resolution: {integrity: sha512-4R8XgQOdfxexCd/u63lRm6wCHjECwI45MV9wxAs2ggtfWe2hwlo1ql97jKsju2IcJ+jFSTwBssyYoiWhh7mauQ==}
entities@8.0.0:
- resolution:
- {
- integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==,
- }
- engines: { node: ">=20.19.0" }
+ resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==}
+ engines: {node: '>=20.19.0'}
es-module-lexer@2.3.1:
- resolution:
- {
- integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==,
- }
+ resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==}
escalade@3.2.0:
- resolution:
- {
- integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==,
- }
- engines: { node: ">=6" }
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+ engines: {node: '>=6'}
escape-string-regexp@4.0.0:
- resolution:
- {
- integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==,
- }
- engines: { node: ">=10" }
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
eslint-plugin-react-hooks@7.1.1:
- resolution:
- {
- integrity: sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==,
- }
- engines: { node: ">=18" }
+ resolution: {integrity: sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==}
+ engines: {node: '>=18'}
peerDependencies:
eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0
eslint-plugin-react-refresh@0.5.3:
- resolution:
- {
- integrity: sha512-5EMmLCV98Pi4o/f/3DP/v/tNqLHMIc9I8LKClNDWhZ9JTho89/kQcitCXQBMG7sAfVRK0Ie3T2EDOzp1YXYiVA==,
- }
+ resolution: {integrity: sha512-5EMmLCV98Pi4o/f/3DP/v/tNqLHMIc9I8LKClNDWhZ9JTho89/kQcitCXQBMG7sAfVRK0Ie3T2EDOzp1YXYiVA==}
peerDependencies:
eslint: ^9 || ^10
eslint-scope@9.1.2:
- resolution:
- {
- integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==,
- }
- engines: { node: ^20.19.0 || ^22.13.0 || >=24 }
+ resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
eslint-visitor-keys@3.4.3:
- resolution:
- {
- integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==,
- }
- engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 }
+ resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
eslint-visitor-keys@5.0.1:
- resolution:
- {
- integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==,
- }
- engines: { node: ^20.19.0 || ^22.13.0 || >=24 }
+ resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
eslint@10.7.0:
- resolution:
- {
- integrity: sha512-GVTD7s1vdIl6UYvAfriOPeY1Df8LIZjfofLvHwde+erDHGGuHyuM6xoxRxmHiebhYuD2p1vN4wWh0XzPARSGDQ==,
- }
- engines: { node: ^20.19.0 || ^22.13.0 || >=24 }
+ resolution: {integrity: sha512-GVTD7s1vdIl6UYvAfriOPeY1Df8LIZjfofLvHwde+erDHGGuHyuM6xoxRxmHiebhYuD2p1vN4wWh0XzPARSGDQ==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
hasBin: true
peerDependencies:
- jiti: "*"
+ jiti: '*'
peerDependenciesMeta:
jiti:
optional: true
espree@11.2.0:
- resolution:
- {
- integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==,
- }
- engines: { node: ^20.19.0 || ^22.13.0 || >=24 }
+ resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
esquery@1.7.0:
- resolution:
- {
- integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==,
- }
- engines: { node: ">=0.10" }
+ resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==}
+ engines: {node: '>=0.10'}
esrecurse@4.3.0:
- resolution:
- {
- integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==,
- }
- engines: { node: ">=4.0" }
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
estraverse@5.3.0:
- resolution:
- {
- integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==,
- }
- engines: { node: ">=4.0" }
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
estree-walker@3.0.3:
- resolution:
- {
- integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==,
- }
+ resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
esutils@2.0.3:
- resolution:
- {
- integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==,
- }
- engines: { node: ">=0.10.0" }
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+ engines: {node: '>=0.10.0'}
expect-type@1.4.0:
- resolution:
- {
- integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==,
- }
- engines: { node: ">=12.0.0" }
+ resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==}
+ engines: {node: '>=12.0.0'}
fast-deep-equal@3.1.3:
- resolution:
- {
- integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==,
- }
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
fast-json-stable-stringify@2.1.0:
- resolution:
- {
- integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==,
- }
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
fast-levenshtein@2.0.6:
- resolution:
- {
- integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==,
- }
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
fast-uri@3.1.5:
- resolution:
- {
- integrity: sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==,
- }
+ resolution: {integrity: sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==}
fdir@6.5.0:
- resolution:
- {
- integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==,
- }
- engines: { node: ">=12.0.0" }
+ resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
+ engines: {node: '>=12.0.0'}
peerDependencies:
picomatch: ^3 || ^4
peerDependenciesMeta:
@@ -1307,154 +870,88 @@ packages:
optional: true
file-entry-cache@8.0.0:
- resolution:
- {
- integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==,
- }
- engines: { node: ">=16.0.0" }
+ resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
+ engines: {node: '>=16.0.0'}
find-up@5.0.0:
- resolution:
- {
- integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==,
- }
- engines: { node: ">=10" }
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
flat-cache@4.0.1:
- resolution:
- {
- integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==,
- }
- engines: { node: ">=16" }
+ resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
+ engines: {node: '>=16'}
flatted@3.4.4:
- resolution:
- {
- integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==,
- }
+ resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==}
fsevents@2.3.2:
- resolution:
- {
- integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==,
- }
- engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 }
+ resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
fsevents@2.3.3:
- resolution:
- {
- integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==,
- }
- engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 }
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
gensync@1.0.0-beta.2:
- resolution:
- {
- integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==,
- }
- engines: { node: ">=6.9.0" }
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+ engines: {node: '>=6.9.0'}
glob-parent@6.0.2:
- resolution:
- {
- integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==,
- }
- engines: { node: ">=10.13.0" }
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
globals@17.7.0:
- resolution:
- {
- integrity: sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==,
- }
- engines: { node: ">=18" }
+ resolution: {integrity: sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==}
+ engines: {node: '>=18'}
hermes-estree@0.25.1:
- resolution:
- {
- integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==,
- }
+ resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==}
hermes-parser@0.25.1:
- resolution:
- {
- integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==,
- }
+ resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==}
html-encoding-sniffer@6.0.0:
- resolution:
- {
- integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==,
- }
- engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 }
+ resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==}
+ engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
ignore@5.3.2:
- resolution:
- {
- integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==,
- }
- engines: { node: ">= 4" }
+ resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
+ engines: {node: '>= 4'}
ignore@7.0.6:
- resolution:
- {
- integrity: sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==,
- }
- engines: { node: ">= 4" }
+ resolution: {integrity: sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==}
+ engines: {node: '>= 4'}
imurmurhash@0.1.4:
- resolution:
- {
- integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==,
- }
- engines: { node: ">=0.8.19" }
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+ engines: {node: '>=0.8.19'}
indent-string@4.0.0:
- resolution:
- {
- integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==,
- }
- engines: { node: ">=8" }
+ resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
+ engines: {node: '>=8'}
is-extglob@2.1.1:
- resolution:
- {
- integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==,
- }
- engines: { node: ">=0.10.0" }
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
is-glob@4.0.3:
- resolution:
- {
- integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==,
- }
- engines: { node: ">=0.10.0" }
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
is-potential-custom-element-name@1.0.1:
- resolution:
- {
- integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==,
- }
+ resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
isexe@2.0.0:
- resolution:
- {
- integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==,
- }
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
js-tokens@4.0.0:
- resolution:
- {
- integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==,
- }
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
jsdom@29.1.1:
- resolution:
- {
- integrity: sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==,
- }
- engines: { node: ^20.19.0 || ^22.13.0 || >=24.0.0 }
+ resolution: {integrity: sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0}
peerDependencies:
canvas: ^3.0.0
peerDependenciesMeta:
@@ -1462,646 +959,385 @@ packages:
optional: true
jsesc@3.1.0:
- resolution:
- {
- integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==,
- }
- engines: { node: ">=6" }
+ resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
+ engines: {node: '>=6'}
hasBin: true
json-buffer@3.0.1:
- resolution:
- {
- integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==,
- }
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
json-schema-traverse@0.4.1:
- resolution:
- {
- integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==,
- }
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
json-schema-traverse@1.0.0:
- resolution:
- {
- integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==,
- }
+ resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
json-stable-stringify-without-jsonify@1.0.1:
- resolution:
- {
- integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==,
- }
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
json5@2.2.3:
- resolution:
- {
- integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==,
- }
- engines: { node: ">=6" }
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
hasBin: true
keyv@4.5.4:
- resolution:
- {
- integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==,
- }
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
levn@0.4.1:
- resolution:
- {
- integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==,
- }
- engines: { node: ">= 0.8.0" }
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
lightningcss-android-arm64@1.33.0:
- resolution:
- {
- integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==,
- }
- engines: { node: ">= 12.0.0" }
+ resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==}
+ engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [android]
lightningcss-darwin-arm64@1.33.0:
- resolution:
- {
- integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==,
- }
- engines: { node: ">= 12.0.0" }
+ resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==}
+ engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [darwin]
lightningcss-darwin-x64@1.33.0:
- resolution:
- {
- integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==,
- }
- engines: { node: ">= 12.0.0" }
+ resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==}
+ engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [darwin]
lightningcss-freebsd-x64@1.33.0:
- resolution:
- {
- integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==,
- }
- engines: { node: ">= 12.0.0" }
+ resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==}
+ engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [freebsd]
lightningcss-linux-arm-gnueabihf@1.33.0:
- resolution:
- {
- integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==,
- }
- engines: { node: ">= 12.0.0" }
+ resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==}
+ engines: {node: '>= 12.0.0'}
cpu: [arm]
os: [linux]
lightningcss-linux-arm64-gnu@1.33.0:
- resolution:
- {
- integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==,
- }
- engines: { node: ">= 12.0.0" }
+ resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==}
+ engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [linux]
lightningcss-linux-arm64-musl@1.33.0:
- resolution:
- {
- integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==,
- }
- engines: { node: ">= 12.0.0" }
+ resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==}
+ engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [linux]
lightningcss-linux-x64-gnu@1.33.0:
- resolution:
- {
- integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==,
- }
- engines: { node: ">= 12.0.0" }
+ resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==}
+ engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [linux]
lightningcss-linux-x64-musl@1.33.0:
- resolution:
- {
- integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==,
- }
- engines: { node: ">= 12.0.0" }
+ resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==}
+ engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [linux]
lightningcss-win32-arm64-msvc@1.33.0:
- resolution:
- {
- integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==,
- }
- engines: { node: ">= 12.0.0" }
+ resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==}
+ engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [win32]
lightningcss-win32-x64-msvc@1.33.0:
- resolution:
- {
- integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==,
- }
- engines: { node: ">= 12.0.0" }
+ resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==}
+ engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [win32]
lightningcss@1.33.0:
- resolution:
- {
- integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==,
- }
- engines: { node: ">= 12.0.0" }
+ resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==}
+ engines: {node: '>= 12.0.0'}
locate-path@6.0.0:
- resolution:
- {
- integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==,
- }
- engines: { node: ">=10" }
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
lru-cache@11.5.2:
- resolution:
- {
- integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==,
- }
- engines: { node: 20 || >=22 }
+ resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==}
+ engines: {node: 20 || >=22}
lru-cache@5.1.1:
- resolution:
- {
- integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==,
- }
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
lucide-react@1.25.0:
- resolution:
- {
- integrity: sha512-/mdJTRbiwcLOQ1NZZK1amZF9rIZyvO18D6r9TngE6TG1NmqHgFuT4eE7Xrkm9UsXMbBJD1NlfwHVltCDWHrOTw==,
- }
+ resolution: {integrity: sha512-/mdJTRbiwcLOQ1NZZK1amZF9rIZyvO18D6r9TngE6TG1NmqHgFuT4eE7Xrkm9UsXMbBJD1NlfwHVltCDWHrOTw==}
peerDependencies:
react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
lz-string@1.5.0:
- resolution:
- {
- integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==,
- }
+ resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
hasBin: true
magic-string@0.30.21:
- resolution:
- {
- integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==,
- }
+ resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
mdn-data@2.27.1:
- resolution:
- {
- integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==,
- }
+ resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==}
min-indent@1.0.1:
- resolution:
- {
- integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==,
- }
- engines: { node: ">=4" }
+ resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
+ engines: {node: '>=4'}
minimatch@10.2.6:
- resolution:
- {
- integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==,
- }
- engines: { node: 18 || 20 || >=22 }
+ resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==}
+ engines: {node: 18 || 20 || >=22}
ms@2.1.3:
- resolution:
- {
- integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==,
- }
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
nanoid@3.3.18:
- resolution:
- {
- integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==,
- }
- engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 }
+ resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
natural-compare@1.4.0:
- resolution:
- {
- integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==,
- }
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
node-releases@2.0.53:
- resolution:
- {
- integrity: sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==,
- }
- engines: { node: ">=18" }
+ resolution: {integrity: sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==}
+ engines: {node: '>=18'}
obug@2.1.4:
- resolution:
- {
- integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==,
- }
- engines: { node: ">=12.20.0" }
+ resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==}
+ engines: {node: '>=12.20.0'}
optionator@0.9.4:
- resolution:
- {
- integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==,
- }
- engines: { node: ">= 0.8.0" }
+ resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
+ engines: {node: '>= 0.8.0'}
p-limit@3.1.0:
- resolution:
- {
- integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==,
- }
- engines: { node: ">=10" }
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
p-locate@5.0.0:
- resolution:
- {
- integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==,
- }
- engines: { node: ">=10" }
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
parse5@8.0.1:
- resolution:
- {
- integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==,
- }
+ resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==}
path-exists@4.0.0:
- resolution:
- {
- integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==,
- }
- engines: { node: ">=8" }
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
path-key@3.1.1:
- resolution:
- {
- integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==,
- }
- engines: { node: ">=8" }
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
pathe@2.0.3:
- resolution:
- {
- integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==,
- }
+ resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
picocolors@1.1.1:
- resolution:
- {
- integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==,
- }
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
picomatch@4.0.5:
- resolution:
- {
- integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==,
- }
- engines: { node: ">=12" }
+ resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==}
+ engines: {node: '>=12'}
playwright-core@1.61.1:
- resolution:
- {
- integrity: sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==,
- }
- engines: { node: ">=18" }
+ resolution: {integrity: sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==}
+ engines: {node: '>=18'}
hasBin: true
playwright@1.61.1:
- resolution:
- {
- integrity: sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==,
- }
- engines: { node: ">=18" }
+ resolution: {integrity: sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==}
+ engines: {node: '>=18'}
hasBin: true
postcss@8.5.26:
- resolution:
- {
- integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==,
- }
- engines: { node: ^10 || ^12 || >=14 }
+ resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==}
+ engines: {node: ^10 || ^12 || >=14}
prelude-ls@1.2.1:
- resolution:
- {
- integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==,
- }
- engines: { node: ">= 0.8.0" }
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+ engines: {node: '>= 0.8.0'}
prettier@3.9.6:
- resolution:
- {
- integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==,
- }
- engines: { node: ">=14" }
+ resolution: {integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==}
+ engines: {node: '>=14'}
hasBin: true
pretty-format@27.5.1:
- resolution:
- {
- integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==,
- }
- engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 }
+ resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
+ engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
punycode@2.3.1:
- resolution:
- {
- integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==,
- }
- engines: { node: ">=6" }
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
react-dom@19.2.8:
- resolution:
- {
- integrity: sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==,
- }
+ resolution: {integrity: sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==}
peerDependencies:
react: ^19.2.8
react-is@17.0.2:
- resolution:
- {
- integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==,
- }
+ resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
react@19.2.8:
- resolution:
- {
- integrity: sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==,
- }
- engines: { node: ">=0.10.0" }
+ resolution: {integrity: sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==}
+ engines: {node: '>=0.10.0'}
redent@3.0.0:
- resolution:
- {
- integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==,
- }
- engines: { node: ">=8" }
+ resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
+ engines: {node: '>=8'}
require-from-string@2.0.2:
- resolution:
- {
- integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==,
- }
- engines: { node: ">=0.10.0" }
+ resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+ engines: {node: '>=0.10.0'}
rolldown@1.1.5:
- resolution:
- {
- integrity: sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==,
- }
- engines: { node: ^20.19.0 || >=22.12.0 }
+ resolution: {integrity: sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
rrule@2.8.1:
- resolution:
- {
- integrity: sha512-hM3dHSBMeaJ0Ktp7W38BJZ7O1zOgaFEsn41PDk+yHoEtfLV+PoJt9E9xAlZiWgf/iqEqionN0ebHFZIDAp+iGw==,
- }
+ resolution: {integrity: sha512-hM3dHSBMeaJ0Ktp7W38BJZ7O1zOgaFEsn41PDk+yHoEtfLV+PoJt9E9xAlZiWgf/iqEqionN0ebHFZIDAp+iGw==}
saxes@6.0.0:
- resolution:
- {
- integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==,
- }
- engines: { node: ">=v12.22.7" }
+ resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==}
+ engines: {node: '>=v12.22.7'}
scheduler@0.27.0:
- resolution:
- {
- integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==,
- }
+ resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==}
semver@6.3.1:
- resolution:
- {
- integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==,
- }
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
hasBin: true
semver@7.8.5:
- resolution:
- {
- integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==,
- }
- engines: { node: ">=10" }
+ resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==}
+ engines: {node: '>=10'}
hasBin: true
shebang-command@2.0.0:
- resolution:
- {
- integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==,
- }
- engines: { node: ">=8" }
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
shebang-regex@3.0.0:
- resolution:
- {
- integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==,
- }
- engines: { node: ">=8" }
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
siginfo@2.0.0:
- resolution:
- {
- integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==,
- }
+ resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
source-map-js@1.2.1:
- resolution:
- {
- integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==,
- }
- engines: { node: ">=0.10.0" }
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ engines: {node: '>=0.10.0'}
stackback@0.0.2:
- resolution:
- {
- integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==,
- }
+ resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
std-env@4.2.0:
- resolution:
- {
- integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==,
- }
+ resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==}
strip-indent@3.0.0:
- resolution:
- {
- integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==,
- }
- engines: { node: ">=8" }
+ resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
+ engines: {node: '>=8'}
symbol-tree@3.2.4:
- resolution:
- {
- integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==,
- }
+ resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
tinybench@2.9.0:
- resolution:
- {
- integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==,
- }
+ resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
tinyexec@1.3.0:
- resolution:
- {
- integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==,
- }
- engines: { node: ">=18" }
+ resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==}
+ engines: {node: '>=18'}
tinyglobby@0.2.17:
- resolution:
- {
- integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==,
- }
- engines: { node: ">=12.0.0" }
+ resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==}
+ engines: {node: '>=12.0.0'}
tinyrainbow@3.1.1:
- resolution:
- {
- integrity: sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==,
- }
- engines: { node: ">=14.0.0" }
+ resolution: {integrity: sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==}
+ engines: {node: '>=14.0.0'}
tldts-core@7.4.10:
- resolution:
- {
- integrity: sha512-KnQjp53ZekKgm/r3l+u8kJGGzYgrWdP8+Mql7a4vijh2WE0IrZWspQj/TpTxDho/YxO+AnOZnIjQcCD+q6iJsw==,
- }
+ resolution: {integrity: sha512-KnQjp53ZekKgm/r3l+u8kJGGzYgrWdP8+Mql7a4vijh2WE0IrZWspQj/TpTxDho/YxO+AnOZnIjQcCD+q6iJsw==}
tldts@7.4.10:
- resolution:
- {
- integrity: sha512-GgouD1B+sWwvkaEq8vXC15DjQitxbvs12oIXELpconwm+Tg3zfcEv4jgzq3vtKverDXsg3VI8aRgNL2Nra0Iog==,
- }
+ resolution: {integrity: sha512-GgouD1B+sWwvkaEq8vXC15DjQitxbvs12oIXELpconwm+Tg3zfcEv4jgzq3vtKverDXsg3VI8aRgNL2Nra0Iog==}
hasBin: true
tough-cookie@6.0.2:
- resolution:
- {
- integrity: sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==,
- }
- engines: { node: ">=16" }
+ resolution: {integrity: sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==}
+ engines: {node: '>=16'}
tr46@6.0.0:
- resolution:
- {
- integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==,
- }
- engines: { node: ">=20" }
+ resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==}
+ engines: {node: '>=20'}
ts-api-utils@2.5.0:
- resolution:
- {
- integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==,
- }
- engines: { node: ">=18.12" }
+ resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==}
+ engines: {node: '>=18.12'}
peerDependencies:
- typescript: ">=4.8.4"
+ typescript: '>=4.8.4'
tslib@2.8.1:
- resolution:
- {
- integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==,
- }
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
type-check@0.4.0:
- resolution:
- {
- integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==,
- }
- engines: { node: ">= 0.8.0" }
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+ engines: {node: '>= 0.8.0'}
typescript-eslint@8.65.0:
- resolution:
- {
- integrity: sha512-/ggrHAwyjENDusvyxbuqxAC2dTnZg/Z8F+fgQtYIz+L6n/9HfSlEZcFGV/NsMNa6CkGk0xUjUAFwC0vHOflvIA==,
- }
- engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 }
+ resolution: {integrity: sha512-/ggrHAwyjENDusvyxbuqxAC2dTnZg/Z8F+fgQtYIz+L6n/9HfSlEZcFGV/NsMNa6CkGk0xUjUAFwC0vHOflvIA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
- typescript: ">=4.8.4 <6.1.0"
+ typescript: '>=4.8.4 <6.1.0'
typescript@6.0.3:
- resolution:
- {
- integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==,
- }
- engines: { node: ">=14.17" }
+ resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==}
+ engines: {node: '>=14.17'}
hasBin: true
undici-types@8.3.0:
- resolution:
- {
- integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==,
- }
+ resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==}
undici@7.29.0:
- resolution:
- {
- integrity: sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==,
- }
- engines: { node: ">=20.18.1" }
+ resolution: {integrity: sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==}
+ engines: {node: '>=20.18.1'}
update-browserslist-db@1.3.1:
- resolution:
- {
- integrity: sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==,
- }
+ resolution: {integrity: sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==}
hasBin: true
peerDependencies:
- browserslist: ">= 4.21.0"
+ browserslist: '>= 4.21.0'
uri-js@4.4.1:
- resolution:
- {
- integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==,
- }
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
vite@8.1.5:
- resolution:
- {
- integrity: sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==,
- }
- engines: { node: ^20.19.0 || >=22.12.0 }
+ resolution: {integrity: sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
peerDependencies:
- "@types/node": ^20.19.0 || >=22.12.0
- "@vitejs/devtools": ^0.3.0
+ '@types/node': ^20.19.0 || >=22.12.0
+ '@vitejs/devtools': ^0.3.0
esbuild: ^0.27.0 || ^0.28.0
- jiti: ">=1.21.0"
+ jiti: '>=1.21.0'
less: ^4.0.0
sass: ^1.70.0
sass-embedded: ^1.70.0
- stylus: ">=0.54.8"
+ stylus: '>=0.54.8'
sugarss: ^5.0.0
terser: ^5.16.0
tsx: ^4.8.1
yaml: ^2.4.2
peerDependenciesMeta:
- "@types/node":
+ '@types/node':
optional: true
- "@vitejs/devtools":
+ '@vitejs/devtools':
optional: true
esbuild:
optional: true
@@ -2125,43 +1361,40 @@ packages:
optional: true
vitest@4.1.10:
- resolution:
- {
- integrity: sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==,
- }
- engines: { node: ^20.0.0 || ^22.0.0 || >=24.0.0 }
+ resolution: {integrity: sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==}
+ engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0}
hasBin: true
peerDependencies:
- "@edge-runtime/vm": "*"
- "@opentelemetry/api": ^1.9.0
- "@types/node": ^20.0.0 || ^22.0.0 || >=24.0.0
- "@vitest/browser-playwright": 4.1.10
- "@vitest/browser-preview": 4.1.10
- "@vitest/browser-webdriverio": 4.1.10
- "@vitest/coverage-istanbul": 4.1.10
- "@vitest/coverage-v8": 4.1.10
- "@vitest/ui": 4.1.10
- happy-dom: "*"
- jsdom: "*"
+ '@edge-runtime/vm': '*'
+ '@opentelemetry/api': ^1.9.0
+ '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0
+ '@vitest/browser-playwright': 4.1.10
+ '@vitest/browser-preview': 4.1.10
+ '@vitest/browser-webdriverio': 4.1.10
+ '@vitest/coverage-istanbul': 4.1.10
+ '@vitest/coverage-v8': 4.1.10
+ '@vitest/ui': 4.1.10
+ happy-dom: '*'
+ jsdom: '*'
vite: ^6.0.0 || ^7.0.0 || ^8.0.0
peerDependenciesMeta:
- "@edge-runtime/vm":
+ '@edge-runtime/vm':
optional: true
- "@opentelemetry/api":
+ '@opentelemetry/api':
optional: true
- "@types/node":
+ '@types/node':
optional: true
- "@vitest/browser-playwright":
+ '@vitest/browser-playwright':
optional: true
- "@vitest/browser-preview":
+ '@vitest/browser-preview':
optional: true
- "@vitest/browser-webdriverio":
+ '@vitest/browser-webdriverio':
optional: true
- "@vitest/coverage-istanbul":
+ '@vitest/coverage-istanbul':
optional: true
- "@vitest/coverage-v8":
+ '@vitest/coverage-v8':
optional: true
- "@vitest/ui":
+ '@vitest/ui':
optional: true
happy-dom:
optional: true
@@ -2169,154 +1402,115 @@ packages:
optional: true
w3c-xmlserializer@5.0.0:
- resolution:
- {
- integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==,
- }
- engines: { node: ">=18" }
+ resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==}
+ engines: {node: '>=18'}
webidl-conversions@8.0.1:
- resolution:
- {
- integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==,
- }
- engines: { node: ">=20" }
+ resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==}
+ engines: {node: '>=20'}
whatwg-mimetype@5.0.0:
- resolution:
- {
- integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==,
- }
- engines: { node: ">=20" }
+ resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==}
+ engines: {node: '>=20'}
whatwg-url@16.0.1:
- resolution:
- {
- integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==,
- }
- engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 }
+ resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==}
+ engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
which@2.0.2:
- resolution:
- {
- integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==,
- }
- engines: { node: ">= 8" }
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
hasBin: true
why-is-node-running@2.3.0:
- resolution:
- {
- integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==,
- }
- engines: { node: ">=8" }
+ resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
+ engines: {node: '>=8'}
hasBin: true
word-wrap@1.2.5:
- resolution:
- {
- integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==,
- }
- engines: { node: ">=0.10.0" }
+ resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+ engines: {node: '>=0.10.0'}
xml-name-validator@5.0.0:
- resolution:
- {
- integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==,
- }
- engines: { node: ">=18" }
+ resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==}
+ engines: {node: '>=18'}
xmlchars@2.2.0:
- resolution:
- {
- integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==,
- }
+ resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==}
yallist@3.1.1:
- resolution:
- {
- integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==,
- }
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
yaml@2.8.2:
- resolution:
- {
- integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==,
- }
- engines: { node: ">= 14.6" }
+ resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==}
+ engines: {node: '>= 14.6'}
+ hasBin: true
+
+ yaml@2.9.1:
+ resolution: {integrity: sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==}
+ engines: {node: '>= 14.6'}
hasBin: true
yocto-queue@0.1.0:
- resolution:
- {
- integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==,
- }
- engines: { node: ">=10" }
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
zod-validation-error@4.0.2:
- resolution:
- {
- integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==,
- }
- engines: { node: ">=18.0.0" }
+ resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==}
+ engines: {node: '>=18.0.0'}
peerDependencies:
zod: ^3.25.0 || ^4.0.0
zod@3.25.76:
- resolution:
- {
- integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==,
- }
+ resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==}
zod@4.4.3:
- resolution:
- {
- integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==,
- }
+ resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==}
snapshots:
- "@adobe/css-tools@4.5.0": {}
- "@asamuzakjp/css-color@5.1.11":
+ '@adobe/css-tools@4.5.0': {}
+
+ '@asamuzakjp/css-color@5.1.11':
dependencies:
- "@asamuzakjp/generational-cache": 1.0.1
- "@csstools/css-calc": 3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)
- "@csstools/css-color-parser": 4.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)
- "@csstools/css-parser-algorithms": 4.0.0(@csstools/css-tokenizer@4.0.0)
- "@csstools/css-tokenizer": 4.0.0
+ '@asamuzakjp/generational-cache': 1.0.1
+ '@csstools/css-calc': 3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)
+ '@csstools/css-color-parser': 4.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)
+ '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0)
+ '@csstools/css-tokenizer': 4.0.0
- "@asamuzakjp/dom-selector@7.1.1":
+ '@asamuzakjp/dom-selector@7.1.1':
dependencies:
- "@asamuzakjp/generational-cache": 1.0.1
- "@asamuzakjp/nwsapi": 2.3.9
+ '@asamuzakjp/generational-cache': 1.0.1
+ '@asamuzakjp/nwsapi': 2.3.9
bidi-js: 1.0.3
css-tree: 3.2.1
is-potential-custom-element-name: 1.0.1
- "@asamuzakjp/generational-cache@1.0.1": {}
+ '@asamuzakjp/generational-cache@1.0.1': {}
- "@asamuzakjp/nwsapi@2.3.9": {}
+ '@asamuzakjp/nwsapi@2.3.9': {}
- "@babel/code-frame@7.29.7":
+ '@babel/code-frame@7.29.7':
dependencies:
- "@babel/helper-validator-identifier": 7.29.7
+ '@babel/helper-validator-identifier': 7.29.7
js-tokens: 4.0.0
picocolors: 1.1.1
- "@babel/compat-data@7.29.7": {}
+ '@babel/compat-data@7.29.7': {}
- "@babel/core@7.29.7":
+ '@babel/core@7.29.7':
dependencies:
- "@babel/code-frame": 7.29.7
- "@babel/generator": 7.29.8
- "@babel/helper-compilation-targets": 7.29.7
- "@babel/helper-module-transforms": 7.29.7(@babel/core@7.29.7)
- "@babel/helpers": 7.29.7
- "@babel/parser": 7.29.8
- "@babel/template": 7.29.7
- "@babel/traverse": 7.29.8
- "@babel/types": 7.29.8
- "@jridgewell/remapping": 2.3.5
+ '@babel/code-frame': 7.29.7
+ '@babel/generator': 7.29.8
+ '@babel/helper-compilation-targets': 7.29.7
+ '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7)
+ '@babel/helpers': 7.29.7
+ '@babel/parser': 7.29.8
+ '@babel/template': 7.29.7
+ '@babel/traverse': 7.29.8
+ '@babel/types': 7.29.8
+ '@jridgewell/remapping': 2.3.5
convert-source-map: 2.0.0
debug: 4.4.3
gensync: 1.0.0-beta.2
@@ -2325,351 +1519,380 @@ snapshots:
transitivePeerDependencies:
- supports-color
- "@babel/generator@7.29.8":
+ '@babel/generator@7.29.8':
dependencies:
- "@babel/parser": 7.29.8
- "@babel/types": 7.29.8
- "@jridgewell/gen-mapping": 0.3.13
- "@jridgewell/trace-mapping": 0.3.31
+ '@babel/parser': 7.29.8
+ '@babel/types': 7.29.8
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
jsesc: 3.1.0
- "@babel/helper-compilation-targets@7.29.7":
+ '@babel/helper-compilation-targets@7.29.7':
dependencies:
- "@babel/compat-data": 7.29.7
- "@babel/helper-validator-option": 7.29.7
+ '@babel/compat-data': 7.29.7
+ '@babel/helper-validator-option': 7.29.7
browserslist: 4.28.8
lru-cache: 5.1.1
semver: 6.3.1
- "@babel/helper-globals@7.29.7": {}
+ '@babel/helper-globals@7.29.7': {}
- "@babel/helper-module-imports@7.29.7":
+ '@babel/helper-module-imports@7.29.7':
dependencies:
- "@babel/traverse": 7.29.8
- "@babel/types": 7.29.8
+ '@babel/traverse': 7.29.8
+ '@babel/types': 7.29.8
transitivePeerDependencies:
- supports-color
- "@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)":
+ '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)':
dependencies:
- "@babel/core": 7.29.7
- "@babel/helper-module-imports": 7.29.7
- "@babel/helper-validator-identifier": 7.29.7
- "@babel/traverse": 7.29.8
+ '@babel/core': 7.29.7
+ '@babel/helper-module-imports': 7.29.7
+ '@babel/helper-validator-identifier': 7.29.7
+ '@babel/traverse': 7.29.8
transitivePeerDependencies:
- supports-color
- "@babel/helper-string-parser@7.29.7": {}
+ '@babel/helper-string-parser@7.29.7': {}
- "@babel/helper-validator-identifier@7.29.7": {}
+ '@babel/helper-validator-identifier@7.29.7': {}
- "@babel/helper-validator-option@7.29.7": {}
+ '@babel/helper-validator-option@7.29.7': {}
- "@babel/helpers@7.29.7":
+ '@babel/helpers@7.29.7':
dependencies:
- "@babel/template": 7.29.7
- "@babel/types": 7.29.8
+ '@babel/template': 7.29.7
+ '@babel/types': 7.29.8
- "@babel/parser@7.29.8":
+ '@babel/parser@7.29.8':
dependencies:
- "@babel/types": 7.29.8
+ '@babel/types': 7.29.8
- "@babel/runtime@7.29.7": {}
+ '@babel/runtime@7.29.7': {}
- "@babel/template@7.29.7":
+ '@babel/template@7.29.7':
dependencies:
- "@babel/code-frame": 7.29.7
- "@babel/parser": 7.29.8
- "@babel/types": 7.29.8
+ '@babel/code-frame': 7.29.7
+ '@babel/parser': 7.29.8
+ '@babel/types': 7.29.8
- "@babel/traverse@7.29.8":
+ '@babel/traverse@7.29.8':
dependencies:
- "@babel/code-frame": 7.29.7
- "@babel/generator": 7.29.8
- "@babel/helper-globals": 7.29.7
- "@babel/parser": 7.29.8
- "@babel/template": 7.29.7
- "@babel/types": 7.29.8
+ '@babel/code-frame': 7.29.7
+ '@babel/generator': 7.29.8
+ '@babel/helper-globals': 7.29.7
+ '@babel/parser': 7.29.8
+ '@babel/template': 7.29.7
+ '@babel/types': 7.29.8
debug: 4.4.3
transitivePeerDependencies:
- supports-color
- "@babel/types@7.29.8":
+ '@babel/types@7.29.8':
dependencies:
- "@babel/helper-string-parser": 7.29.7
- "@babel/helper-validator-identifier": 7.29.7
+ '@babel/helper-string-parser': 7.29.7
+ '@babel/helper-validator-identifier': 7.29.7
- "@bramus/specificity@2.4.2":
+ '@bramus/specificity@2.4.2':
dependencies:
css-tree: 3.2.1
- "@csstools/color-helpers@6.1.1": {}
+ '@csstools/color-helpers@6.1.1': {}
- "@csstools/css-calc@3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)":
+ '@csstools/css-calc@3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)':
dependencies:
- "@csstools/css-parser-algorithms": 4.0.0(@csstools/css-tokenizer@4.0.0)
- "@csstools/css-tokenizer": 4.0.0
+ '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0)
+ '@csstools/css-tokenizer': 4.0.0
- "@csstools/css-color-parser@4.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)":
+ '@csstools/css-color-parser@4.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)':
dependencies:
- "@csstools/color-helpers": 6.1.1
- "@csstools/css-calc": 3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)
- "@csstools/css-parser-algorithms": 4.0.0(@csstools/css-tokenizer@4.0.0)
- "@csstools/css-tokenizer": 4.0.0
+ '@csstools/color-helpers': 6.1.1
+ '@csstools/css-calc': 3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)
+ '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0)
+ '@csstools/css-tokenizer': 4.0.0
- "@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)":
+ '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)':
dependencies:
- "@csstools/css-tokenizer": 4.0.0
+ '@csstools/css-tokenizer': 4.0.0
- "@csstools/css-syntax-patches-for-csstree@1.1.8(css-tree@3.2.1)":
+ '@csstools/css-syntax-patches-for-csstree@1.1.8(css-tree@3.2.1)':
optionalDependencies:
css-tree: 3.2.1
- "@csstools/css-tokenizer@4.0.0": {}
+ '@csstools/css-tokenizer@4.0.0': {}
- "@emnapi/core@1.11.1":
+ '@emnapi/core@1.11.1':
dependencies:
- "@emnapi/wasi-threads": 1.2.2
+ '@emnapi/wasi-threads': 1.2.2
tslib: 2.8.1
optional: true
- "@emnapi/runtime@1.11.1":
+ '@emnapi/runtime@1.11.1':
dependencies:
tslib: 2.8.1
optional: true
- "@emnapi/wasi-threads@1.2.2":
+ '@emnapi/wasi-threads@1.2.2':
dependencies:
tslib: 2.8.1
optional: true
- "@eslint-community/eslint-utils@4.10.1(eslint@10.7.0)":
+ '@eslint-community/eslint-utils@4.10.1(eslint@10.7.0)':
dependencies:
eslint: 10.7.0
eslint-visitor-keys: 3.4.3
- "@eslint-community/regexpp@4.12.2": {}
+ '@eslint-community/regexpp@4.12.2': {}
- "@eslint/config-array@0.23.5":
+ '@eslint/config-array@0.23.5':
dependencies:
- "@eslint/object-schema": 3.0.5
+ '@eslint/object-schema': 3.0.5
debug: 4.4.3
minimatch: 10.2.6
transitivePeerDependencies:
- supports-color
- "@eslint/config-helpers@0.6.0":
+ '@eslint/config-helpers@0.6.0':
dependencies:
- "@eslint/core": 1.2.1
+ '@eslint/core': 1.2.1
- "@eslint/core@1.2.1":
+ '@eslint/core@1.2.1':
dependencies:
- "@types/json-schema": 7.0.15
+ '@types/json-schema': 7.0.15
- "@eslint/js@10.0.1(eslint@10.7.0)":
+ '@eslint/js@10.0.1(eslint@10.7.0)':
optionalDependencies:
eslint: 10.7.0
- "@eslint/object-schema@3.0.5": {}
+ '@eslint/object-schema@3.0.5': {}
- "@eslint/plugin-kit@0.7.2":
+ '@eslint/plugin-kit@0.7.2':
dependencies:
- "@eslint/core": 1.2.1
+ '@eslint/core': 1.2.1
levn: 0.4.1
- "@exodus/bytes@1.15.1": {}
+ '@exodus/bytes@1.15.1(@noble/hashes@2.4.0)':
+ optionalDependencies:
+ '@noble/hashes': 2.4.0
- "@fontsource/atkinson-hyperlegible@5.3.0": {}
+ '@fontsource-variable/atkinson-hyperlegible-next@5.3.0': {}
- "@fontsource/azeret-mono@5.3.0": {}
+ '@fontsource/atkinson-hyperlegible@5.3.0': {}
- "@humanfs/core@0.19.2":
+ '@fontsource/azeret-mono@5.3.0': {}
+
+ '@humanfs/core@0.19.2':
dependencies:
- "@humanfs/types": 0.15.0
+ '@humanfs/types': 0.15.0
- "@humanfs/node@0.16.8":
+ '@humanfs/node@0.16.8':
dependencies:
- "@humanfs/core": 0.19.2
- "@humanfs/types": 0.15.0
- "@humanwhocodes/retry": 0.4.3
+ '@humanfs/core': 0.19.2
+ '@humanfs/types': 0.15.0
+ '@humanwhocodes/retry': 0.4.3
- "@humanfs/types@0.15.0": {}
+ '@humanfs/types@0.15.0': {}
- "@humanwhocodes/module-importer@1.0.1": {}
+ '@humanwhocodes/module-importer@1.0.1': {}
- "@humanwhocodes/retry@0.4.3": {}
+ '@humanwhocodes/retry@0.4.3': {}
- "@jridgewell/gen-mapping@0.3.13":
+ '@jridgewell/gen-mapping@0.3.13':
dependencies:
- "@jridgewell/sourcemap-codec": 1.5.5
- "@jridgewell/trace-mapping": 0.3.31
+ '@jridgewell/sourcemap-codec': 1.5.5
+ '@jridgewell/trace-mapping': 0.3.31
- "@jridgewell/remapping@2.3.5":
+ '@jridgewell/remapping@2.3.5':
dependencies:
- "@jridgewell/gen-mapping": 0.3.13
- "@jridgewell/trace-mapping": 0.3.31
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
- "@jridgewell/resolve-uri@3.1.2": {}
+ '@jridgewell/resolve-uri@3.1.2': {}
- "@jridgewell/sourcemap-codec@1.5.5": {}
+ '@jridgewell/sourcemap-codec@1.5.5': {}
- "@jridgewell/trace-mapping@0.3.31":
+ '@jridgewell/trace-mapping@0.3.31':
dependencies:
- "@jridgewell/resolve-uri": 3.1.2
- "@jridgewell/sourcemap-codec": 1.5.5
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.5
- "@mdbase-dev/connect-protocol@file:vendor/mdbase-dev-connect-protocol-0.1.0-beta.96-56ed32ffde05.tgz":
+ '@mdbase-dev/connect-protocol@file:vendor/mdbase-dev-connect-protocol-0.1.0-beta.129-d765e675c3da.tgz':
dependencies:
+ '@noble/hashes': 2.4.0
ajv: 8.20.0
ajv-formats: 3.0.1(ajv@8.20.0)
+ yaml: 2.9.1
+
+ '@mdbase-dev/connect@file:vendor/mdbase-dev-connect-0.1.0-beta.96-56ed32ffde05.tgz':
+ dependencies:
+ '@mdbase-dev/connect-protocol': file:vendor/mdbase-dev-connect-protocol-0.1.0-beta.129-d765e675c3da.tgz
- "@mdbase-dev/connect@file:vendor/mdbase-dev-connect-0.1.0-beta.96-56ed32ffde05.tgz":
+ '@mdbase-dev/sdk@file:vendor/mdbase-dev-sdk-dev-72f8ea6c.tgz':
dependencies:
- "@mdbase-dev/connect-protocol": file:vendor/mdbase-dev-connect-protocol-0.1.0-beta.96-56ed32ffde05.tgz
+ '@noble/ciphers': 2.4.0
+ '@noble/curves': 2.4.0
+ '@noble/hashes': 2.4.0
- "@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)":
+ '@mdbase-dev/ui@file:vendor/ui-dev-9553ad66.tgz(@mdbase-dev/sdk@file:vendor/mdbase-dev-sdk-dev-72f8ea6c.tgz)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
dependencies:
- "@emnapi/core": 1.11.1
- "@emnapi/runtime": 1.11.1
- "@tybys/wasm-util": 0.10.3
+ '@fontsource-variable/atkinson-hyperlegible-next': 5.3.0
+ '@fontsource/azeret-mono': 5.3.0
+ react: 19.2.8
+ optionalDependencies:
+ '@mdbase-dev/sdk': file:vendor/mdbase-dev-sdk-dev-72f8ea6c.tgz
+ react-dom: 19.2.8(react@19.2.8)
+
+ '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)':
+ dependencies:
+ '@emnapi/core': 1.11.1
+ '@emnapi/runtime': 1.11.1
+ '@tybys/wasm-util': 0.10.3
optional: true
- "@oxc-project/types@0.139.0": {}
+ '@noble/ciphers@2.4.0': {}
+
+ '@noble/curves@2.4.0':
+ dependencies:
+ '@noble/hashes': 2.4.0
+
+ '@noble/hashes@2.4.0': {}
+
+ '@oxc-project/types@0.139.0': {}
- "@playwright/test@1.61.1":
+ '@playwright/test@1.61.1':
dependencies:
playwright: 1.61.1
- "@rolldown/binding-android-arm64@1.1.5":
+ '@rolldown/binding-android-arm64@1.1.5':
optional: true
- "@rolldown/binding-darwin-arm64@1.1.5":
+ '@rolldown/binding-darwin-arm64@1.1.5':
optional: true
- "@rolldown/binding-darwin-x64@1.1.5":
+ '@rolldown/binding-darwin-x64@1.1.5':
optional: true
- "@rolldown/binding-freebsd-x64@1.1.5":
+ '@rolldown/binding-freebsd-x64@1.1.5':
optional: true
- "@rolldown/binding-linux-arm-gnueabihf@1.1.5":
+ '@rolldown/binding-linux-arm-gnueabihf@1.1.5':
optional: true
- "@rolldown/binding-linux-arm64-gnu@1.1.5":
+ '@rolldown/binding-linux-arm64-gnu@1.1.5':
optional: true
- "@rolldown/binding-linux-arm64-musl@1.1.5":
+ '@rolldown/binding-linux-arm64-musl@1.1.5':
optional: true
- "@rolldown/binding-linux-ppc64-gnu@1.1.5":
+ '@rolldown/binding-linux-ppc64-gnu@1.1.5':
optional: true
- "@rolldown/binding-linux-s390x-gnu@1.1.5":
+ '@rolldown/binding-linux-s390x-gnu@1.1.5':
optional: true
- "@rolldown/binding-linux-x64-gnu@1.1.5":
+ '@rolldown/binding-linux-x64-gnu@1.1.5':
optional: true
- "@rolldown/binding-linux-x64-musl@1.1.5":
+ '@rolldown/binding-linux-x64-musl@1.1.5':
optional: true
- "@rolldown/binding-openharmony-arm64@1.1.5":
+ '@rolldown/binding-openharmony-arm64@1.1.5':
optional: true
- "@rolldown/binding-wasm32-wasi@1.1.5":
+ '@rolldown/binding-wasm32-wasi@1.1.5':
dependencies:
- "@emnapi/core": 1.11.1
- "@emnapi/runtime": 1.11.1
- "@napi-rs/wasm-runtime": 1.2.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)
+ '@emnapi/core': 1.11.1
+ '@emnapi/runtime': 1.11.1
+ '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)
optional: true
- "@rolldown/binding-win32-arm64-msvc@1.1.5":
+ '@rolldown/binding-win32-arm64-msvc@1.1.5':
optional: true
- "@rolldown/binding-win32-x64-msvc@1.1.5":
+ '@rolldown/binding-win32-x64-msvc@1.1.5':
optional: true
- "@rolldown/pluginutils@1.0.1": {}
+ '@rolldown/pluginutils@1.0.1': {}
- "@standard-schema/spec@1.1.0": {}
+ '@standard-schema/spec@1.1.0': {}
- "@tasknotes/model@file:vendor/tasknotes-model-0.3.0-rc.11.tgz":
+ '@tasknotes/model@file:vendor/tasknotes-model-0.3.0-rc.15.tgz':
dependencies:
rrule: 2.8.1
yaml: 2.8.2
zod: 3.25.76
- "@testing-library/dom@10.4.1":
+ '@testing-library/dom@10.4.1':
dependencies:
- "@babel/code-frame": 7.29.7
- "@babel/runtime": 7.29.7
- "@types/aria-query": 5.0.4
+ '@babel/code-frame': 7.29.7
+ '@babel/runtime': 7.29.7
+ '@types/aria-query': 5.0.4
aria-query: 5.3.0
dom-accessibility-api: 0.5.16
lz-string: 1.5.0
picocolors: 1.1.1
pretty-format: 27.5.1
- "@testing-library/jest-dom@7.0.0(@testing-library/dom@10.4.1)":
+ '@testing-library/jest-dom@7.0.0(@testing-library/dom@10.4.1)':
dependencies:
- "@adobe/css-tools": 4.5.0
- "@testing-library/dom": 10.4.1
+ '@adobe/css-tools': 4.5.0
+ '@testing-library/dom': 10.4.1
aria-query: 5.3.2
css.escape: 1.5.1
dom-accessibility-api: 0.6.3
picocolors: 1.1.1
redent: 3.0.0
- "@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)":
+ '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
dependencies:
- "@babel/runtime": 7.29.7
- "@testing-library/dom": 10.4.1
+ '@babel/runtime': 7.29.7
+ '@testing-library/dom': 10.4.1
react: 19.2.8
react-dom: 19.2.8(react@19.2.8)
optionalDependencies:
- "@types/react": 19.2.17
- "@types/react-dom": 19.2.3(@types/react@19.2.17)
+ '@types/react': 19.2.17
+ '@types/react-dom': 19.2.3(@types/react@19.2.17)
- "@tybys/wasm-util@0.10.3":
+ '@tybys/wasm-util@0.10.3':
dependencies:
tslib: 2.8.1
optional: true
- "@types/aria-query@5.0.4": {}
+ '@types/aria-query@5.0.4': {}
- "@types/chai@5.2.3":
+ '@types/chai@5.2.3':
dependencies:
- "@types/deep-eql": 4.0.2
+ '@types/deep-eql': 4.0.2
assertion-error: 2.0.1
- "@types/deep-eql@4.0.2": {}
+ '@types/deep-eql@4.0.2': {}
- "@types/esrecurse@4.3.1": {}
+ '@types/esrecurse@4.3.1': {}
- "@types/estree@1.0.9": {}
+ '@types/estree@1.0.9': {}
- "@types/json-schema@7.0.15": {}
+ '@types/json-schema@7.0.15': {}
- "@types/node@26.2.0":
+ '@types/node@26.2.0':
dependencies:
undici-types: 8.3.0
- "@types/react-dom@19.2.3(@types/react@19.2.17)":
+ '@types/react-dom@19.2.3(@types/react@19.2.17)':
dependencies:
- "@types/react": 19.2.17
+ '@types/react': 19.2.17
- "@types/react@19.2.17":
+ '@types/react@19.2.17':
dependencies:
csstype: 3.2.3
- "@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.7.0)(typescript@6.0.3))(eslint@10.7.0)(typescript@6.0.3)":
+ '@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.7.0)(typescript@6.0.3))(eslint@10.7.0)(typescript@6.0.3)':
dependencies:
- "@eslint-community/regexpp": 4.12.2
- "@typescript-eslint/parser": 8.65.0(eslint@10.7.0)(typescript@6.0.3)
- "@typescript-eslint/scope-manager": 8.65.0
- "@typescript-eslint/type-utils": 8.65.0(eslint@10.7.0)(typescript@6.0.3)
- "@typescript-eslint/utils": 8.65.0(eslint@10.7.0)(typescript@6.0.3)
- "@typescript-eslint/visitor-keys": 8.65.0
+ '@eslint-community/regexpp': 4.12.2
+ '@typescript-eslint/parser': 8.65.0(eslint@10.7.0)(typescript@6.0.3)
+ '@typescript-eslint/scope-manager': 8.65.0
+ '@typescript-eslint/type-utils': 8.65.0(eslint@10.7.0)(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.65.0(eslint@10.7.0)(typescript@6.0.3)
+ '@typescript-eslint/visitor-keys': 8.65.0
eslint: 10.7.0
ignore: 7.0.6
natural-compare: 1.4.0
@@ -2678,41 +1901,41 @@ snapshots:
transitivePeerDependencies:
- supports-color
- "@typescript-eslint/parser@8.65.0(eslint@10.7.0)(typescript@6.0.3)":
+ '@typescript-eslint/parser@8.65.0(eslint@10.7.0)(typescript@6.0.3)':
dependencies:
- "@typescript-eslint/scope-manager": 8.65.0
- "@typescript-eslint/types": 8.65.0
- "@typescript-eslint/typescript-estree": 8.65.0(typescript@6.0.3)
- "@typescript-eslint/visitor-keys": 8.65.0
+ '@typescript-eslint/scope-manager': 8.65.0
+ '@typescript-eslint/types': 8.65.0
+ '@typescript-eslint/typescript-estree': 8.65.0(typescript@6.0.3)
+ '@typescript-eslint/visitor-keys': 8.65.0
debug: 4.4.3
eslint: 10.7.0
typescript: 6.0.3
transitivePeerDependencies:
- supports-color
- "@typescript-eslint/project-service@8.65.0(typescript@6.0.3)":
+ '@typescript-eslint/project-service@8.65.0(typescript@6.0.3)':
dependencies:
- "@typescript-eslint/tsconfig-utils": 8.65.0(typescript@6.0.3)
- "@typescript-eslint/types": 8.65.0
+ '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@6.0.3)
+ '@typescript-eslint/types': 8.65.0
debug: 4.4.3
typescript: 6.0.3
transitivePeerDependencies:
- supports-color
- "@typescript-eslint/scope-manager@8.65.0":
+ '@typescript-eslint/scope-manager@8.65.0':
dependencies:
- "@typescript-eslint/types": 8.65.0
- "@typescript-eslint/visitor-keys": 8.65.0
+ '@typescript-eslint/types': 8.65.0
+ '@typescript-eslint/visitor-keys': 8.65.0
- "@typescript-eslint/tsconfig-utils@8.65.0(typescript@6.0.3)":
+ '@typescript-eslint/tsconfig-utils@8.65.0(typescript@6.0.3)':
dependencies:
typescript: 6.0.3
- "@typescript-eslint/type-utils@8.65.0(eslint@10.7.0)(typescript@6.0.3)":
+ '@typescript-eslint/type-utils@8.65.0(eslint@10.7.0)(typescript@6.0.3)':
dependencies:
- "@typescript-eslint/types": 8.65.0
- "@typescript-eslint/typescript-estree": 8.65.0(typescript@6.0.3)
- "@typescript-eslint/utils": 8.65.0(eslint@10.7.0)(typescript@6.0.3)
+ '@typescript-eslint/types': 8.65.0
+ '@typescript-eslint/typescript-estree': 8.65.0(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.65.0(eslint@10.7.0)(typescript@6.0.3)
debug: 4.4.3
eslint: 10.7.0
ts-api-utils: 2.5.0(typescript@6.0.3)
@@ -2720,14 +1943,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
- "@typescript-eslint/types@8.65.0": {}
+ '@typescript-eslint/types@8.65.0': {}
- "@typescript-eslint/typescript-estree@8.65.0(typescript@6.0.3)":
+ '@typescript-eslint/typescript-estree@8.65.0(typescript@6.0.3)':
dependencies:
- "@typescript-eslint/project-service": 8.65.0(typescript@6.0.3)
- "@typescript-eslint/tsconfig-utils": 8.65.0(typescript@6.0.3)
- "@typescript-eslint/types": 8.65.0
- "@typescript-eslint/visitor-keys": 8.65.0
+ '@typescript-eslint/project-service': 8.65.0(typescript@6.0.3)
+ '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@6.0.3)
+ '@typescript-eslint/types': 8.65.0
+ '@typescript-eslint/visitor-keys': 8.65.0
debug: 4.4.3
minimatch: 10.2.6
semver: 7.8.5
@@ -2737,65 +1960,65 @@ snapshots:
transitivePeerDependencies:
- supports-color
- "@typescript-eslint/utils@8.65.0(eslint@10.7.0)(typescript@6.0.3)":
+ '@typescript-eslint/utils@8.65.0(eslint@10.7.0)(typescript@6.0.3)':
dependencies:
- "@eslint-community/eslint-utils": 4.10.1(eslint@10.7.0)
- "@typescript-eslint/scope-manager": 8.65.0
- "@typescript-eslint/types": 8.65.0
- "@typescript-eslint/typescript-estree": 8.65.0(typescript@6.0.3)
+ '@eslint-community/eslint-utils': 4.10.1(eslint@10.7.0)
+ '@typescript-eslint/scope-manager': 8.65.0
+ '@typescript-eslint/types': 8.65.0
+ '@typescript-eslint/typescript-estree': 8.65.0(typescript@6.0.3)
eslint: 10.7.0
typescript: 6.0.3
transitivePeerDependencies:
- supports-color
- "@typescript-eslint/visitor-keys@8.65.0":
+ '@typescript-eslint/visitor-keys@8.65.0':
dependencies:
- "@typescript-eslint/types": 8.65.0
+ '@typescript-eslint/types': 8.65.0
eslint-visitor-keys: 5.0.1
- "@vitejs/plugin-react@6.0.3(vite@8.1.5(@types/node@26.2.0)(yaml@2.8.2))":
+ '@vitejs/plugin-react@6.0.3(vite@8.1.5(@types/node@26.2.0)(yaml@2.8.2))':
dependencies:
- "@rolldown/pluginutils": 1.0.1
+ '@rolldown/pluginutils': 1.0.1
vite: 8.1.5(@types/node@26.2.0)(yaml@2.8.2)
- "@vitest/expect@4.1.10":
+ '@vitest/expect@4.1.10':
dependencies:
- "@standard-schema/spec": 1.1.0
- "@types/chai": 5.2.3
- "@vitest/spy": 4.1.10
- "@vitest/utils": 4.1.10
+ '@standard-schema/spec': 1.1.0
+ '@types/chai': 5.2.3
+ '@vitest/spy': 4.1.10
+ '@vitest/utils': 4.1.10
chai: 6.2.2
tinyrainbow: 3.1.1
- "@vitest/mocker@4.1.10(vite@8.1.5(@types/node@26.2.0)(yaml@2.8.2))":
+ '@vitest/mocker@4.1.10(vite@8.1.5(@types/node@26.2.0)(yaml@2.8.2))':
dependencies:
- "@vitest/spy": 4.1.10
+ '@vitest/spy': 4.1.10
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
vite: 8.1.5(@types/node@26.2.0)(yaml@2.8.2)
- "@vitest/pretty-format@4.1.10":
+ '@vitest/pretty-format@4.1.10':
dependencies:
tinyrainbow: 3.1.1
- "@vitest/runner@4.1.10":
+ '@vitest/runner@4.1.10':
dependencies:
- "@vitest/utils": 4.1.10
+ '@vitest/utils': 4.1.10
pathe: 2.0.3
- "@vitest/snapshot@4.1.10":
+ '@vitest/snapshot@4.1.10':
dependencies:
- "@vitest/pretty-format": 4.1.10
- "@vitest/utils": 4.1.10
+ '@vitest/pretty-format': 4.1.10
+ '@vitest/utils': 4.1.10
magic-string: 0.30.21
pathe: 2.0.3
- "@vitest/spy@4.1.10": {}
+ '@vitest/spy@4.1.10': {}
- "@vitest/utils@4.1.10":
+ '@vitest/utils@4.1.10':
dependencies:
- "@vitest/pretty-format": 4.1.10
+ '@vitest/pretty-format': 4.1.10
convert-source-map: 2.0.0
tinyrainbow: 3.1.1
@@ -2876,12 +2099,12 @@ snapshots:
csstype@3.2.3: {}
- data-urls@7.0.0:
+ data-urls@7.0.0(@noble/hashes@2.4.0):
dependencies:
whatwg-mimetype: 5.0.0
- whatwg-url: 16.0.1
+ whatwg-url: 16.0.1(@noble/hashes@2.4.0)
transitivePeerDependencies:
- - "@noble/hashes"
+ - '@noble/hashes'
debug@4.4.3:
dependencies:
@@ -2911,8 +2134,8 @@ snapshots:
eslint-plugin-react-hooks@7.1.1(eslint@10.7.0):
dependencies:
- "@babel/core": 7.29.7
- "@babel/parser": 7.29.8
+ '@babel/core': 7.29.7
+ '@babel/parser': 7.29.8
eslint: 10.7.0
hermes-parser: 0.25.1
zod: 4.4.3
@@ -2926,8 +2149,8 @@ snapshots:
eslint-scope@9.1.2:
dependencies:
- "@types/esrecurse": 4.3.1
- "@types/estree": 1.0.9
+ '@types/esrecurse': 4.3.1
+ '@types/estree': 1.0.9
esrecurse: 4.3.0
estraverse: 5.3.0
@@ -2937,16 +2160,16 @@ snapshots:
eslint@10.7.0:
dependencies:
- "@eslint-community/eslint-utils": 4.10.1(eslint@10.7.0)
- "@eslint-community/regexpp": 4.12.2
- "@eslint/config-array": 0.23.5
- "@eslint/config-helpers": 0.6.0
- "@eslint/core": 1.2.1
- "@eslint/plugin-kit": 0.7.2
- "@humanfs/node": 0.16.8
- "@humanwhocodes/module-importer": 1.0.1
- "@humanwhocodes/retry": 0.4.3
- "@types/estree": 1.0.9
+ '@eslint-community/eslint-utils': 4.10.1(eslint@10.7.0)
+ '@eslint-community/regexpp': 4.12.2
+ '@eslint/config-array': 0.23.5
+ '@eslint/config-helpers': 0.6.0
+ '@eslint/core': 1.2.1
+ '@eslint/plugin-kit': 0.7.2
+ '@humanfs/node': 0.16.8
+ '@humanwhocodes/module-importer': 1.0.1
+ '@humanwhocodes/retry': 0.4.3
+ '@types/estree': 1.0.9
ajv: 6.15.0
cross-spawn: 7.0.6
debug: 4.4.3
@@ -2988,7 +2211,7 @@ snapshots:
estree-walker@3.0.3:
dependencies:
- "@types/estree": 1.0.9
+ '@types/estree': 1.0.9
esutils@2.0.3: {}
@@ -3042,11 +2265,11 @@ snapshots:
dependencies:
hermes-estree: 0.25.1
- html-encoding-sniffer@6.0.0:
+ html-encoding-sniffer@6.0.0(@noble/hashes@2.4.0):
dependencies:
- "@exodus/bytes": 1.15.1
+ '@exodus/bytes': 1.15.1(@noble/hashes@2.4.0)
transitivePeerDependencies:
- - "@noble/hashes"
+ - '@noble/hashes'
ignore@5.3.2: {}
@@ -3068,17 +2291,17 @@ snapshots:
js-tokens@4.0.0: {}
- jsdom@29.1.1:
+ jsdom@29.1.1(@noble/hashes@2.4.0):
dependencies:
- "@asamuzakjp/css-color": 5.1.11
- "@asamuzakjp/dom-selector": 7.1.1
- "@bramus/specificity": 2.4.2
- "@csstools/css-syntax-patches-for-csstree": 1.1.8(css-tree@3.2.1)
- "@exodus/bytes": 1.15.1
+ '@asamuzakjp/css-color': 5.1.11
+ '@asamuzakjp/dom-selector': 7.1.1
+ '@bramus/specificity': 2.4.2
+ '@csstools/css-syntax-patches-for-csstree': 1.1.8(css-tree@3.2.1)
+ '@exodus/bytes': 1.15.1(@noble/hashes@2.4.0)
css-tree: 3.2.1
- data-urls: 7.0.0
+ data-urls: 7.0.0(@noble/hashes@2.4.0)
decimal.js: 10.6.0
- html-encoding-sniffer: 6.0.0
+ html-encoding-sniffer: 6.0.0(@noble/hashes@2.4.0)
is-potential-custom-element-name: 1.0.1
lru-cache: 11.5.2
parse5: 8.0.1
@@ -3089,10 +2312,10 @@ snapshots:
w3c-xmlserializer: 5.0.0
webidl-conversions: 8.0.1
whatwg-mimetype: 5.0.0
- whatwg-url: 16.0.1
+ whatwg-url: 16.0.1(@noble/hashes@2.4.0)
xml-name-validator: 5.0.0
transitivePeerDependencies:
- - "@noble/hashes"
+ - '@noble/hashes'
jsesc@3.1.0: {}
@@ -3182,7 +2405,7 @@ snapshots:
magic-string@0.30.21:
dependencies:
- "@jridgewell/sourcemap-codec": 1.5.5
+ '@jridgewell/sourcemap-codec': 1.5.5
mdn-data@2.27.1: {}
@@ -3277,24 +2500,24 @@ snapshots:
rolldown@1.1.5:
dependencies:
- "@oxc-project/types": 0.139.0
- "@rolldown/pluginutils": 1.0.1
+ '@oxc-project/types': 0.139.0
+ '@rolldown/pluginutils': 1.0.1
optionalDependencies:
- "@rolldown/binding-android-arm64": 1.1.5
- "@rolldown/binding-darwin-arm64": 1.1.5
- "@rolldown/binding-darwin-x64": 1.1.5
- "@rolldown/binding-freebsd-x64": 1.1.5
- "@rolldown/binding-linux-arm-gnueabihf": 1.1.5
- "@rolldown/binding-linux-arm64-gnu": 1.1.5
- "@rolldown/binding-linux-arm64-musl": 1.1.5
- "@rolldown/binding-linux-ppc64-gnu": 1.1.5
- "@rolldown/binding-linux-s390x-gnu": 1.1.5
- "@rolldown/binding-linux-x64-gnu": 1.1.5
- "@rolldown/binding-linux-x64-musl": 1.1.5
- "@rolldown/binding-openharmony-arm64": 1.1.5
- "@rolldown/binding-wasm32-wasi": 1.1.5
- "@rolldown/binding-win32-arm64-msvc": 1.1.5
- "@rolldown/binding-win32-x64-msvc": 1.1.5
+ '@rolldown/binding-android-arm64': 1.1.5
+ '@rolldown/binding-darwin-arm64': 1.1.5
+ '@rolldown/binding-darwin-x64': 1.1.5
+ '@rolldown/binding-freebsd-x64': 1.1.5
+ '@rolldown/binding-linux-arm-gnueabihf': 1.1.5
+ '@rolldown/binding-linux-arm64-gnu': 1.1.5
+ '@rolldown/binding-linux-arm64-musl': 1.1.5
+ '@rolldown/binding-linux-ppc64-gnu': 1.1.5
+ '@rolldown/binding-linux-s390x-gnu': 1.1.5
+ '@rolldown/binding-linux-x64-gnu': 1.1.5
+ '@rolldown/binding-linux-x64-musl': 1.1.5
+ '@rolldown/binding-openharmony-arm64': 1.1.5
+ '@rolldown/binding-wasm32-wasi': 1.1.5
+ '@rolldown/binding-win32-arm64-msvc': 1.1.5
+ '@rolldown/binding-win32-x64-msvc': 1.1.5
rrule@2.8.1:
dependencies:
@@ -3367,10 +2590,10 @@ snapshots:
typescript-eslint@8.65.0(eslint@10.7.0)(typescript@6.0.3):
dependencies:
- "@typescript-eslint/eslint-plugin": 8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.7.0)(typescript@6.0.3))(eslint@10.7.0)(typescript@6.0.3)
- "@typescript-eslint/parser": 8.65.0(eslint@10.7.0)(typescript@6.0.3)
- "@typescript-eslint/typescript-estree": 8.65.0(typescript@6.0.3)
- "@typescript-eslint/utils": 8.65.0(eslint@10.7.0)(typescript@6.0.3)
+ '@typescript-eslint/eslint-plugin': 8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.7.0)(typescript@6.0.3))(eslint@10.7.0)(typescript@6.0.3)
+ '@typescript-eslint/parser': 8.65.0(eslint@10.7.0)(typescript@6.0.3)
+ '@typescript-eslint/typescript-estree': 8.65.0(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.65.0(eslint@10.7.0)(typescript@6.0.3)
eslint: 10.7.0
typescript: 6.0.3
transitivePeerDependencies:
@@ -3400,19 +2623,19 @@ snapshots:
rolldown: 1.1.5
tinyglobby: 0.2.17
optionalDependencies:
- "@types/node": 26.2.0
+ '@types/node': 26.2.0
fsevents: 2.3.3
yaml: 2.8.2
- vitest@4.1.10(@types/node@26.2.0)(jsdom@29.1.1)(vite@8.1.5(@types/node@26.2.0)(yaml@2.8.2)):
+ vitest@4.1.10(@types/node@26.2.0)(jsdom@29.1.1(@noble/hashes@2.4.0))(vite@8.1.5(@types/node@26.2.0)(yaml@2.8.2)):
dependencies:
- "@vitest/expect": 4.1.10
- "@vitest/mocker": 4.1.10(vite@8.1.5(@types/node@26.2.0)(yaml@2.8.2))
- "@vitest/pretty-format": 4.1.10
- "@vitest/runner": 4.1.10
- "@vitest/snapshot": 4.1.10
- "@vitest/spy": 4.1.10
- "@vitest/utils": 4.1.10
+ '@vitest/expect': 4.1.10
+ '@vitest/mocker': 4.1.10(vite@8.1.5(@types/node@26.2.0)(yaml@2.8.2))
+ '@vitest/pretty-format': 4.1.10
+ '@vitest/runner': 4.1.10
+ '@vitest/snapshot': 4.1.10
+ '@vitest/spy': 4.1.10
+ '@vitest/utils': 4.1.10
es-module-lexer: 2.3.1
expect-type: 1.4.0
magic-string: 0.30.21
@@ -3427,8 +2650,8 @@ snapshots:
vite: 8.1.5(@types/node@26.2.0)(yaml@2.8.2)
why-is-node-running: 2.3.0
optionalDependencies:
- "@types/node": 26.2.0
- jsdom: 29.1.1
+ '@types/node': 26.2.0
+ jsdom: 29.1.1(@noble/hashes@2.4.0)
transitivePeerDependencies:
- msw
@@ -3440,13 +2663,13 @@ snapshots:
whatwg-mimetype@5.0.0: {}
- whatwg-url@16.0.1:
+ whatwg-url@16.0.1(@noble/hashes@2.4.0):
dependencies:
- "@exodus/bytes": 1.15.1
+ '@exodus/bytes': 1.15.1(@noble/hashes@2.4.0)
tr46: 6.0.0
webidl-conversions: 8.0.1
transitivePeerDependencies:
- - "@noble/hashes"
+ - '@noble/hashes'
which@2.0.2:
dependencies:
@@ -3467,6 +2690,8 @@ snapshots:
yaml@2.8.2: {}
+ yaml@2.9.1: {}
+
yocto-queue@0.1.0: {}
zod-validation-error@4.0.2(zod@4.4.3):
diff --git a/public/.well-known/mdbase-app.json b/public/.well-known/mdbase-app.json
index 87b69f4..cc3a861 100644
--- a/public/.well-known/mdbase-app.json
+++ b/public/.well-known/mdbase-app.json
@@ -9,8 +9,13 @@
"contracts": [
{
"id": "tasknotes.task",
- "version": "0.3.0-rc.3",
- "digest": "sha256:48b9017ac0896ffbdee4d14fc0325ef86916bf8789da4ac8a4cd246435887155"
+ "version": "0.3.0-rc.5",
+ "digest": "sha256:dde71d0d776aa0069ee627fe3c10b1a20f87ba36929a16790598ebfb4e8ebf04"
+ },
+ {
+ "id": "obsidian.base",
+ "version": "1.0.0",
+ "digest": "sha256:37e8a0bfb32bb4795c1b3c5dec613c32429aaa765dc33e4adc0c627a48f5c1ff"
}
],
"capabilities": {
@@ -23,12 +28,28 @@
]
},
"access": "full_collection",
+ "files": {
+ "required": ["list", "read", "replace", "move"],
+ "scope": { "kind": "collection" }
+ },
"configuration": [
{
"id": "tasknotes-planner-base-sources",
"path": "/x-obsidian/bases/include",
"predicate": "contains",
"value": "TaskNotes/Views/**/*.base"
+ },
+ {
+ "id": "tasknotes-planner-markdown-records",
+ "path": "/settings/record_extensions",
+ "predicate": "contains",
+ "value": "md"
+ },
+ {
+ "id": "tasknotes-planner-base-records",
+ "path": "/settings/record_extensions",
+ "predicate": "contains",
+ "value": "base"
}
]
},
@@ -38,35 +59,57 @@
"manifest": {
"kind": "mdbase.type-pack",
"id": "tasknotes.task",
- "version": "0.3.0-rc.12",
+ "version": "0.3.0-rc.18",
"name": "TaskNotes task type pack",
- "description": "The portable TaskNotes task contract and an editable TaskNotes task type.",
+ "description": "Portable tasks whose assignments link to person records, with a reviewed, atomic upgrade from every TaskNotes starter published before.",
"resources": [
{
"kind": "contract",
"mode": "managed",
- "source": "contracts/tasknotes.task/0.3.0-rc.3.md",
+ "source": "contracts/tasknotes.task/0.3.0-rc.5.md",
"target": "_contracts/tasknotes.task.md",
- "digest": "sha256:4761ee78615882170cae6e52590f98917f549bd89d852a0c40568583394d7264"
+ "digest": "sha256:ecadd00700e249940f4244aaa5b5985a96557d13340463ec491dfa5e89b032a4"
},
{
"kind": "type",
"mode": "seed",
- "source": "types/tasknotes-task/1.md",
+ "source": "types/tasknotes-task/5.md",
"target": "_types/task.md",
- "digest": "sha256:b7f8af7b18d77859dab1f1532c1b55c08c7c39879f55e4ef2a94cb7d2d2284eb"
+ "digest": "sha256:b3cf8dbe8885b331c494d2eeb36abfb052890e06b757877d655c269e666487dc",
+ "upgrade_from": [
+ {
+ "digest": "sha256:2b6016c3543c0dfff491cc6262aed3afd4d672360484174042a261acd1d8ff5f",
+ "version": 4,
+ "document": "---\nkind: mdbase.type\nname: task\nversion: 4\ndescription: A task managed by TaskNotes.\nmatch:\n where:\n tags:\n contains: task\nschema:\n dialect: json-schema-2020-12\n value:\n $schema: https://json-schema.org/draft/2020-12/schema\n type: object\n additionalProperties: true\n properties:\n id:\n type: string\n minLength: 1\n title:\n type: string\n minLength: 1\n status:\n enum: &a2\n - none\n - open\n - in-progress\n - done\n - cancelled\n default: open\n priority:\n enum: &a4\n - none\n - low\n - normal\n - high\n default: normal\n due: &a1\n anyOf:\n - type: string\n format: date\n - type: string\n format: date-time\n scheduled: *a1\n contexts:\n type: array\n items:\n type: string\n projects:\n type: array\n items:\n type: string\n assignees:\n type: array\n items:\n type: string\n minLength: 1\n pattern: \\S\n uniqueItems: true\n attachments:\n type: array\n items:\n type: string\n minLength: 1\n uniqueItems: true\n timeEstimate:\n type: integer\n minimum: 0\n completedDate:\n type: string\n format: date\n dateCreated:\n type: string\n format: date-time\n dateModified:\n type: string\n format: date-time\n recurrence:\n type: string\n recurrence_anchor:\n enum:\n - scheduled\n - completion\n default: scheduled\n occurrence_materialization:\n enum:\n - manual\n - on_completion\n - rolling\n default: manual\n occurrence_next_trigger:\n enum:\n - completion\n - completion_or_skip\n default: completion\n occurrence_template:\n type: string\n occurrence_past_horizon:\n type: string\n occurrence_future_horizon:\n type: string\n recurrence_parent:\n type: string\n occurrence_date:\n type: string\n format: date\n tags:\n type: array\n items:\n type: string\n timeEntries:\n type: array\n items:\n type: object\n additionalProperties: false\n properties:\n startTime:\n type: string\n format: date-time\n endTime:\n type: string\n format: date-time\n description:\n type: string\n duration:\n type: integer\n reminders:\n type: array\n items:\n oneOf:\n - type: object\n required:\n - id\n - type\n - absoluteTime\n additionalProperties: false\n properties:\n id:\n type: string\n type:\n const: absolute\n description:\n type: string\n absoluteTime:\n type: string\n format: date-time\n - type: object\n required:\n - id\n - type\n - relatedTo\n - offset\n additionalProperties: false\n properties:\n id:\n type: string\n type:\n const: relative\n description:\n type: string\n relatedTo:\n enum:\n - due\n - scheduled\n offset:\n type: string\n blockedBy:\n type: array\n items:\n type: object\n additionalProperties: false\n properties:\n uid:\n type: string\n reltype:\n type: string\n gap:\n type: string\n required:\n - uid\n complete_instances:\n type: array\n items:\n type: string\n format: date\n skipped_instances:\n type: array\n items:\n type: string\n format: date\n icsEventId:\n type: array\n items:\n type: string\n googleCalendarEventId:\n type: string\n googleCalendarExceptionEventId:\n type: string\n googleCalendarExceptionOriginalScheduled:\n type: string\n format: date\n googleCalendarMovedOriginalDates:\n type: array\n items:\n type: string\n format: date\n tasknotes_manual_order:\n type: string\n allOf:\n - if:\n required:\n - status\n properties:\n status:\n enum: &a3\n - done\n not:\n required:\n - recurrence\n then:\n required:\n - completedDate\n required:\n - title\n - status\n - dateCreated\ncollection:\n read_defaults:\n status: open\n priority: normal\n recurrence_anchor: scheduled\n occurrence_materialization: manual\n occurrence_next_trigger: completion\n links:\n projects[]:\n target_type: any\n validate_exists: false\n assignees[]:\n validate_exists: false\n attachments[]:\n validate_exists: false\n occurrence_template:\n target_type: any\n validate_exists: false\n recurrence_parent:\n target_type: task\n validate_exists: false\n blockedBy[].uid:\n target_type: task\n validate_exists: false\n path:\n runtime: tasknotes\n template: \"{{zettel}}\"\n folder: tasks\n generated_by: tasknotes.filename.create\n display:\n name_field: title\n unique:\n - field: id\n scope: type\nlifecycle:\n on_create:\n set:\n id:\n uuid: true\n dateCreated:\n now: true\n dateModified:\n now: true\n on_update:\n set:\n dateModified:\n now: true\nimplements:\n - contract: tasknotes.task\n version: 0.3.0-rc.5\n fields:\n id: id\n title: title\n status: status\n priority: priority\n due: due\n scheduled: scheduled\n contexts: contexts\n projects: projects\n assignees: assignees\n attachments: attachments\n timeEstimate: timeEstimate\n completedDate: completedDate\n dateCreated: dateCreated\n dateModified: dateModified\n recurrence: recurrence\n recurrenceAnchor: recurrence_anchor\n occurrenceMaterialization: occurrence_materialization\n occurrenceNextTrigger: occurrence_next_trigger\n occurrenceTemplate: occurrence_template\n occurrencePastHorizon: occurrence_past_horizon\n occurrenceFutureHorizon: occurrence_future_horizon\n recurrenceParent: recurrence_parent\n occurrenceDate: occurrence_date\n tags: tags\n timeEntries: timeEntries\n reminders: reminders\n blockedBy: blockedBy\n completeInstances: complete_instances\n skippedInstances: skipped_instances\n icsEventId: icsEventId\n googleCalendarEventId: googleCalendarEventId\n googleCalendarExceptionEventId: googleCalendarExceptionEventId\n googleCalendarExceptionOriginalScheduled: googleCalendarExceptionOriginalScheduled\n googleCalendarMovedOriginalDates: googleCalendarMovedOriginalDates\n sortOrder: tasknotes_manual_order\n binding:\n profiles:\n - core-lite\n - recurrence\n - materialized-occurrences\n capabilities:\n - dependencies\n - reminders\n - attachments\n - links\n - time-tracking\n - materialized-occurrences\n - archive\n - templating\n title:\n storage: frontmatter\n filename_format: zettel\n status:\n values: *a2\n default: open\n completed_values: *a3\n skipped_values:\n - cancelled\n default_skipped: cancelled\n definitions:\n - value: none\n label: None\n color: \"#94a3b8\"\n is_completed: false\n is_skipped: false\n exclude_from_cycle: false\n order: 0\n auto_archive: false\n auto_archive_delay_minutes: 5\n - value: open\n label: Open\n color: \"#64748b\"\n is_completed: false\n is_skipped: false\n exclude_from_cycle: false\n order: 1\n auto_archive: false\n auto_archive_delay_minutes: 5\n - value: in-progress\n label: In progress\n color: \"#3b82f6\"\n is_completed: false\n is_skipped: false\n exclude_from_cycle: false\n order: 2\n auto_archive: false\n auto_archive_delay_minutes: 5\n - value: done\n label: Done\n color: \"#22c55e\"\n is_completed: true\n is_skipped: false\n exclude_from_cycle: false\n order: 3\n auto_archive: false\n auto_archive_delay_minutes: 5\n - value: cancelled\n label: Cancelled\n color: \"#94a3b8\"\n is_completed: false\n is_skipped: true\n exclude_from_cycle: true\n order: 4\n auto_archive: false\n auto_archive_delay_minutes: 5\n priority:\n values: *a4\n default: normal\n definitions:\n - value: none\n label: None\n color: \"#94a3b8\"\n weight: 0\n - value: low\n label: Low\n color: \"#3b82f6\"\n weight: 1\n - value: normal\n label: Normal\n color: \"#f59e0b\"\n weight: 2\n - value: high\n label: High\n color: \"#ef4444\"\n weight: 3\n recurrence:\n syntax: tasknotes\n maintain_due_date_offset: true\n reset_body_checkboxes: false\n occurrences:\n identity_roles:\n - recurrenceParent\n - occurrenceDate\n default_materialization: manual\n default_next_trigger: completion\n past_horizon: P0D\n future_horizon: P14D\n links:\n accepted_formats:\n - wikilink\n - markdown\n write_format: wikilink\n archive:\n archived_tag: archived\n move_on_archive: false\n time_tracking:\n auto_stop_on_complete: false\n templating:\n enabled: false\n occurrence_enabled: false\nx-tasknotes-generator:\n managed_fields:\n - assignees\n - attachments\n - blockedBy\n - complete_instances\n - completedDate\n - contexts\n - dateCreated\n - dateModified\n - due\n - googleCalendarEventId\n - googleCalendarExceptionEventId\n - googleCalendarExceptionOriginalScheduled\n - googleCalendarMovedOriginalDates\n - icsEventId\n - id\n - occurrence_date\n - occurrence_future_horizon\n - occurrence_materialization\n - occurrence_next_trigger\n - occurrence_past_horizon\n - occurrence_template\n - priority\n - projects\n - recurrence\n - recurrence_anchor\n - recurrence_parent\n - reminders\n - scheduled\n - skipped_instances\n - status\n - tags\n - tasknotes_manual_order\n - timeEntries\n - timeEstimate\n - title\n---\n# Task\n\nTask records live under `tasks/`.\n"
+ },
+ {
+ "digest": "sha256:02d1a2a04f26937dd7eec3cde3070dd770c73625e06f386d6214044d176788dd",
+ "version": 3,
+ "document": "---\nkind: mdbase.type\nname: task\nversion: 3\ndescription: A task managed by TaskNotes.\nmatch:\n where:\n tags:\n contains: task\nschema:\n dialect: json-schema-2020-12\n value:\n $schema: https://json-schema.org/draft/2020-12/schema\n type: object\n additionalProperties: true\n properties:\n id:\n type: string\n minLength: 1\n title:\n type: string\n minLength: 1\n status:\n enum: &a1\n - none\n - open\n - in-progress\n - done\n default: open\n priority:\n enum: &a3\n - none\n - low\n - normal\n - high\n default: normal\n due:\n anyOf:\n - type: string\n format: date\n - type: string\n format: date-time\n scheduled:\n anyOf:\n - type: string\n format: date\n - type: string\n format: date-time\n contexts:\n type: array\n items:\n type: string\n projects:\n type: array\n items:\n type: string\n assignees:\n type: array\n items:\n type: string\n minLength: 1\n pattern: \\S\n uniqueItems: true\n attachments:\n type: array\n items:\n type: string\n minLength: 1\n uniqueItems: true\n timeEstimate:\n type: integer\n minimum: 0\n completedDate:\n type: string\n format: date\n dateCreated:\n type: string\n format: date-time\n dateModified:\n type: string\n format: date-time\n recurrence:\n type: string\n recurrence_anchor:\n enum:\n - scheduled\n - completion\n default: scheduled\n occurrence_materialization:\n enum:\n - manual\n - on_completion\n - rolling\n default: manual\n occurrence_next_trigger:\n enum:\n - completion\n - completion_or_skip\n default: completion\n occurrence_template:\n type: string\n occurrence_past_horizon:\n type: string\n occurrence_future_horizon:\n type: string\n recurrence_parent:\n type: string\n occurrence_date:\n type: string\n format: date\n tags:\n type: array\n items:\n type: string\n timeEntries:\n type: array\n items:\n type: object\n additionalProperties: false\n properties:\n startTime:\n type: string\n format: date-time\n endTime:\n type: string\n format: date-time\n description:\n type: string\n duration:\n type: integer\n reminders:\n type: array\n items:\n oneOf:\n - type: object\n required:\n - id\n - type\n - absoluteTime\n additionalProperties: false\n properties:\n id:\n type: string\n type:\n const: absolute\n description:\n type: string\n absoluteTime:\n type: string\n format: date-time\n - type: object\n required:\n - id\n - type\n - relatedTo\n - offset\n additionalProperties: false\n properties:\n id:\n type: string\n type:\n const: relative\n description:\n type: string\n relatedTo:\n enum:\n - due\n - scheduled\n offset:\n type: string\n blockedBy:\n type: array\n items:\n type: object\n additionalProperties: false\n properties:\n uid:\n type: string\n reltype:\n type: string\n gap:\n type: string\n required:\n - uid\n complete_instances:\n type: array\n items:\n type: string\n format: date\n skipped_instances:\n type: array\n items:\n type: string\n format: date\n icsEventId:\n type: array\n items:\n type: string\n googleCalendarEventId:\n type: string\n googleCalendarExceptionEventId:\n type: string\n googleCalendarExceptionOriginalScheduled:\n type: string\n format: date\n googleCalendarMovedOriginalDates:\n type: array\n items:\n type: string\n format: date\n tasknotes_manual_order:\n type: string\n allOf:\n - if:\n required:\n - status\n properties:\n status:\n enum: &a2\n - done\n not:\n required:\n - recurrence\n then:\n required:\n - completedDate\n required:\n - title\n - status\n - dateCreated\ncollection:\n read_defaults:\n status: open\n priority: normal\n recurrence_anchor: scheduled\n occurrence_materialization: manual\n occurrence_next_trigger: completion\n links:\n projects[]:\n target_type: any\n validate_exists: false\n assignees[]:\n validate_exists: false\n attachments[]:\n validate_exists: false\n occurrence_template:\n target_type: any\n validate_exists: false\n recurrence_parent:\n target_type: task\n validate_exists: false\n blockedBy[].uid:\n target_type: task\n validate_exists: false\n path:\n runtime: tasknotes\n template: \"{{zettel}}\"\n folder: tasks\n generated_by: tasknotes.filename.create\n display:\n name_field: title\n unique:\n - field: id\n scope: type\nlifecycle:\n on_create:\n set:\n id:\n uuid: true\n dateCreated:\n now: true\n dateModified:\n now: true\n on_update:\n set:\n dateModified:\n now: true\nimplements:\n - contract: tasknotes.task\n version: 0.3.0-rc.5\n fields:\n id: id\n title: title\n status: status\n priority: priority\n due: due\n scheduled: scheduled\n contexts: contexts\n projects: projects\n assignees: assignees\n attachments: attachments\n timeEstimate: timeEstimate\n completedDate: completedDate\n dateCreated: dateCreated\n dateModified: dateModified\n recurrence: recurrence\n recurrenceAnchor: recurrence_anchor\n occurrenceMaterialization: occurrence_materialization\n occurrenceNextTrigger: occurrence_next_trigger\n occurrenceTemplate: occurrence_template\n occurrencePastHorizon: occurrence_past_horizon\n occurrenceFutureHorizon: occurrence_future_horizon\n recurrenceParent: recurrence_parent\n occurrenceDate: occurrence_date\n tags: tags\n timeEntries: timeEntries\n reminders: reminders\n blockedBy: blockedBy\n completeInstances: complete_instances\n skippedInstances: skipped_instances\n icsEventId: icsEventId\n googleCalendarEventId: googleCalendarEventId\n googleCalendarExceptionEventId: googleCalendarExceptionEventId\n googleCalendarExceptionOriginalScheduled: googleCalendarExceptionOriginalScheduled\n googleCalendarMovedOriginalDates: googleCalendarMovedOriginalDates\n sortOrder: tasknotes_manual_order\n binding:\n profiles:\n - core-lite\n - recurrence\n - templating\n - materialized-occurrences\n - extended\n capabilities:\n - dependencies\n - reminders\n - attachments\n - links\n - time-tracking\n - materialized-occurrences\n - archive\n - templating\n title:\n storage: frontmatter\n filename_format: zettel\n status:\n values: *a1\n default: open\n completed_values: *a2\n skipped_values: []\n definitions:\n - value: none\n label: None\n color: \"#cccccc\"\n is_completed: false\n is_skipped: false\n exclude_from_cycle: false\n order: 0\n auto_archive: false\n auto_archive_delay_minutes: 5\n - value: open\n label: Open\n color: \"#808080\"\n is_completed: false\n is_skipped: false\n exclude_from_cycle: false\n order: 1\n auto_archive: false\n auto_archive_delay_minutes: 5\n - value: in-progress\n label: In progress\n color: \"#0066cc\"\n is_completed: false\n is_skipped: false\n exclude_from_cycle: false\n order: 2\n auto_archive: false\n auto_archive_delay_minutes: 5\n - value: done\n label: Done\n color: \"#00aa00\"\n is_completed: true\n is_skipped: false\n exclude_from_cycle: false\n order: 3\n auto_archive: false\n auto_archive_delay_minutes: 5\n priority:\n values: *a3\n default: normal\n definitions:\n - value: none\n label: None\n color: \"#cccccc\"\n weight: 0\n - value: low\n label: Low\n color: \"#00aa00\"\n weight: 1\n - value: normal\n label: Normal\n color: \"#ffaa00\"\n weight: 2\n - value: high\n label: High\n color: \"#ff0000\"\n weight: 3\n recurrence:\n syntax: tasknotes\n maintain_due_date_offset: true\n reset_body_checkboxes: false\n occurrences:\n identity_roles:\n - recurrenceParent\n - occurrenceDate\n default_materialization: manual\n default_next_trigger: completion\n past_horizon: P0D\n future_horizon: P14D\n links:\n accepted_formats:\n - wikilink\n - markdown\n write_format: wikilink\n archive:\n archived_tag: archived\n move_on_archive: false\n time_tracking:\n auto_stop_on_complete: false\n templating:\n enabled: false\n occurrence_enabled: false\nx-tasknotes-generator:\n managed_fields:\n - assignees\n - attachments\n - blockedBy\n - complete_instances\n - completedDate\n - contexts\n - dateCreated\n - dateModified\n - due\n - googleCalendarEventId\n - googleCalendarExceptionEventId\n - googleCalendarExceptionOriginalScheduled\n - googleCalendarMovedOriginalDates\n - icsEventId\n - id\n - occurrence_date\n - occurrence_future_horizon\n - occurrence_materialization\n - occurrence_next_trigger\n - occurrence_past_horizon\n - occurrence_template\n - priority\n - projects\n - recurrence\n - recurrence_anchor\n - recurrence_parent\n - reminders\n - scheduled\n - skipped_instances\n - status\n - tags\n - tasknotes_manual_order\n - timeEntries\n - timeEstimate\n - title\n---\n\n# Task\n\nThis type definition implements the TaskNotes contract for this mdbase collection.\nIts JSON Schema describes persisted task frontmatter; collection and lifecycle\nmetadata describe generic mdbase behavior; `implements` maps the portable\nTaskNotes task view and supplies TaskNotes behavior.\n\nChanges made here are loaded by TaskNotes. Portable changes made in TaskNotes\nsettings are written back while unknown extensions are preserved.\n"
+ },
+ {
+ "digest": "sha256:ade71117bd31e571f403511c48d432bab7a05dfd25e730ca2931f3afda7f7cd5",
+ "version": 2,
+ "document": "---\nkind: mdbase.type\nname: task\nversion: 2\ndescription: A task managed by TaskNotes.\nmatch:\n where:\n tags:\n contains: task\nschema:\n dialect: json-schema-2020-12\n value:\n $schema: https://json-schema.org/draft/2020-12/schema\n type: object\n additionalProperties: true\n properties:\n id:\n type: string\n minLength: 1\n title:\n type: string\n minLength: 1\n status:\n enum: &a1\n - none\n - open\n - in-progress\n - done\n default: open\n priority:\n enum: &a3\n - none\n - low\n - normal\n - high\n default: normal\n due:\n anyOf:\n - type: string\n format: date\n - type: string\n format: date-time\n scheduled:\n anyOf:\n - type: string\n format: date\n - type: string\n format: date-time\n contexts:\n type: array\n items:\n type: string\n projects:\n type: array\n items:\n type: string\n assignees:\n type: array\n items:\n type: string\n minLength: 1\n pattern: \\S\n uniqueItems: true\n attachments:\n type: array\n items:\n type: string\n minLength: 1\n uniqueItems: true\n timeEstimate:\n type: integer\n minimum: 0\n completedDate:\n type: string\n format: date\n dateCreated:\n type: string\n format: date-time\n dateModified:\n type: string\n format: date-time\n recurrence:\n type: string\n recurrence_anchor:\n enum:\n - scheduled\n - completion\n default: scheduled\n occurrence_materialization:\n enum:\n - manual\n - on_completion\n - rolling\n default: manual\n occurrence_next_trigger:\n enum:\n - completion\n - completion_or_skip\n default: completion\n occurrence_template:\n type: string\n occurrence_past_horizon:\n type: string\n occurrence_future_horizon:\n type: string\n recurrence_parent:\n type: string\n occurrence_date:\n type: string\n format: date\n tags:\n type: array\n items:\n type: string\n timeEntries:\n type: array\n items:\n type: object\n additionalProperties: false\n properties:\n startTime:\n type: string\n format: date-time\n endTime:\n type: string\n format: date-time\n description:\n type: string\n duration:\n type: integer\n reminders:\n type: array\n items:\n oneOf:\n - type: object\n required:\n - id\n - type\n - absoluteTime\n additionalProperties: false\n properties:\n id:\n type: string\n type:\n const: absolute\n description:\n type: string\n absoluteTime:\n type: string\n format: date-time\n - type: object\n required:\n - id\n - type\n - relatedTo\n - offset\n additionalProperties: false\n properties:\n id:\n type: string\n type:\n const: relative\n description:\n type: string\n relatedTo:\n enum:\n - due\n - scheduled\n offset:\n type: string\n blockedBy:\n type: array\n items:\n type: object\n additionalProperties: false\n properties:\n uid:\n type: string\n reltype:\n type: string\n gap:\n type: string\n required:\n - uid\n complete_instances:\n type: array\n items:\n type: string\n format: date\n skipped_instances:\n type: array\n items:\n type: string\n format: date\n icsEventId:\n type: array\n items:\n type: string\n googleCalendarEventId:\n type: string\n googleCalendarExceptionEventId:\n type: string\n googleCalendarExceptionOriginalScheduled:\n type: string\n format: date\n googleCalendarMovedOriginalDates:\n type: array\n items:\n type: string\n format: date\n tasknotes_manual_order:\n type: string\n allOf:\n - if:\n required:\n - status\n properties:\n status:\n enum: &a2\n - done\n not:\n required:\n - recurrence\n then:\n required:\n - completedDate\n required:\n - title\n - status\n - dateCreated\ncollection:\n read_defaults:\n status: open\n priority: normal\n recurrence_anchor: scheduled\n occurrence_materialization: manual\n occurrence_next_trigger: completion\n links:\n projects[]:\n target_type: any\n validate_exists: false\n attachments[]:\n validate_exists: false\n occurrence_template:\n target_type: any\n validate_exists: false\n recurrence_parent:\n target_type: task\n validate_exists: false\n blockedBy[].uid:\n target_type: task\n validate_exists: false\n path:\n runtime: tasknotes\n template: \"{{zettel}}\"\n folder: tasks\n generated_by: tasknotes.filename.create\n display:\n name_field: title\n unique:\n - field: id\n scope: type\nlifecycle:\n on_create:\n set:\n id:\n uuid: true\n dateCreated:\n now: true\n dateModified:\n now: true\n on_update:\n set:\n dateModified:\n now: true\nimplements:\n - contract: tasknotes.task\n version: 0.3.0-rc.4\n fields:\n id: id\n title: title\n status: status\n priority: priority\n due: due\n scheduled: scheduled\n contexts: contexts\n projects: projects\n assignees: assignees\n attachments: attachments\n timeEstimate: timeEstimate\n completedDate: completedDate\n dateCreated: dateCreated\n dateModified: dateModified\n recurrence: recurrence\n recurrenceAnchor: recurrence_anchor\n occurrenceMaterialization: occurrence_materialization\n occurrenceNextTrigger: occurrence_next_trigger\n occurrenceTemplate: occurrence_template\n occurrencePastHorizon: occurrence_past_horizon\n occurrenceFutureHorizon: occurrence_future_horizon\n recurrenceParent: recurrence_parent\n occurrenceDate: occurrence_date\n tags: tags\n timeEntries: timeEntries\n reminders: reminders\n blockedBy: blockedBy\n completeInstances: complete_instances\n skippedInstances: skipped_instances\n icsEventId: icsEventId\n googleCalendarEventId: googleCalendarEventId\n googleCalendarExceptionEventId: googleCalendarExceptionEventId\n googleCalendarExceptionOriginalScheduled: googleCalendarExceptionOriginalScheduled\n googleCalendarMovedOriginalDates: googleCalendarMovedOriginalDates\n sortOrder: tasknotes_manual_order\n binding:\n profiles:\n - core-lite\n - recurrence\n - templating\n - materialized-occurrences\n - extended\n capabilities:\n - dependencies\n - reminders\n - attachments\n - links\n - time-tracking\n - materialized-occurrences\n - archive\n - templating\n title:\n storage: frontmatter\n filename_format: zettel\n status:\n values: *a1\n default: open\n completed_values: *a2\n skipped_values: []\n definitions:\n - value: none\n label: None\n color: \"#cccccc\"\n is_completed: false\n is_skipped: false\n exclude_from_cycle: false\n order: 0\n auto_archive: false\n auto_archive_delay_minutes: 5\n - value: open\n label: Open\n color: \"#808080\"\n is_completed: false\n is_skipped: false\n exclude_from_cycle: false\n order: 1\n auto_archive: false\n auto_archive_delay_minutes: 5\n - value: in-progress\n label: In progress\n color: \"#0066cc\"\n is_completed: false\n is_skipped: false\n exclude_from_cycle: false\n order: 2\n auto_archive: false\n auto_archive_delay_minutes: 5\n - value: done\n label: Done\n color: \"#00aa00\"\n is_completed: true\n is_skipped: false\n exclude_from_cycle: false\n order: 3\n auto_archive: false\n auto_archive_delay_minutes: 5\n priority:\n values: *a3\n default: normal\n definitions:\n - value: none\n label: None\n color: \"#cccccc\"\n weight: 0\n - value: low\n label: Low\n color: \"#00aa00\"\n weight: 1\n - value: normal\n label: Normal\n color: \"#ffaa00\"\n weight: 2\n - value: high\n label: High\n color: \"#ff0000\"\n weight: 3\n recurrence:\n syntax: tasknotes\n maintain_due_date_offset: true\n reset_body_checkboxes: false\n occurrences:\n identity_roles:\n - recurrenceParent\n - occurrenceDate\n default_materialization: manual\n default_next_trigger: completion\n past_horizon: P0D\n future_horizon: P14D\n links:\n accepted_formats:\n - wikilink\n - markdown\n write_format: wikilink\n archive:\n archived_tag: archived\n move_on_archive: false\n time_tracking:\n auto_stop_on_complete: false\n templating:\n enabled: false\n occurrence_enabled: false\nx-tasknotes-generator:\n managed_fields:\n - assignees\n - attachments\n - blockedBy\n - complete_instances\n - completedDate\n - contexts\n - dateCreated\n - dateModified\n - due\n - googleCalendarEventId\n - googleCalendarExceptionEventId\n - googleCalendarExceptionOriginalScheduled\n - googleCalendarMovedOriginalDates\n - icsEventId\n - id\n - occurrence_date\n - occurrence_future_horizon\n - occurrence_materialization\n - occurrence_next_trigger\n - occurrence_past_horizon\n - occurrence_template\n - priority\n - projects\n - recurrence\n - recurrence_anchor\n - recurrence_parent\n - reminders\n - scheduled\n - skipped_instances\n - status\n - tags\n - tasknotes_manual_order\n - timeEntries\n - timeEstimate\n - title\n---\n\n# Task\n\nThis type definition implements the TaskNotes contract for this mdbase collection.\nIts JSON Schema describes persisted task frontmatter; collection and lifecycle\nmetadata describe generic mdbase behavior; `implements` maps the portable\nTaskNotes task view and supplies TaskNotes behavior.\n\nChanges made here are loaded by TaskNotes. Portable changes made in TaskNotes\nsettings are written back while unknown extensions are preserved.\n"
+ },
+ {
+ "digest": "sha256:b7f8af7b18d77859dab1f1532c1b55c08c7c39879f55e4ef2a94cb7d2d2284eb",
+ "version": 1,
+ "document": "---\nkind: mdbase.type\nname: task\nversion: 1\ndescription: A task managed by TaskNotes.\nmatch:\n where:\n tags:\n contains: task\nschema:\n dialect: json-schema-2020-12\n value:\n $schema: https://json-schema.org/draft/2020-12/schema\n type: object\n additionalProperties: true\n properties:\n id:\n type: string\n minLength: 1\n title:\n type: string\n minLength: 1\n status:\n enum: &a2\n - none\n - open\n - in-progress\n - done\n - cancelled\n default: open\n priority:\n enum: &a4\n - none\n - low\n - normal\n - high\n default: normal\n due: &a1\n anyOf:\n - type: string\n format: date\n - type: string\n format: date-time\n scheduled: *a1\n contexts:\n type: array\n items:\n type: string\n projects:\n type: array\n items:\n type: string\n attachments:\n type: array\n items:\n type: string\n minLength: 1\n uniqueItems: true\n timeEstimate:\n type: integer\n minimum: 0\n completedDate:\n type: string\n format: date\n dateCreated:\n type: string\n format: date-time\n dateModified:\n type: string\n format: date-time\n recurrence:\n type: string\n recurrence_anchor:\n enum:\n - scheduled\n - completion\n default: scheduled\n occurrence_materialization:\n enum:\n - manual\n - on_completion\n - rolling\n default: manual\n occurrence_next_trigger:\n enum:\n - completion\n - completion_or_skip\n default: completion\n occurrence_template:\n type: string\n occurrence_past_horizon:\n type: string\n occurrence_future_horizon:\n type: string\n recurrence_parent:\n type: string\n occurrence_date:\n type: string\n format: date\n tags:\n type: array\n items:\n type: string\n timeEntries:\n type: array\n items:\n type: object\n additionalProperties: false\n properties:\n startTime:\n type: string\n format: date-time\n endTime:\n type: string\n format: date-time\n description:\n type: string\n duration:\n type: integer\n reminders:\n type: array\n items:\n oneOf:\n - type: object\n required:\n - id\n - type\n - absoluteTime\n additionalProperties: false\n properties:\n id:\n type: string\n type:\n const: absolute\n description:\n type: string\n absoluteTime:\n type: string\n format: date-time\n - type: object\n required:\n - id\n - type\n - relatedTo\n - offset\n additionalProperties: false\n properties:\n id:\n type: string\n type:\n const: relative\n description:\n type: string\n relatedTo:\n enum:\n - due\n - scheduled\n offset:\n type: string\n blockedBy:\n type: array\n items:\n type: object\n additionalProperties: false\n properties:\n uid:\n type: string\n reltype:\n type: string\n gap:\n type: string\n required:\n - uid\n complete_instances:\n type: array\n items:\n type: string\n format: date\n skipped_instances:\n type: array\n items:\n type: string\n format: date\n icsEventId:\n type: array\n items:\n type: string\n googleCalendarEventId:\n type: string\n googleCalendarExceptionEventId:\n type: string\n googleCalendarExceptionOriginalScheduled:\n type: string\n format: date\n googleCalendarMovedOriginalDates:\n type: array\n items:\n type: string\n format: date\n tasknotes_manual_order:\n type: string\n allOf:\n - if:\n required:\n - status\n properties:\n status:\n enum: &a3\n - done\n not:\n required:\n - recurrence\n then:\n required:\n - completedDate\n required:\n - title\n - status\n - dateCreated\ncollection:\n read_defaults:\n status: open\n priority: normal\n recurrence_anchor: scheduled\n occurrence_materialization: manual\n occurrence_next_trigger: completion\n links:\n projects[]:\n target_type: any\n validate_exists: false\n attachments[]:\n validate_exists: false\n occurrence_template:\n target_type: any\n validate_exists: false\n recurrence_parent:\n target_type: task\n validate_exists: false\n blockedBy[].uid:\n target_type: task\n validate_exists: false\n path:\n runtime: tasknotes\n template: \"{{zettel}}\"\n folder: tasks\n generated_by: tasknotes.filename.create\n display:\n name_field: title\n unique:\n - field: id\n scope: type\nlifecycle:\n on_create:\n set:\n id:\n uuid: true\n dateCreated:\n now: true\n dateModified:\n now: true\n on_update:\n set:\n dateModified:\n now: true\nimplements:\n - contract: tasknotes.task\n version: 0.3.0-rc.3\n fields:\n id: id\n title: title\n status: status\n priority: priority\n due: due\n scheduled: scheduled\n contexts: contexts\n projects: projects\n attachments: attachments\n timeEstimate: timeEstimate\n completedDate: completedDate\n dateCreated: dateCreated\n dateModified: dateModified\n recurrence: recurrence\n recurrenceAnchor: recurrence_anchor\n occurrenceMaterialization: occurrence_materialization\n occurrenceNextTrigger: occurrence_next_trigger\n occurrenceTemplate: occurrence_template\n occurrencePastHorizon: occurrence_past_horizon\n occurrenceFutureHorizon: occurrence_future_horizon\n recurrenceParent: recurrence_parent\n occurrenceDate: occurrence_date\n tags: tags\n timeEntries: timeEntries\n reminders: reminders\n blockedBy: blockedBy\n completeInstances: complete_instances\n skippedInstances: skipped_instances\n icsEventId: icsEventId\n googleCalendarEventId: googleCalendarEventId\n googleCalendarExceptionEventId: googleCalendarExceptionEventId\n googleCalendarExceptionOriginalScheduled: googleCalendarExceptionOriginalScheduled\n googleCalendarMovedOriginalDates: googleCalendarMovedOriginalDates\n sortOrder: tasknotes_manual_order\n binding:\n profiles:\n - core-lite\n - recurrence\n - materialized-occurrences\n capabilities:\n - dependencies\n - reminders\n - attachments\n - links\n - time-tracking\n - materialized-occurrences\n - archive\n - templating\n title:\n storage: frontmatter\n filename_format: zettel\n status:\n values: *a2\n default: open\n completed_values: *a3\n skipped_values:\n - cancelled\n default_skipped: cancelled\n definitions:\n - value: none\n label: None\n color: \"#94a3b8\"\n is_completed: false\n is_skipped: false\n exclude_from_cycle: false\n order: 0\n auto_archive: false\n auto_archive_delay_minutes: 5\n - value: open\n label: Open\n color: \"#64748b\"\n is_completed: false\n is_skipped: false\n exclude_from_cycle: false\n order: 1\n auto_archive: false\n auto_archive_delay_minutes: 5\n - value: in-progress\n label: In progress\n color: \"#3b82f6\"\n is_completed: false\n is_skipped: false\n exclude_from_cycle: false\n order: 2\n auto_archive: false\n auto_archive_delay_minutes: 5\n - value: done\n label: Done\n color: \"#22c55e\"\n is_completed: true\n is_skipped: false\n exclude_from_cycle: false\n order: 3\n auto_archive: false\n auto_archive_delay_minutes: 5\n - value: cancelled\n label: Cancelled\n color: \"#94a3b8\"\n is_completed: false\n is_skipped: true\n exclude_from_cycle: true\n order: 4\n auto_archive: false\n auto_archive_delay_minutes: 5\n priority:\n values: *a4\n default: normal\n definitions:\n - value: none\n label: None\n color: \"#94a3b8\"\n weight: 0\n - value: low\n label: Low\n color: \"#3b82f6\"\n weight: 1\n - value: normal\n label: Normal\n color: \"#f59e0b\"\n weight: 2\n - value: high\n label: High\n color: \"#ef4444\"\n weight: 3\n recurrence:\n syntax: tasknotes\n maintain_due_date_offset: true\n reset_body_checkboxes: false\n occurrences:\n identity_roles:\n - recurrenceParent\n - occurrenceDate\n default_materialization: manual\n default_next_trigger: completion\n past_horizon: P0D\n future_horizon: P14D\n links:\n accepted_formats:\n - wikilink\n - markdown\n write_format: wikilink\n archive:\n archived_tag: archived\n move_on_archive: false\n time_tracking:\n auto_stop_on_complete: false\n templating:\n enabled: false\n occurrence_enabled: false\nx-tasknotes-generator:\n managed_fields:\n - attachments\n - blockedBy\n - complete_instances\n - completedDate\n - contexts\n - dateCreated\n - dateModified\n - due\n - googleCalendarEventId\n - googleCalendarExceptionEventId\n - googleCalendarExceptionOriginalScheduled\n - googleCalendarMovedOriginalDates\n - icsEventId\n - id\n - occurrence_date\n - occurrence_future_horizon\n - occurrence_materialization\n - occurrence_next_trigger\n - occurrence_past_horizon\n - occurrence_template\n - priority\n - projects\n - recurrence\n - recurrence_anchor\n - recurrence_parent\n - reminders\n - scheduled\n - skipped_instances\n - status\n - tags\n - tasknotes_manual_order\n - timeEntries\n - timeEstimate\n - title\n---\n# Task\n\nTask records live under `tasks/`.\n"
+ }
+ ]
},
{
"kind": "schema",
"mode": "managed",
- "source": "schemas/tasknotes.task/0.3.0-rc.3.schema.json",
+ "source": "schemas/tasknotes.task/0.3.0-rc.5.schema.json",
"target": "_schemas/tasknotes/tasknotes-task.schema.json",
- "digest": "sha256:3d01df62fc230dfa1cd5c290d685e285594370e17fa176bc06e48c49200d0dc8"
+ "digest": "sha256:aec95578a093be95cbce0fb500964e7aeaeeacc611624fc2893074637dbd4125"
},
{
"kind": "schema",
"mode": "managed",
- "source": "schemas/tasknotes.task.binding/0.3.0-rc.3.schema.json",
+ "source": "schemas/tasknotes.task.binding/0.3.0-rc.5.schema.json",
"target": "_schemas/tasknotes/tasknotes-task-binding.schema.json",
"digest": "sha256:5b38e8a1c426b7f7fa92d8353fe35dd98e632305cbb15ffccde387473166b267"
}
@@ -74,27 +117,69 @@
},
"resources": [
{
- "source": "contracts/tasknotes.task/0.3.0-rc.3.md",
- "document": "---\nkind: mdbase.contract\ncontract_type: record\nid: tasknotes.task\nversion: 0.3.0-rc.3\nname: TaskNotes task\ndescription: Portable task data and behavior defined by tasknotes-spec 0.3.0-rc.3.\nrecord_schema:\n dialect: json-schema-2020-12\n value:\n $schema: https://json-schema.org/draft/2020-12/schema\n $id: https://tasknotes.dev/schemas/tasknotes-task.schema.json\n title: TaskNotes portable task view\n description: The storage-neutral record view exposed by the tasknotes.task 0.3.0-rc.3 record contract.\n type: object\n required:\n - status\n - dateCreated\n additionalProperties: false\n properties:\n id:\n type: string\n minLength: 1\n title:\n type: string\n minLength: 1\n status:\n type: string\n minLength: 1\n priority:\n type: string\n minLength: 1\n due:\n anyOf:\n - type: string\n format: date\n - type: string\n format: date-time\n scheduled:\n anyOf:\n - type: string\n format: date\n - type: string\n format: date-time\n contexts:\n type: array\n items:\n type: string\n projects:\n type: array\n items:\n type: string\n attachments:\n type: array\n uniqueItems: true\n items:\n type: string\n minLength: 1\n timeEstimate:\n type: integer\n minimum: 0\n completedDate:\n type: string\n format: date\n dateCreated:\n type: string\n format: date-time\n dateModified:\n type: string\n format: date-time\n recurrence:\n type: string\n recurrenceAnchor:\n enum:\n - scheduled\n - completion\n recurrenceParent:\n type: string\n occurrenceDate:\n type: string\n format: date\n occurrenceMaterialization:\n enum:\n - manual\n - on_completion\n - rolling\n occurrenceNextTrigger:\n enum:\n - completion\n - completion_or_skip\n occurrenceTemplate:\n type: string\n occurrencePastHorizon:\n type: string\n occurrenceFutureHorizon:\n type: string\n tags:\n type: array\n items:\n type: string\n timeEntries:\n type: array\n items:\n type: object\n reminders:\n type: array\n items:\n type: object\n blockedBy:\n type: array\n items:\n type: object\n completeInstances:\n type: array\n items:\n type: string\n format: date\n skippedInstances:\n type: array\n items:\n type: string\n format: date\n icsEventId:\n type: array\n items:\n type: string\n googleCalendarEventId:\n type: string\n googleCalendarExceptionEventId:\n type: string\n googleCalendarExceptionOriginalScheduled:\n type: string\n format: date\n googleCalendarMovedOriginalDates:\n type: array\n items:\n type: string\n format: date\n sortOrder:\n type: string\nbinding_schema:\n dialect: json-schema-2020-12\n value:\n $schema: https://json-schema.org/draft/2020-12/schema\n $id: https://tasknotes.dev/schemas/tasknotes-task-binding.schema.json\n title: TaskNotes task data-contract binding\n description: Semantic configuration supplied by an mdbase type that implements tasknotes.task 0.3.0-rc.3.\n type: object\n required:\n - profiles\n - capabilities\n - title\n - status\n - priority\n - recurrence\n - occurrences\n - links\n - archive\n - time_tracking\n - templating\n properties:\n profiles:\n type: array\n minItems: 1\n uniqueItems: true\n items:\n enum:\n - core-lite\n - recurrence\n - templating\n - materialized-occurrences\n - extended\n capabilities:\n type: array\n uniqueItems: true\n items:\n enum:\n - dependencies\n - reminders\n - attachments\n - links\n - time-tracking\n - materialized-occurrences\n - rename\n - archive\n - batch\n - concurrency\n - dry-run\n - migration\n - templating\n title:\n $ref: \"#/$defs/titlePolicy\"\n status:\n $ref: \"#/$defs/statusPolicy\"\n priority:\n $ref: \"#/$defs/priorityPolicy\"\n recurrence:\n $ref: \"#/$defs/recurrencePolicy\"\n occurrences:\n $ref: \"#/$defs/occurrencePolicy\"\n links:\n $ref: \"#/$defs/linkPolicy\"\n archive:\n $ref: \"#/$defs/archivePolicy\"\n time_tracking:\n $ref: \"#/$defs/timeTrackingPolicy\"\n templating:\n $ref: \"#/$defs/templatingPolicy\"\n nlp:\n $ref: \"#/$defs/nlpPolicy\"\n additionalProperties: false\n $defs:\n nonEmptyString:\n type: string\n minLength: 1\n stringSet:\n type: array\n uniqueItems: true\n items:\n $ref: \"#/$defs/nonEmptyString\"\n titlePolicy:\n type: object\n required:\n - storage\n properties:\n storage:\n enum:\n - filename\n - frontmatter\n filename_format:\n enum:\n - title\n - zettel\n - timestamp\n - uuid\n - custom\n custom_filename_template:\n $ref: \"#/$defs/nonEmptyString\"\n allOf:\n - if:\n properties:\n filename_format:\n const: custom\n required:\n - filename_format\n then:\n properties:\n custom_filename_template:\n $ref: \"#/$defs/nonEmptyString\"\n required:\n - custom_filename_template\n additionalProperties: true\n statusDefinition:\n type: object\n required:\n - value\n - label\n - color\n - is_completed\n - is_skipped\n - exclude_from_cycle\n - order\n - auto_archive\n - auto_archive_delay_minutes\n properties:\n value:\n $ref: \"#/$defs/nonEmptyString\"\n label:\n type: string\n color:\n type: string\n icon:\n $ref: \"#/$defs/nonEmptyString\"\n is_completed:\n type: boolean\n is_skipped:\n type: boolean\n exclude_from_cycle:\n type: boolean\n next_status:\n $ref: \"#/$defs/nonEmptyString\"\n order:\n type: number\n auto_archive:\n type: boolean\n auto_archive_delay_minutes:\n type: number\n minimum: 0\n additionalProperties: true\n statusPolicy:\n type: object\n required:\n - values\n - default\n - completed_values\n - definitions\n properties:\n values:\n $ref: \"#/$defs/stringSet\"\n default:\n $ref: \"#/$defs/nonEmptyString\"\n completed_values:\n $ref: \"#/$defs/stringSet\"\n skipped_values:\n $ref: \"#/$defs/stringSet\"\n default_skipped:\n $ref: \"#/$defs/nonEmptyString\"\n definitions:\n type: array\n items:\n $ref: \"#/$defs/statusDefinition\"\n additionalProperties: false\n priorityDefinition:\n type: object\n required:\n - value\n - label\n - color\n - weight\n properties:\n value:\n $ref: \"#/$defs/nonEmptyString\"\n label:\n type: string\n color:\n type: string\n icon:\n $ref: \"#/$defs/nonEmptyString\"\n weight:\n type: number\n additionalProperties: true\n priorityPolicy:\n type: object\n required:\n - values\n - default\n - definitions\n properties:\n values:\n $ref: \"#/$defs/stringSet\"\n default:\n $ref: \"#/$defs/nonEmptyString\"\n definitions:\n type: array\n items:\n $ref: \"#/$defs/priorityDefinition\"\n additionalProperties: false\n recurrencePolicy:\n type: object\n required:\n - syntax\n - maintain_due_date_offset\n - reset_body_checkboxes\n properties:\n syntax:\n const: tasknotes\n maintain_due_date_offset:\n type: boolean\n reset_body_checkboxes:\n type: boolean\n additionalProperties: false\n occurrencePolicy:\n type: object\n required:\n - identity_roles\n - default_materialization\n - default_next_trigger\n properties:\n identity_roles:\n const:\n - recurrenceParent\n - occurrenceDate\n default_materialization:\n enum:\n - manual\n - on_completion\n - rolling\n default_next_trigger:\n enum:\n - completion\n - completion_or_skip\n past_horizon:\n $ref: \"#/$defs/nonEmptyString\"\n future_horizon:\n $ref: \"#/$defs/nonEmptyString\"\n additionalProperties: false\n linkPolicy:\n type: object\n required:\n - accepted_formats\n - write_format\n properties:\n accepted_formats:\n type: array\n minItems: 1\n uniqueItems: true\n items:\n enum:\n - wikilink\n - markdown\n write_format:\n enum:\n - wikilink\n - markdown\n additionalProperties: false\n archivePolicy:\n type: object\n required:\n - archived_tag\n - move_on_archive\n properties:\n archived_tag:\n $ref: \"#/$defs/nonEmptyString\"\n move_on_archive:\n type: boolean\n folder:\n $ref: \"#/$defs/nonEmptyString\"\n additionalProperties: false\n timeTrackingPolicy:\n type: object\n required:\n - auto_stop_on_complete\n properties:\n auto_stop_on_complete:\n type: boolean\n additionalProperties: false\n templatingPolicy:\n type: object\n required:\n - enabled\n - occurrence_enabled\n properties:\n enabled:\n type: boolean\n template_path:\n $ref: \"#/$defs/nonEmptyString\"\n occurrence_enabled:\n type: boolean\n occurrence_template_path:\n $ref: \"#/$defs/nonEmptyString\"\n failure_mode:\n enum:\n - error\n - warning_fallback\n unknown_variable_policy:\n enum:\n - preserve\n - empty\n additionalProperties: false\n nlpTrigger:\n type: object\n required:\n - property_id\n - trigger\n - enabled\n properties:\n property_id:\n $ref: \"#/$defs/nonEmptyString\"\n trigger:\n $ref: \"#/$defs/nonEmptyString\"\n enabled:\n type: boolean\n additionalProperties: false\n nlpPolicy:\n type: object\n required:\n - triggers\n properties:\n triggers:\n type: array\n items:\n $ref: \"#/$defs/nlpTrigger\"\n additionalProperties: false\n---\n\n# TaskNotes task contract\n\nTypes implement this contract through `implements`; applications consume\nthe normalized contract view rather than assuming frontmatter names.\n"
+ "source": "contracts/tasknotes.task/0.3.0-rc.5.md",
+ "document": "---\nkind: mdbase.contract\ncontract_type: record\nid: tasknotes.task\nversion: 0.3.0-rc.5\nname: TaskNotes task\ndescription: Portable task data and behavior defined by tasknotes-spec 0.3.0-rc.5.\nrecord_schema:\n dialect: json-schema-2020-12\n value:\n $schema: https://json-schema.org/draft/2020-12/schema\n $id: https://tasknotes.dev/schemas/tasknotes-task.schema.json\n title: TaskNotes portable task view\n description: The storage-neutral record view exposed by the tasknotes.task 0.3.0-rc.5 record contract.\n type: object\n required:\n - status\n - dateCreated\n additionalProperties: false\n properties:\n id:\n type: string\n minLength: 1\n title:\n type: string\n minLength: 1\n status:\n type: string\n minLength: 1\n priority:\n type: string\n minLength: 1\n due:\n anyOf:\n - type: string\n format: date\n - type: string\n format: date-time\n scheduled:\n anyOf:\n - type: string\n format: date\n - type: string\n format: date-time\n contexts:\n type: array\n items:\n type: string\n projects:\n type: array\n items:\n type: string\n assignees:\n type: array\n uniqueItems: true\n items:\n type: string\n minLength: 1\n pattern: \\S\n description: Links to records implementing mdbase.person, such as [[Alex Rivera]]. Implementing types declare this field in collection.links. These references never grant collection access.\n attachments:\n type: array\n uniqueItems: true\n items:\n type: string\n minLength: 1\n timeEstimate:\n type: integer\n minimum: 0\n completedDate:\n type: string\n format: date\n dateCreated:\n type: string\n format: date-time\n dateModified:\n type: string\n format: date-time\n recurrence:\n type: string\n recurrenceAnchor:\n enum:\n - scheduled\n - completion\n recurrenceParent:\n type: string\n occurrenceDate:\n type: string\n format: date\n occurrenceMaterialization:\n enum:\n - manual\n - on_completion\n - rolling\n occurrenceNextTrigger:\n enum:\n - completion\n - completion_or_skip\n occurrenceTemplate:\n type: string\n occurrencePastHorizon:\n type: string\n occurrenceFutureHorizon:\n type: string\n tags:\n type: array\n items:\n type: string\n timeEntries:\n type: array\n items:\n type: object\n reminders:\n type: array\n items:\n type: object\n blockedBy:\n type: array\n items:\n type: object\n completeInstances:\n type: array\n items:\n type: string\n format: date\n skippedInstances:\n type: array\n items:\n type: string\n format: date\n icsEventId:\n type: array\n items:\n type: string\n googleCalendarEventId:\n type: string\n googleCalendarExceptionEventId:\n type: string\n googleCalendarExceptionOriginalScheduled:\n type: string\n format: date\n googleCalendarMovedOriginalDates:\n type: array\n items:\n type: string\n format: date\n sortOrder:\n type: string\nbinding_schema:\n dialect: json-schema-2020-12\n value:\n $schema: https://json-schema.org/draft/2020-12/schema\n $id: https://tasknotes.dev/schemas/tasknotes-task-binding.schema.json\n title: TaskNotes task data-contract binding\n description: Semantic configuration supplied by an mdbase type that implements tasknotes.task 0.3.0-rc.3.\n type: object\n required:\n - profiles\n - capabilities\n - title\n - status\n - priority\n - recurrence\n - occurrences\n - links\n - archive\n - time_tracking\n - templating\n properties:\n profiles:\n type: array\n minItems: 1\n uniqueItems: true\n items:\n enum:\n - core-lite\n - recurrence\n - templating\n - materialized-occurrences\n - extended\n capabilities:\n type: array\n uniqueItems: true\n items:\n enum:\n - dependencies\n - reminders\n - attachments\n - links\n - time-tracking\n - materialized-occurrences\n - rename\n - archive\n - batch\n - concurrency\n - dry-run\n - migration\n - templating\n title:\n $ref: \"#/$defs/titlePolicy\"\n status:\n $ref: \"#/$defs/statusPolicy\"\n priority:\n $ref: \"#/$defs/priorityPolicy\"\n recurrence:\n $ref: \"#/$defs/recurrencePolicy\"\n occurrences:\n $ref: \"#/$defs/occurrencePolicy\"\n links:\n $ref: \"#/$defs/linkPolicy\"\n archive:\n $ref: \"#/$defs/archivePolicy\"\n time_tracking:\n $ref: \"#/$defs/timeTrackingPolicy\"\n templating:\n $ref: \"#/$defs/templatingPolicy\"\n nlp:\n $ref: \"#/$defs/nlpPolicy\"\n additionalProperties: false\n $defs:\n nonEmptyString:\n type: string\n minLength: 1\n stringSet:\n type: array\n uniqueItems: true\n items:\n $ref: \"#/$defs/nonEmptyString\"\n titlePolicy:\n type: object\n required:\n - storage\n properties:\n storage:\n enum:\n - filename\n - frontmatter\n filename_format:\n enum:\n - title\n - zettel\n - timestamp\n - uuid\n - custom\n custom_filename_template:\n $ref: \"#/$defs/nonEmptyString\"\n allOf:\n - if:\n properties:\n filename_format:\n const: custom\n required:\n - filename_format\n then:\n properties:\n custom_filename_template:\n $ref: \"#/$defs/nonEmptyString\"\n required:\n - custom_filename_template\n additionalProperties: true\n statusDefinition:\n type: object\n required:\n - value\n - label\n - color\n - is_completed\n - is_skipped\n - exclude_from_cycle\n - order\n - auto_archive\n - auto_archive_delay_minutes\n properties:\n value:\n $ref: \"#/$defs/nonEmptyString\"\n label:\n type: string\n color:\n type: string\n icon:\n $ref: \"#/$defs/nonEmptyString\"\n is_completed:\n type: boolean\n is_skipped:\n type: boolean\n exclude_from_cycle:\n type: boolean\n next_status:\n $ref: \"#/$defs/nonEmptyString\"\n order:\n type: number\n auto_archive:\n type: boolean\n auto_archive_delay_minutes:\n type: number\n minimum: 0\n additionalProperties: true\n statusPolicy:\n type: object\n required:\n - values\n - default\n - completed_values\n - definitions\n properties:\n values:\n $ref: \"#/$defs/stringSet\"\n default:\n $ref: \"#/$defs/nonEmptyString\"\n completed_values:\n $ref: \"#/$defs/stringSet\"\n skipped_values:\n $ref: \"#/$defs/stringSet\"\n default_skipped:\n $ref: \"#/$defs/nonEmptyString\"\n definitions:\n type: array\n items:\n $ref: \"#/$defs/statusDefinition\"\n additionalProperties: false\n priorityDefinition:\n type: object\n required:\n - value\n - label\n - color\n - weight\n properties:\n value:\n $ref: \"#/$defs/nonEmptyString\"\n label:\n type: string\n color:\n type: string\n icon:\n $ref: \"#/$defs/nonEmptyString\"\n weight:\n type: number\n additionalProperties: true\n priorityPolicy:\n type: object\n required:\n - values\n - default\n - definitions\n properties:\n values:\n $ref: \"#/$defs/stringSet\"\n default:\n $ref: \"#/$defs/nonEmptyString\"\n definitions:\n type: array\n items:\n $ref: \"#/$defs/priorityDefinition\"\n additionalProperties: false\n recurrencePolicy:\n type: object\n required:\n - syntax\n - maintain_due_date_offset\n - reset_body_checkboxes\n properties:\n syntax:\n const: tasknotes\n maintain_due_date_offset:\n type: boolean\n reset_body_checkboxes:\n type: boolean\n additionalProperties: false\n occurrencePolicy:\n type: object\n required:\n - identity_roles\n - default_materialization\n - default_next_trigger\n properties:\n identity_roles:\n const:\n - recurrenceParent\n - occurrenceDate\n default_materialization:\n enum:\n - manual\n - on_completion\n - rolling\n default_next_trigger:\n enum:\n - completion\n - completion_or_skip\n past_horizon:\n $ref: \"#/$defs/nonEmptyString\"\n future_horizon:\n $ref: \"#/$defs/nonEmptyString\"\n additionalProperties: false\n linkPolicy:\n type: object\n required:\n - accepted_formats\n - write_format\n properties:\n accepted_formats:\n type: array\n minItems: 1\n uniqueItems: true\n items:\n enum:\n - wikilink\n - markdown\n write_format:\n enum:\n - wikilink\n - markdown\n additionalProperties: false\n archivePolicy:\n type: object\n required:\n - archived_tag\n - move_on_archive\n properties:\n archived_tag:\n $ref: \"#/$defs/nonEmptyString\"\n move_on_archive:\n type: boolean\n folder:\n $ref: \"#/$defs/nonEmptyString\"\n additionalProperties: false\n timeTrackingPolicy:\n type: object\n required:\n - auto_stop_on_complete\n properties:\n auto_stop_on_complete:\n type: boolean\n additionalProperties: false\n templatingPolicy:\n type: object\n required:\n - enabled\n - occurrence_enabled\n properties:\n enabled:\n type: boolean\n template_path:\n $ref: \"#/$defs/nonEmptyString\"\n occurrence_enabled:\n type: boolean\n occurrence_template_path:\n $ref: \"#/$defs/nonEmptyString\"\n failure_mode:\n enum:\n - error\n - warning_fallback\n unknown_variable_policy:\n enum:\n - preserve\n - empty\n additionalProperties: false\n nlpTrigger:\n type: object\n required:\n - property_id\n - trigger\n - enabled\n properties:\n property_id:\n $ref: \"#/$defs/nonEmptyString\"\n trigger:\n $ref: \"#/$defs/nonEmptyString\"\n enabled:\n type: boolean\n additionalProperties: false\n nlpPolicy:\n type: object\n required:\n - triggers\n properties:\n triggers:\n type: array\n items:\n $ref: \"#/$defs/nlpTrigger\"\n additionalProperties: false\n---\n\n# TaskNotes task contract\n\nTypes implement this contract through `implements`; applications consume\nthe normalized contract view rather than assuming frontmatter names.\n"
},
{
- "source": "types/tasknotes-task/1.md",
- "document": "---\nkind: mdbase.type\nname: task\nversion: 1\ndescription: A task managed by TaskNotes.\nmatch:\n where:\n tags:\n contains: task\nschema:\n dialect: json-schema-2020-12\n value:\n $schema: https://json-schema.org/draft/2020-12/schema\n type: object\n additionalProperties: true\n properties:\n id:\n type: string\n minLength: 1\n title:\n type: string\n minLength: 1\n status:\n enum: &a2\n - none\n - open\n - in-progress\n - done\n - cancelled\n default: open\n priority:\n enum: &a4\n - none\n - low\n - normal\n - high\n default: normal\n due: &a1\n anyOf:\n - type: string\n format: date\n - type: string\n format: date-time\n scheduled: *a1\n contexts:\n type: array\n items:\n type: string\n projects:\n type: array\n items:\n type: string\n attachments:\n type: array\n items:\n type: string\n minLength: 1\n uniqueItems: true\n timeEstimate:\n type: integer\n minimum: 0\n completedDate:\n type: string\n format: date\n dateCreated:\n type: string\n format: date-time\n dateModified:\n type: string\n format: date-time\n recurrence:\n type: string\n recurrence_anchor:\n enum:\n - scheduled\n - completion\n default: scheduled\n occurrence_materialization:\n enum:\n - manual\n - on_completion\n - rolling\n default: manual\n occurrence_next_trigger:\n enum:\n - completion\n - completion_or_skip\n default: completion\n occurrence_template:\n type: string\n occurrence_past_horizon:\n type: string\n occurrence_future_horizon:\n type: string\n recurrence_parent:\n type: string\n occurrence_date:\n type: string\n format: date\n tags:\n type: array\n items:\n type: string\n timeEntries:\n type: array\n items:\n type: object\n additionalProperties: false\n properties:\n startTime:\n type: string\n format: date-time\n endTime:\n type: string\n format: date-time\n description:\n type: string\n duration:\n type: integer\n reminders:\n type: array\n items:\n oneOf:\n - type: object\n required:\n - id\n - type\n - absoluteTime\n additionalProperties: false\n properties:\n id:\n type: string\n type:\n const: absolute\n description:\n type: string\n absoluteTime:\n type: string\n format: date-time\n - type: object\n required:\n - id\n - type\n - relatedTo\n - offset\n additionalProperties: false\n properties:\n id:\n type: string\n type:\n const: relative\n description:\n type: string\n relatedTo:\n enum:\n - due\n - scheduled\n offset:\n type: string\n blockedBy:\n type: array\n items:\n type: object\n additionalProperties: false\n properties:\n uid:\n type: string\n reltype:\n type: string\n gap:\n type: string\n required:\n - uid\n complete_instances:\n type: array\n items:\n type: string\n format: date\n skipped_instances:\n type: array\n items:\n type: string\n format: date\n icsEventId:\n type: array\n items:\n type: string\n googleCalendarEventId:\n type: string\n googleCalendarExceptionEventId:\n type: string\n googleCalendarExceptionOriginalScheduled:\n type: string\n format: date\n googleCalendarMovedOriginalDates:\n type: array\n items:\n type: string\n format: date\n tasknotes_manual_order:\n type: string\n allOf:\n - if:\n required:\n - status\n properties:\n status:\n enum: &a3\n - done\n not:\n required:\n - recurrence\n then:\n required:\n - completedDate\n required:\n - title\n - status\n - dateCreated\ncollection:\n read_defaults:\n status: open\n priority: normal\n recurrence_anchor: scheduled\n occurrence_materialization: manual\n occurrence_next_trigger: completion\n links:\n projects[]:\n target_type: any\n validate_exists: false\n attachments[]:\n validate_exists: false\n occurrence_template:\n target_type: any\n validate_exists: false\n recurrence_parent:\n target_type: task\n validate_exists: false\n blockedBy[].uid:\n target_type: task\n validate_exists: false\n path:\n runtime: tasknotes\n template: \"{{zettel}}\"\n folder: tasks\n generated_by: tasknotes.filename.create\n display:\n name_field: title\n unique:\n - field: id\n scope: type\nlifecycle:\n on_create:\n set:\n id:\n uuid: true\n dateCreated:\n now: true\n dateModified:\n now: true\n on_update:\n set:\n dateModified:\n now: true\nimplements:\n - contract: tasknotes.task\n version: 0.3.0-rc.3\n fields:\n id: id\n title: title\n status: status\n priority: priority\n due: due\n scheduled: scheduled\n contexts: contexts\n projects: projects\n attachments: attachments\n timeEstimate: timeEstimate\n completedDate: completedDate\n dateCreated: dateCreated\n dateModified: dateModified\n recurrence: recurrence\n recurrenceAnchor: recurrence_anchor\n occurrenceMaterialization: occurrence_materialization\n occurrenceNextTrigger: occurrence_next_trigger\n occurrenceTemplate: occurrence_template\n occurrencePastHorizon: occurrence_past_horizon\n occurrenceFutureHorizon: occurrence_future_horizon\n recurrenceParent: recurrence_parent\n occurrenceDate: occurrence_date\n tags: tags\n timeEntries: timeEntries\n reminders: reminders\n blockedBy: blockedBy\n completeInstances: complete_instances\n skippedInstances: skipped_instances\n icsEventId: icsEventId\n googleCalendarEventId: googleCalendarEventId\n googleCalendarExceptionEventId: googleCalendarExceptionEventId\n googleCalendarExceptionOriginalScheduled: googleCalendarExceptionOriginalScheduled\n googleCalendarMovedOriginalDates: googleCalendarMovedOriginalDates\n sortOrder: tasknotes_manual_order\n binding:\n profiles:\n - core-lite\n - recurrence\n - materialized-occurrences\n capabilities:\n - dependencies\n - reminders\n - attachments\n - links\n - time-tracking\n - materialized-occurrences\n - archive\n - templating\n title:\n storage: frontmatter\n filename_format: zettel\n status:\n values: *a2\n default: open\n completed_values: *a3\n skipped_values:\n - cancelled\n default_skipped: cancelled\n definitions:\n - value: none\n label: None\n color: \"#94a3b8\"\n is_completed: false\n is_skipped: false\n exclude_from_cycle: false\n order: 0\n auto_archive: false\n auto_archive_delay_minutes: 5\n - value: open\n label: Open\n color: \"#64748b\"\n is_completed: false\n is_skipped: false\n exclude_from_cycle: false\n order: 1\n auto_archive: false\n auto_archive_delay_minutes: 5\n - value: in-progress\n label: In progress\n color: \"#3b82f6\"\n is_completed: false\n is_skipped: false\n exclude_from_cycle: false\n order: 2\n auto_archive: false\n auto_archive_delay_minutes: 5\n - value: done\n label: Done\n color: \"#22c55e\"\n is_completed: true\n is_skipped: false\n exclude_from_cycle: false\n order: 3\n auto_archive: false\n auto_archive_delay_minutes: 5\n - value: cancelled\n label: Cancelled\n color: \"#94a3b8\"\n is_completed: false\n is_skipped: true\n exclude_from_cycle: true\n order: 4\n auto_archive: false\n auto_archive_delay_minutes: 5\n priority:\n values: *a4\n default: normal\n definitions:\n - value: none\n label: None\n color: \"#94a3b8\"\n weight: 0\n - value: low\n label: Low\n color: \"#3b82f6\"\n weight: 1\n - value: normal\n label: Normal\n color: \"#f59e0b\"\n weight: 2\n - value: high\n label: High\n color: \"#ef4444\"\n weight: 3\n recurrence:\n syntax: tasknotes\n maintain_due_date_offset: true\n reset_body_checkboxes: false\n occurrences:\n identity_roles:\n - recurrenceParent\n - occurrenceDate\n default_materialization: manual\n default_next_trigger: completion\n past_horizon: P0D\n future_horizon: P14D\n links:\n accepted_formats:\n - wikilink\n - markdown\n write_format: wikilink\n archive:\n archived_tag: archived\n move_on_archive: false\n time_tracking:\n auto_stop_on_complete: false\n templating:\n enabled: false\n occurrence_enabled: false\nx-tasknotes-generator:\n managed_fields:\n - attachments\n - blockedBy\n - complete_instances\n - completedDate\n - contexts\n - dateCreated\n - dateModified\n - due\n - googleCalendarEventId\n - googleCalendarExceptionEventId\n - googleCalendarExceptionOriginalScheduled\n - googleCalendarMovedOriginalDates\n - icsEventId\n - id\n - occurrence_date\n - occurrence_future_horizon\n - occurrence_materialization\n - occurrence_next_trigger\n - occurrence_past_horizon\n - occurrence_template\n - priority\n - projects\n - recurrence\n - recurrence_anchor\n - recurrence_parent\n - reminders\n - scheduled\n - skipped_instances\n - status\n - tags\n - tasknotes_manual_order\n - timeEntries\n - timeEstimate\n - title\n---\n# Task\n\nTask records live under `tasks/`.\n"
+ "source": "types/tasknotes-task/5.md",
+ "document": "---\nkind: mdbase.type\nname: task\nversion: 4\ndescription: A task managed by TaskNotes.\nmatch:\n where:\n tags:\n contains: task\nschema:\n dialect: json-schema-2020-12\n value:\n $schema: https://json-schema.org/draft/2020-12/schema\n type: object\n additionalProperties: true\n properties:\n id:\n type: string\n minLength: 1\n title:\n type: string\n minLength: 1\n status:\n enum: &a2\n - none\n - open\n - in-progress\n - done\n - cancelled\n default: open\n priority:\n enum: &a4\n - none\n - low\n - normal\n - high\n default: normal\n due: &a1\n anyOf:\n - type: string\n format: date\n - type: string\n format: date-time\n scheduled: *a1\n contexts:\n type: array\n items:\n type: string\n projects:\n type: array\n items:\n type: string\n assignees:\n type: array\n items:\n type: string\n minLength: 1\n pattern: \\S\n uniqueItems: true\n attachments:\n type: array\n items:\n type: string\n minLength: 1\n uniqueItems: true\n timeEstimate:\n type: integer\n minimum: 0\n completedDate:\n type: string\n format: date\n dateCreated:\n type: string\n format: date-time\n dateModified:\n type: string\n format: date-time\n recurrence:\n type: string\n recurrence_anchor:\n enum:\n - scheduled\n - completion\n default: scheduled\n occurrence_materialization:\n enum:\n - manual\n - on_completion\n - rolling\n default: manual\n occurrence_next_trigger:\n enum:\n - completion\n - completion_or_skip\n default: completion\n occurrence_template:\n type: string\n occurrence_past_horizon:\n type: string\n occurrence_future_horizon:\n type: string\n recurrence_parent:\n type: string\n occurrence_date:\n type: string\n format: date\n tags:\n type: array\n items:\n type: string\n timeEntries:\n type: array\n items:\n type: object\n additionalProperties: false\n properties:\n startTime:\n type: string\n format: date-time\n endTime:\n type: string\n format: date-time\n description:\n type: string\n duration:\n type: integer\n reminders:\n type: array\n items:\n oneOf:\n - type: object\n required:\n - id\n - type\n - absoluteTime\n additionalProperties: false\n properties:\n id:\n type: string\n type:\n const: absolute\n description:\n type: string\n absoluteTime:\n type: string\n format: date-time\n - type: object\n required:\n - id\n - type\n - relatedTo\n - offset\n additionalProperties: false\n properties:\n id:\n type: string\n type:\n const: relative\n description:\n type: string\n relatedTo:\n enum:\n - due\n - scheduled\n offset:\n type: string\n blockedBy:\n type: array\n items:\n type: object\n additionalProperties: false\n properties:\n uid:\n type: string\n reltype:\n type: string\n gap:\n type: string\n required:\n - uid\n complete_instances:\n type: array\n items:\n type: string\n format: date\n skipped_instances:\n type: array\n items:\n type: string\n format: date\n icsEventId:\n type: array\n items:\n type: string\n googleCalendarEventId:\n type: string\n googleCalendarExceptionEventId:\n type: string\n googleCalendarExceptionOriginalScheduled:\n type: string\n format: date\n googleCalendarMovedOriginalDates:\n type: array\n items:\n type: string\n format: date\n tasknotes_manual_order:\n type: string\n allOf:\n - if:\n required:\n - status\n properties:\n status:\n enum: &a3\n - done\n not:\n required:\n - recurrence\n then:\n required:\n - completedDate\n required:\n - title\n - status\n - dateCreated\ncollection:\n read_defaults:\n status: open\n priority: normal\n recurrence_anchor: scheduled\n occurrence_materialization: manual\n occurrence_next_trigger: completion\n links:\n projects[]:\n target_type: any\n validate_exists: false\n assignees[]:\n validate_exists: false\n attachments[]:\n validate_exists: false\n occurrence_template:\n target_type: any\n validate_exists: false\n recurrence_parent:\n target_type: task\n validate_exists: false\n blockedBy[].uid:\n target_type: task\n validate_exists: false\n path:\n runtime: tasknotes\n template: \"{{zettel}}\"\n folder: tasks\n generated_by: tasknotes.filename.create\n display:\n name_field: title\n unique:\n - field: id\n scope: type\nlifecycle:\n on_create:\n set:\n id:\n uuid: true\n dateCreated:\n now: true\n dateModified:\n now: true\n on_update:\n set:\n dateModified:\n now: true\nimplements:\n - contract: tasknotes.task\n version: 0.3.0-rc.5\n fields:\n id: id\n title: title\n status: status\n priority: priority\n due: due\n scheduled: scheduled\n contexts: contexts\n projects: projects\n assignees: assignees\n attachments: attachments\n timeEstimate: timeEstimate\n completedDate: completedDate\n dateCreated: dateCreated\n dateModified: dateModified\n recurrence: recurrence\n recurrenceAnchor: recurrence_anchor\n occurrenceMaterialization: occurrence_materialization\n occurrenceNextTrigger: occurrence_next_trigger\n occurrenceTemplate: occurrence_template\n occurrencePastHorizon: occurrence_past_horizon\n occurrenceFutureHorizon: occurrence_future_horizon\n recurrenceParent: recurrence_parent\n occurrenceDate: occurrence_date\n tags: tags\n timeEntries: timeEntries\n reminders: reminders\n blockedBy: blockedBy\n completeInstances: complete_instances\n skippedInstances: skipped_instances\n icsEventId: icsEventId\n googleCalendarEventId: googleCalendarEventId\n googleCalendarExceptionEventId: googleCalendarExceptionEventId\n googleCalendarExceptionOriginalScheduled: googleCalendarExceptionOriginalScheduled\n googleCalendarMovedOriginalDates: googleCalendarMovedOriginalDates\n sortOrder: tasknotes_manual_order\n binding:\n profiles:\n - core-lite\n - recurrence\n - materialized-occurrences\n capabilities:\n - dependencies\n - reminders\n - attachments\n - links\n - time-tracking\n - materialized-occurrences\n - archive\n - templating\n title:\n storage: frontmatter\n filename_format: zettel\n status:\n values: *a2\n default: open\n completed_values: *a3\n skipped_values:\n - cancelled\n default_skipped: cancelled\n definitions:\n - value: none\n label: None\n color: \"#94a3b8\"\n is_completed: false\n is_skipped: false\n exclude_from_cycle: false\n order: 0\n auto_archive: false\n auto_archive_delay_minutes: 5\n - value: open\n label: Open\n color: \"#64748b\"\n is_completed: false\n is_skipped: false\n exclude_from_cycle: false\n order: 1\n auto_archive: false\n auto_archive_delay_minutes: 5\n - value: in-progress\n label: In progress\n color: \"#3b82f6\"\n is_completed: false\n is_skipped: false\n exclude_from_cycle: false\n order: 2\n auto_archive: false\n auto_archive_delay_minutes: 5\n - value: done\n label: Done\n color: \"#22c55e\"\n is_completed: true\n is_skipped: false\n exclude_from_cycle: false\n order: 3\n auto_archive: false\n auto_archive_delay_minutes: 5\n - value: cancelled\n label: Cancelled\n color: \"#94a3b8\"\n is_completed: false\n is_skipped: true\n exclude_from_cycle: true\n order: 4\n auto_archive: false\n auto_archive_delay_minutes: 5\n priority:\n values: *a4\n default: normal\n definitions:\n - value: none\n label: None\n color: \"#94a3b8\"\n weight: 0\n - value: low\n label: Low\n color: \"#3b82f6\"\n weight: 1\n - value: normal\n label: Normal\n color: \"#f59e0b\"\n weight: 2\n - value: high\n label: High\n color: \"#ef4444\"\n weight: 3\n recurrence:\n syntax: tasknotes\n maintain_due_date_offset: true\n reset_body_checkboxes: false\n occurrences:\n identity_roles:\n - recurrenceParent\n - occurrenceDate\n default_materialization: manual\n default_next_trigger: completion\n past_horizon: P0D\n future_horizon: P14D\n links:\n accepted_formats:\n - wikilink\n - markdown\n write_format: wikilink\n archive:\n archived_tag: archived\n move_on_archive: false\n time_tracking:\n auto_stop_on_complete: false\n templating:\n enabled: false\n occurrence_enabled: false\nx-tasknotes-generator:\n managed_fields:\n - attachments\n - blockedBy\n - complete_instances\n - completedDate\n - contexts\n - dateCreated\n - dateModified\n - due\n - googleCalendarEventId\n - googleCalendarExceptionEventId\n - googleCalendarExceptionOriginalScheduled\n - googleCalendarMovedOriginalDates\n - icsEventId\n - id\n - occurrence_date\n - occurrence_future_horizon\n - occurrence_materialization\n - occurrence_next_trigger\n - occurrence_past_horizon\n - occurrence_template\n - priority\n - projects\n - recurrence\n - recurrence_anchor\n - recurrence_parent\n - reminders\n - scheduled\n - skipped_instances\n - status\n - tags\n - tasknotes_manual_order\n - timeEntries\n - timeEstimate\n - title\n---\n# Task\n\nTask records live under `tasks/`.\n"
},
{
- "source": "schemas/tasknotes.task/0.3.0-rc.3.schema.json",
- "document": "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://tasknotes.dev/schemas/tasknotes-task.schema.json\",\n \"title\": \"TaskNotes portable task view\",\n \"description\": \"The storage-neutral record view exposed by the tasknotes.task 0.3.0-rc.3 record contract.\",\n \"type\": \"object\",\n \"required\": [\n \"status\",\n \"dateCreated\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"title\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"status\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"priority\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"due\": {\n \"anyOf\": [\n {\n \"type\": \"string\",\n \"format\": \"date\"\n },\n {\n \"type\": \"string\",\n \"format\": \"date-time\"\n }\n ]\n },\n \"scheduled\": {\n \"anyOf\": [\n {\n \"type\": \"string\",\n \"format\": \"date\"\n },\n {\n \"type\": \"string\",\n \"format\": \"date-time\"\n }\n ]\n },\n \"contexts\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"projects\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"attachments\": {\n \"type\": \"array\",\n \"uniqueItems\": true,\n \"items\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n },\n \"timeEstimate\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"completedDate\": {\n \"type\": \"string\",\n \"format\": \"date\"\n },\n \"dateCreated\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"dateModified\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"recurrence\": {\n \"type\": \"string\"\n },\n \"recurrenceAnchor\": {\n \"enum\": [\n \"scheduled\",\n \"completion\"\n ]\n },\n \"recurrenceParent\": {\n \"type\": \"string\"\n },\n \"occurrenceDate\": {\n \"type\": \"string\",\n \"format\": \"date\"\n },\n \"occurrenceMaterialization\": {\n \"enum\": [\n \"manual\",\n \"on_completion\",\n \"rolling\"\n ]\n },\n \"occurrenceNextTrigger\": {\n \"enum\": [\n \"completion\",\n \"completion_or_skip\"\n ]\n },\n \"occurrenceTemplate\": {\n \"type\": \"string\"\n },\n \"occurrencePastHorizon\": {\n \"type\": \"string\"\n },\n \"occurrenceFutureHorizon\": {\n \"type\": \"string\"\n },\n \"tags\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"timeEntries\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"reminders\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"blockedBy\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"completeInstances\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"format\": \"date\"\n }\n },\n \"skippedInstances\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"format\": \"date\"\n }\n },\n \"icsEventId\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"googleCalendarEventId\": {\n \"type\": \"string\"\n },\n \"googleCalendarExceptionEventId\": {\n \"type\": \"string\"\n },\n \"googleCalendarExceptionOriginalScheduled\": {\n \"type\": \"string\",\n \"format\": \"date\"\n },\n \"googleCalendarMovedOriginalDates\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"format\": \"date\"\n }\n },\n \"sortOrder\": {\n \"type\": \"string\"\n }\n }\n}\n"
+ "source": "schemas/tasknotes.task/0.3.0-rc.5.schema.json",
+ "document": "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://tasknotes.dev/schemas/tasknotes-task.schema.json\",\n \"title\": \"TaskNotes portable task view\",\n \"description\": \"The storage-neutral record view exposed by the tasknotes.task 0.3.0-rc.5 record contract.\",\n \"type\": \"object\",\n \"required\": [\n \"status\",\n \"dateCreated\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"title\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"status\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"priority\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"due\": {\n \"anyOf\": [\n {\n \"type\": \"string\",\n \"format\": \"date\"\n },\n {\n \"type\": \"string\",\n \"format\": \"date-time\"\n }\n ]\n },\n \"scheduled\": {\n \"anyOf\": [\n {\n \"type\": \"string\",\n \"format\": \"date\"\n },\n {\n \"type\": \"string\",\n \"format\": \"date-time\"\n }\n ]\n },\n \"contexts\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"projects\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"assignees\": {\n \"type\": \"array\",\n \"uniqueItems\": true,\n \"items\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"pattern\": \"\\\\S\"\n },\n \"description\": \"Links to records implementing mdbase.person, such as [[Alex Rivera]]. Implementing types declare this field in collection.links. These references never grant collection access.\"\n },\n \"attachments\": {\n \"type\": \"array\",\n \"uniqueItems\": true,\n \"items\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n },\n \"timeEstimate\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"completedDate\": {\n \"type\": \"string\",\n \"format\": \"date\"\n },\n \"dateCreated\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"dateModified\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"recurrence\": {\n \"type\": \"string\"\n },\n \"recurrenceAnchor\": {\n \"enum\": [\n \"scheduled\",\n \"completion\"\n ]\n },\n \"recurrenceParent\": {\n \"type\": \"string\"\n },\n \"occurrenceDate\": {\n \"type\": \"string\",\n \"format\": \"date\"\n },\n \"occurrenceMaterialization\": {\n \"enum\": [\n \"manual\",\n \"on_completion\",\n \"rolling\"\n ]\n },\n \"occurrenceNextTrigger\": {\n \"enum\": [\n \"completion\",\n \"completion_or_skip\"\n ]\n },\n \"occurrenceTemplate\": {\n \"type\": \"string\"\n },\n \"occurrencePastHorizon\": {\n \"type\": \"string\"\n },\n \"occurrenceFutureHorizon\": {\n \"type\": \"string\"\n },\n \"tags\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"timeEntries\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"reminders\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"blockedBy\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n },\n \"completeInstances\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"format\": \"date\"\n }\n },\n \"skippedInstances\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"format\": \"date\"\n }\n },\n \"icsEventId\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"googleCalendarEventId\": {\n \"type\": \"string\"\n },\n \"googleCalendarExceptionEventId\": {\n \"type\": \"string\"\n },\n \"googleCalendarExceptionOriginalScheduled\": {\n \"type\": \"string\",\n \"format\": \"date\"\n },\n \"googleCalendarMovedOriginalDates\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"format\": \"date\"\n }\n },\n \"sortOrder\": {\n \"type\": \"string\"\n }\n }\n}\n"
},
{
- "source": "schemas/tasknotes.task.binding/0.3.0-rc.3.schema.json",
+ "source": "schemas/tasknotes.task.binding/0.3.0-rc.5.schema.json",
"document": "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://tasknotes.dev/schemas/tasknotes-task-binding.schema.json\",\n \"title\": \"TaskNotes task data-contract binding\",\n \"description\": \"Semantic configuration supplied by an mdbase type that implements tasknotes.task 0.3.0-rc.3.\",\n \"type\": \"object\",\n \"required\": [\n \"profiles\",\n \"capabilities\",\n \"title\",\n \"status\",\n \"priority\",\n \"recurrence\",\n \"occurrences\",\n \"links\",\n \"archive\",\n \"time_tracking\",\n \"templating\"\n ],\n \"properties\": {\n \"profiles\": {\n \"type\": \"array\",\n \"minItems\": 1,\n \"uniqueItems\": true,\n \"items\": {\n \"enum\": [\n \"core-lite\",\n \"recurrence\",\n \"templating\",\n \"materialized-occurrences\",\n \"extended\"\n ]\n }\n },\n \"capabilities\": {\n \"type\": \"array\",\n \"uniqueItems\": true,\n \"items\": {\n \"enum\": [\n \"dependencies\",\n \"reminders\",\n \"attachments\",\n \"links\",\n \"time-tracking\",\n \"materialized-occurrences\",\n \"rename\",\n \"archive\",\n \"batch\",\n \"concurrency\",\n \"dry-run\",\n \"migration\",\n \"templating\"\n ]\n }\n },\n \"title\": {\n \"$ref\": \"#/$defs/titlePolicy\"\n },\n \"status\": {\n \"$ref\": \"#/$defs/statusPolicy\"\n },\n \"priority\": {\n \"$ref\": \"#/$defs/priorityPolicy\"\n },\n \"recurrence\": {\n \"$ref\": \"#/$defs/recurrencePolicy\"\n },\n \"occurrences\": {\n \"$ref\": \"#/$defs/occurrencePolicy\"\n },\n \"links\": {\n \"$ref\": \"#/$defs/linkPolicy\"\n },\n \"archive\": {\n \"$ref\": \"#/$defs/archivePolicy\"\n },\n \"time_tracking\": {\n \"$ref\": \"#/$defs/timeTrackingPolicy\"\n },\n \"templating\": {\n \"$ref\": \"#/$defs/templatingPolicy\"\n },\n \"nlp\": {\n \"$ref\": \"#/$defs/nlpPolicy\"\n }\n },\n \"additionalProperties\": false,\n \"$defs\": {\n \"nonEmptyString\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"stringSet\": {\n \"type\": \"array\",\n \"uniqueItems\": true,\n \"items\": {\n \"$ref\": \"#/$defs/nonEmptyString\"\n }\n },\n \"titlePolicy\": {\n \"type\": \"object\",\n \"required\": [\n \"storage\"\n ],\n \"properties\": {\n \"storage\": {\n \"enum\": [\n \"filename\",\n \"frontmatter\"\n ]\n },\n \"filename_format\": {\n \"enum\": [\n \"title\",\n \"zettel\",\n \"timestamp\",\n \"uuid\",\n \"custom\"\n ]\n },\n \"custom_filename_template\": {\n \"$ref\": \"#/$defs/nonEmptyString\"\n }\n },\n \"allOf\": [\n {\n \"if\": {\n \"properties\": {\n \"filename_format\": {\n \"const\": \"custom\"\n }\n },\n \"required\": [\n \"filename_format\"\n ]\n },\n \"then\": {\n \"properties\": {\n \"custom_filename_template\": {\n \"$ref\": \"#/$defs/nonEmptyString\"\n }\n },\n \"required\": [\n \"custom_filename_template\"\n ]\n }\n }\n ],\n \"additionalProperties\": true\n },\n \"statusDefinition\": {\n \"type\": \"object\",\n \"required\": [\n \"value\",\n \"label\",\n \"color\",\n \"is_completed\",\n \"is_skipped\",\n \"exclude_from_cycle\",\n \"order\",\n \"auto_archive\",\n \"auto_archive_delay_minutes\"\n ],\n \"properties\": {\n \"value\": {\n \"$ref\": \"#/$defs/nonEmptyString\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"color\": {\n \"type\": \"string\"\n },\n \"icon\": {\n \"$ref\": \"#/$defs/nonEmptyString\"\n },\n \"is_completed\": {\n \"type\": \"boolean\"\n },\n \"is_skipped\": {\n \"type\": \"boolean\"\n },\n \"exclude_from_cycle\": {\n \"type\": \"boolean\"\n },\n \"next_status\": {\n \"$ref\": \"#/$defs/nonEmptyString\"\n },\n \"order\": {\n \"type\": \"number\"\n },\n \"auto_archive\": {\n \"type\": \"boolean\"\n },\n \"auto_archive_delay_minutes\": {\n \"type\": \"number\",\n \"minimum\": 0\n }\n },\n \"additionalProperties\": true\n },\n \"statusPolicy\": {\n \"type\": \"object\",\n \"required\": [\n \"values\",\n \"default\",\n \"completed_values\",\n \"definitions\"\n ],\n \"properties\": {\n \"values\": {\n \"$ref\": \"#/$defs/stringSet\"\n },\n \"default\": {\n \"$ref\": \"#/$defs/nonEmptyString\"\n },\n \"completed_values\": {\n \"$ref\": \"#/$defs/stringSet\"\n },\n \"skipped_values\": {\n \"$ref\": \"#/$defs/stringSet\"\n },\n \"default_skipped\": {\n \"$ref\": \"#/$defs/nonEmptyString\"\n },\n \"definitions\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/statusDefinition\"\n }\n }\n },\n \"additionalProperties\": false\n },\n \"priorityDefinition\": {\n \"type\": \"object\",\n \"required\": [\n \"value\",\n \"label\",\n \"color\",\n \"weight\"\n ],\n \"properties\": {\n \"value\": {\n \"$ref\": \"#/$defs/nonEmptyString\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"color\": {\n \"type\": \"string\"\n },\n \"icon\": {\n \"$ref\": \"#/$defs/nonEmptyString\"\n },\n \"weight\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": true\n },\n \"priorityPolicy\": {\n \"type\": \"object\",\n \"required\": [\n \"values\",\n \"default\",\n \"definitions\"\n ],\n \"properties\": {\n \"values\": {\n \"$ref\": \"#/$defs/stringSet\"\n },\n \"default\": {\n \"$ref\": \"#/$defs/nonEmptyString\"\n },\n \"definitions\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/priorityDefinition\"\n }\n }\n },\n \"additionalProperties\": false\n },\n \"recurrencePolicy\": {\n \"type\": \"object\",\n \"required\": [\n \"syntax\",\n \"maintain_due_date_offset\",\n \"reset_body_checkboxes\"\n ],\n \"properties\": {\n \"syntax\": {\n \"const\": \"tasknotes\"\n },\n \"maintain_due_date_offset\": {\n \"type\": \"boolean\"\n },\n \"reset_body_checkboxes\": {\n \"type\": \"boolean\"\n }\n },\n \"additionalProperties\": false\n },\n \"occurrencePolicy\": {\n \"type\": \"object\",\n \"required\": [\n \"identity_roles\",\n \"default_materialization\",\n \"default_next_trigger\"\n ],\n \"properties\": {\n \"identity_roles\": {\n \"const\": [\n \"recurrenceParent\",\n \"occurrenceDate\"\n ]\n },\n \"default_materialization\": {\n \"enum\": [\n \"manual\",\n \"on_completion\",\n \"rolling\"\n ]\n },\n \"default_next_trigger\": {\n \"enum\": [\n \"completion\",\n \"completion_or_skip\"\n ]\n },\n \"past_horizon\": {\n \"$ref\": \"#/$defs/nonEmptyString\"\n },\n \"future_horizon\": {\n \"$ref\": \"#/$defs/nonEmptyString\"\n }\n },\n \"additionalProperties\": false\n },\n \"linkPolicy\": {\n \"type\": \"object\",\n \"required\": [\n \"accepted_formats\",\n \"write_format\"\n ],\n \"properties\": {\n \"accepted_formats\": {\n \"type\": \"array\",\n \"minItems\": 1,\n \"uniqueItems\": true,\n \"items\": {\n \"enum\": [\n \"wikilink\",\n \"markdown\"\n ]\n }\n },\n \"write_format\": {\n \"enum\": [\n \"wikilink\",\n \"markdown\"\n ]\n }\n },\n \"additionalProperties\": false\n },\n \"archivePolicy\": {\n \"type\": \"object\",\n \"required\": [\n \"archived_tag\",\n \"move_on_archive\"\n ],\n \"properties\": {\n \"archived_tag\": {\n \"$ref\": \"#/$defs/nonEmptyString\"\n },\n \"move_on_archive\": {\n \"type\": \"boolean\"\n },\n \"folder\": {\n \"$ref\": \"#/$defs/nonEmptyString\"\n }\n },\n \"additionalProperties\": false\n },\n \"timeTrackingPolicy\": {\n \"type\": \"object\",\n \"required\": [\n \"auto_stop_on_complete\"\n ],\n \"properties\": {\n \"auto_stop_on_complete\": {\n \"type\": \"boolean\"\n }\n },\n \"additionalProperties\": false\n },\n \"templatingPolicy\": {\n \"type\": \"object\",\n \"required\": [\n \"enabled\",\n \"occurrence_enabled\"\n ],\n \"properties\": {\n \"enabled\": {\n \"type\": \"boolean\"\n },\n \"template_path\": {\n \"$ref\": \"#/$defs/nonEmptyString\"\n },\n \"occurrence_enabled\": {\n \"type\": \"boolean\"\n },\n \"occurrence_template_path\": {\n \"$ref\": \"#/$defs/nonEmptyString\"\n },\n \"failure_mode\": {\n \"enum\": [\n \"error\",\n \"warning_fallback\"\n ]\n },\n \"unknown_variable_policy\": {\n \"enum\": [\n \"preserve\",\n \"empty\"\n ]\n }\n },\n \"additionalProperties\": false\n },\n \"nlpTrigger\": {\n \"type\": \"object\",\n \"required\": [\n \"property_id\",\n \"trigger\",\n \"enabled\"\n ],\n \"properties\": {\n \"property_id\": {\n \"$ref\": \"#/$defs/nonEmptyString\"\n },\n \"trigger\": {\n \"$ref\": \"#/$defs/nonEmptyString\"\n },\n \"enabled\": {\n \"type\": \"boolean\"\n }\n },\n \"additionalProperties\": false\n },\n \"nlpPolicy\": {\n \"type\": \"object\",\n \"required\": [\n \"triggers\"\n ],\n \"properties\": {\n \"triggers\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/nlpTrigger\"\n }\n }\n },\n \"additionalProperties\": false\n }\n }\n}\n"
}
],
"provides": [
{
"id": "tasknotes.task",
- "version": "0.3.0-rc.3",
- "digest": "sha256:48b9017ac0896ffbdee4d14fc0325ef86916bf8789da4ac8a4cd246435887155"
+ "version": "0.3.0-rc.5",
+ "digest": "sha256:dde71d0d776aa0069ee627fe3c10b1a20f87ba36929a16790598ebfb4e8ebf04"
+ }
+ ]
+ },
+ {
+ "manifest": {
+ "kind": "mdbase.type-pack",
+ "id": "obsidian.base",
+ "version": "1.0.0",
+ "name": "Obsidian Bases",
+ "description": "The obsidian.base contract and an editable type that stores Obsidian Bases as records.",
+ "resources": [
+ {
+ "kind": "contract",
+ "mode": "managed",
+ "source": "contracts/obsidian.base/1.0.0.md",
+ "target": "_contracts/obsidian.base/1.0.0.md",
+ "digest": "sha256:fca77a9c845223784d4af7f5e13e2f149295621ad1b794ea9bb4d99f604467e8"
+ },
+ {
+ "kind": "type",
+ "mode": "seed",
+ "source": "types/obsidian-base/1.md",
+ "target": "_types/obsidian_base.md",
+ "digest": "sha256:bfeb3880200bc1bef7fd50b777d3f927ce931d08b4fb3c30d4cddb55feaf3f92"
+ }
+ ]
+ },
+ "resources": [
+ {
+ "source": "contracts/obsidian.base/1.0.0.md",
+ "document": "---\nkind: mdbase.contract\ncontract_type: record\nid: obsidian.base\nversion: 1.0.0\nname: Obsidian Base\ndescription: An Obsidian Bases saved-view source stored as a YAML document record.\nrecord_schema:\n dialect: json-schema-2020-12\n value:\n $schema: https://json-schema.org/draft/2020-12/schema\n type: object\n required: [views]\n properties:\n filters: {}\n formulas: { type: object }\n properties: { type: object }\n views:\n type: array\n minItems: 1\n items: { type: object, required: [type], properties: { type: { type: string }, name: { type: string } } }\n---\n\n# Obsidian Base\n\nA record exposed through `obsidian.base` is an Obsidian Bases source: global\nfilters, formulas, property metadata, and one or more views. The schema is\ndeliberately permissive. Obsidian owns the format and adds keys over time;\nunknown keys are preserved and ignored.\n\nTools that advertise `obsidian_bases_views` discover and execute these records\nthrough this contract and evaluate them with the Obsidian Bases expression\ndialect described in the [Obsidian Bases adapter](https://mdbase.dev/spec/adapters/obsidian-bases).\n\nThis artifact is passive. Implementing it grants no authority to read, execute,\nor modify any record.\n"
+ },
+ {
+ "source": "types/obsidian-base/1.md",
+ "document": "---\nkind: mdbase.type\nname: obsidian_base\nversion: 1\ndescription: Obsidian Bases saved views stored as records\nmatch:\n path_glob: '**/*.base'\nschema:\n dialect: json-schema-2020-12\n value:\n $schema: https://json-schema.org/draft/2020-12/schema\n title: Obsidian Base\n description: An Obsidian Bases file. Obsidian owns the format; unknown keys are kept.\n type: object\n required:\n - views\n properties:\n filters: {}\n formulas:\n type: object\n properties:\n type: object\n views:\n type: array\n minItems: 1\n items:\n type: object\n required:\n - type\n properties:\n type:\n type: string\n name:\n type: string\nimplements:\n - contract: obsidian.base\n version: 1.0.0\n fields:\n filters: filters\n formulas: formulas\n properties: properties\n views: views\n---\n\n# Obsidian Base\n\nMakes `.base` files discoverable as saved views through the `obsidian.base`\ncontract. It takes effect when the collection lists `base` in\n`settings.record_extensions`; narrow the `path_glob` to the folders that hold\nyour Bases. Edit Bases with whole-document replacement so Obsidian's comments\nand layout survive.\n"
+ }
+ ],
+ "provides": [
+ {
+ "id": "obsidian.base",
+ "version": "1.0.0",
+ "digest": "sha256:37e8a0bfb32bb4795c1b3c5dec613c32429aaa765dc33e4adc0c627a48f5c1ff"
}
]
}
@@ -105,6 +190,18 @@
"operation": "set_add",
"path": "/x-obsidian/bases/include",
"value": "TaskNotes/Views/**/*.base"
+ },
+ {
+ "requirement": "tasknotes-planner-markdown-records",
+ "operation": "set_add",
+ "path": "/settings/record_extensions",
+ "value": "md"
+ },
+ {
+ "requirement": "tasknotes-planner-base-records",
+ "operation": "set_add",
+ "path": "/settings/record_extensions",
+ "value": "base"
}
]
}
diff --git a/public/404.html b/public/404.html
new file mode 100644
index 0000000..e98c13d
--- /dev/null
+++ b/public/404.html
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+ Page not found · TaskNotes Planner
+
+
+
+
+
+ 404
+ Page not found
+ There is nothing at this address.
+ Open TaskNotes Planner
+
+
+
diff --git a/public/_redirects b/public/_redirects
deleted file mode 100644
index 7797f7c..0000000
--- a/public/_redirects
+++ /dev/null
@@ -1 +0,0 @@
-/* /index.html 200
diff --git a/scripts/canonical-task-pack.mjs b/scripts/canonical-task-pack.mjs
index a59232e..b973df6 100644
--- a/scripts/canonical-task-pack.mjs
+++ b/scripts/canonical-task-pack.mjs
@@ -3,14 +3,14 @@ import { readFile } from "node:fs/promises";
import { resolve } from "node:path";
export const TASKNOTES_CONTRACT_CATALOG_URL =
- "https://mdbase.dev/contracts/packs/tasknotes.task/0.3.0-rc.12.json";
+ "https://mdbase.dev/contracts/packs/tasknotes.task/0.3.0-rc.18.json";
export const TASKNOTES_CONTRACT_CATALOG_DIGEST =
- "sha256:b1a051354b5af28c2a623f3b01db0d0d463c944605daf2c4c30069fcb99d3ce5";
-export const TASKNOTES_TYPE_PACK_VERSION = "0.3.0-rc.12";
+ "sha256:9a9ebc26e6f63ad2fc3d92f87d38f6c140a3af90408de47d667ae7b9ba0dc9ef";
+export const TASKNOTES_TYPE_PACK_VERSION = "0.3.0-rc.18";
export const TASKNOTES_CONTRACT_VENDOR_PATH = resolve(
process.cwd(),
- "vendor/mdbase-contracts/tasknotes.task-0.3.0-rc.12.json",
+ "vendor/mdbase-contracts/tasknotes.task-0.3.0-rc.18.json",
);
export async function loadCanonicalTaskNotesTypePack() {
@@ -32,3 +32,36 @@ export async function loadCanonicalTaskNotesTypePack() {
}
return provision;
}
+
+// Planner lists and runs Obsidian Bases views; discovery needs the obsidian.base
+// contract installed in the collection, so the app provisions its canonical pack.
+export const BASES_CONTRACT_CATALOG_URL =
+ "https://mdbase.dev/contracts/packs/obsidian.base/1.0.0.json";
+export const BASES_CONTRACT_CATALOG_DIGEST =
+ "sha256:8251b351a4b00c4ea3f4d49988ae45ab52ceaf2420f57ce8105ca4cfe5eafd50";
+export const BASES_TYPE_PACK_VERSION = "1.0.0";
+
+export const BASES_CONTRACT_VENDOR_PATH = resolve(
+ process.cwd(),
+ "vendor/mdbase-contracts/obsidian.base-1.0.0.json",
+);
+
+export async function loadCanonicalBasesTypePack() {
+ const document = await readFile(BASES_CONTRACT_VENDOR_PATH, "utf8");
+ const digest = `sha256:${createHash("sha256").update(document).digest("hex")}`;
+ if (digest !== BASES_CONTRACT_CATALOG_DIGEST) {
+ throw new Error(
+ `The vendored Obsidian Bases catalog provision has digest ${digest}; expected ${BASES_CONTRACT_CATALOG_DIGEST}.`,
+ );
+ }
+ const provision = JSON.parse(document);
+ if (
+ provision.manifest?.id !== "obsidian.base" ||
+ provision.manifest?.version !== BASES_TYPE_PACK_VERSION
+ ) {
+ throw new Error(
+ "The vendored Obsidian Bases catalog provision has the wrong identity.",
+ );
+ }
+ return provision;
+}
diff --git a/scripts/deploy-pages-dev.mjs b/scripts/deploy-pages-dev.mjs
index f2d2bf9..de20498 100644
--- a/scripts/deploy-pages-dev.mjs
+++ b/scripts/deploy-pages-dev.mjs
@@ -3,16 +3,13 @@ import { readFile, unlink, writeFile } from "node:fs/promises";
import { resolve } from "node:path";
import { verifyPlannerBuild } from "./verify-build.mjs";
+import { plannerDeploymentFor } from "./deployment-environment.mjs";
-const deployment = Object.freeze({
- appOrigin: "https://staging.tasknotes-planner.pages.dev",
- connectOrigin: "https://connect-staging.mdbase.dev",
- loopbackOrigin: "http://127.0.0.1:28486",
- branch: "staging",
-});
+const deployment = plannerDeploymentFor(process.env);
const environment = {
...process.env,
TASKNOTES_PLANNER_URL: deployment.appOrigin,
+ ...(deployment.branch === "lab" ? {VITE_MDBASE_ENV:"lab"} : {}),
VITE_MDBASE_CONNECT_URL: deployment.connectOrigin,
VITE_MDBASE_CONNECT_LOOPBACK_URL: deployment.loopbackOrigin,
};
@@ -39,7 +36,7 @@ await run("node", ["scripts/production-smoke.mjs"], {
TASKNOTES_PRODUCTION_URL: deployment.appOrigin,
MDBASE_CONNECT_ORIGIN: deployment.connectOrigin,
});
-console.log(`Planner staging deployment is healthy: ${deployment.appOrigin}/`);
+console.log(`Planner ${deployment.branch} deployment is healthy: ${deployment.appOrigin}/`);
async function buildWithTemporaryManifest(env, verify) {
const targets = [
diff --git a/scripts/deployment-environment.mjs b/scripts/deployment-environment.mjs
new file mode 100644
index 0000000..5bc5edb
--- /dev/null
+++ b/scripts/deployment-environment.mjs
@@ -0,0 +1,10 @@
+const deployments = Object.freeze({
+ staging: Object.freeze({appOrigin:"https://staging.tasknotes-planner.pages.dev",connectOrigin:"https://connect-staging.mdbase.dev",loopbackOrigin:"http://127.0.0.1:28486",branch:"staging"}),
+ lab: Object.freeze({appOrigin:"https://lab.tasknotes-planner.pages.dev",connectOrigin:"https://connect-lab.mdbase.dev",loopbackOrigin:"http://127.0.0.1:28487",branch:"lab"}),
+});
+/** Preserve the existing staging default; LAB requires the literal selector. */
+export function plannerDeploymentFor(environment) {
+ const target=environment.MDBASE_ENV??"staging";
+ if(!Object.hasOwn(deployments,target))throw new Error("Unsupported Planner development deployment target.");
+ return deployments[target];
+}
diff --git a/scripts/deployment-environment.node-test.mjs b/scripts/deployment-environment.node-test.mjs
new file mode 100644
index 0000000..efd6157
--- /dev/null
+++ b/scripts/deployment-environment.node-test.mjs
@@ -0,0 +1,28 @@
+import assert from "node:assert/strict";
+import { test } from "node:test";
+import { readFileSync } from "node:fs";
+import { plannerDeploymentFor } from "./deployment-environment.mjs";
+test("Planner LAB is an explicit fixed target; prior staging default is unchanged", () => {
+ assert.deepEqual(plannerDeploymentFor({ MDBASE_ENV: "lab" }), {
+ appOrigin: "https://lab.tasknotes-planner.pages.dev",
+ connectOrigin: "https://connect-lab.mdbase.dev",
+ loopbackOrigin: "http://127.0.0.1:28487",
+ branch: "lab",
+ });
+ assert.equal(plannerDeploymentFor({}).branch, "staging");
+ assert.equal(
+ plannerDeploymentFor({ MDBASE_ENV: "staging" }).connectOrigin,
+ "https://connect-staging.mdbase.dev",
+ );
+ for (const MDBASE_ENV of ["production", "unknown", ""])
+ assert.throws(() => plannerDeploymentFor({ MDBASE_ENV }));
+});
+test("deploy:lab uses the same guarded front door with a fixed LAB selector", () => {
+ const pkg = JSON.parse(
+ readFileSync(new URL("../package.json", import.meta.url), "utf8"),
+ );
+ assert.equal(
+ pkg.scripts["deploy:lab"],
+ "MDBASE_ENV=lab node scripts/deploy-pages-dev.mjs",
+ );
+});
diff --git a/scripts/planner-manifest.mjs b/scripts/planner-manifest.mjs
index 8d974f5..59e8d03 100644
--- a/scripts/planner-manifest.mjs
+++ b/scripts/planner-manifest.mjs
@@ -1,6 +1,9 @@
import { parseAppManifest } from "@mdbase-dev/connect-protocol/manifest";
-import { loadCanonicalTaskNotesTypePack } from "./canonical-task-pack.mjs";
+import {
+ loadCanonicalBasesTypePack,
+ loadCanonicalTaskNotesTypePack,
+} from "./canonical-task-pack.mjs";
export { TASKNOTES_TYPE_PACK_VERSION } from "./canonical-task-pack.mjs";
@@ -20,6 +23,12 @@ export async function buildPlannerManifest({ appUrl, development = false }) {
);
if (!taskContract)
throw new Error("TaskNotes pack provides no task contract.");
+ const basesPack = await loadCanonicalBasesTypePack();
+ const basesContract = basesPack.provides.find(
+ (contract) => contract.id === "obsidian.base",
+ );
+ if (!basesContract)
+ throw new Error("Obsidian Bases pack provides no obsidian.base contract.");
const manifest = {
manifest_version: 1,
id: "dev.tasknotes.planner",
@@ -28,12 +37,18 @@ export async function buildPlannerManifest({ appUrl, development = false }) {
icon: `${origin}/tasknotes-mark.svg`,
redirect_uris: redirectUris,
requirements: {
- contracts: [taskContract],
+ contracts: [taskContract, basesContract],
capabilities: {
contract_version: 2,
required: [...requiredCapabilities],
},
access: "full_collection",
+ // Next accounts approve each record capability together with its file
+ // actions: reading needs list and read, editing needs replace and move.
+ files: {
+ required: ["list", "read", "replace", "move"],
+ scope: { kind: "collection" },
+ },
configuration: [
{
id: "tasknotes-planner-base-sources",
@@ -41,10 +56,24 @@ export async function buildPlannerManifest({ appUrl, development = false }) {
predicate: "contains",
value: "TaskNotes/Views/**/*.base",
},
+ // The canonical obsidian.base type stores YAML document records.
+ // record_extensions is a complete set: retain Markdown explicitly.
+ {
+ id: "tasknotes-planner-markdown-records",
+ path: "/settings/record_extensions",
+ predicate: "contains",
+ value: "md",
+ },
+ {
+ id: "tasknotes-planner-base-records",
+ path: "/settings/record_extensions",
+ predicate: "contains",
+ value: "base",
+ },
],
},
provisions: {
- type_packs: [typePack],
+ type_packs: [typePack, basesPack],
configuration: [
{
requirement: "tasknotes-planner-base-sources",
@@ -52,6 +81,18 @@ export async function buildPlannerManifest({ appUrl, development = false }) {
path: "/x-obsidian/bases/include",
value: "TaskNotes/Views/**/*.base",
},
+ {
+ requirement: "tasknotes-planner-markdown-records",
+ operation: "set_add",
+ path: "/settings/record_extensions",
+ value: "md",
+ },
+ {
+ requirement: "tasknotes-planner-base-records",
+ operation: "set_add",
+ path: "/settings/record_extensions",
+ value: "base",
+ },
],
},
};
diff --git a/scripts/planner-manifest.test.mjs b/scripts/planner-manifest.test.mjs
index acc2908..5898e36 100644
--- a/scripts/planner-manifest.test.mjs
+++ b/scripts/planner-manifest.test.mjs
@@ -26,12 +26,16 @@ describe("Planner mdbase manifest", () => {
"definitions.manage",
],
},
+ files: {
+ required: ["list", "read", "replace", "move"],
+ scope: { kind: "collection" },
+ },
});
- expect(manifest.provisions.type_packs).toHaveLength(1);
+ expect(manifest.provisions.type_packs).toHaveLength(2);
expect(manifest.provisions.type_packs[0].manifest.version).toBe(
TASKNOTES_TYPE_PACK_VERSION,
);
- expect(TASKNOTES_TYPE_PACK_VERSION).toBe("0.3.0-rc.12");
+ expect(TASKNOTES_TYPE_PACK_VERSION).toBe("0.3.0-rc.18");
expect(manifest.provisions.type_packs[0]).toMatchObject({
manifest: {
id: "tasknotes.task",
@@ -48,13 +52,58 @@ describe("Planner mdbase manifest", () => {
}),
]),
},
- provides: manifest.requirements.contracts,
+ provides: [manifest.requirements.contracts[0]],
+ });
+ // Bases discovery needs obsidian.base installed: required and provisioned.
+ expect(manifest.requirements.contracts.map(({ id }) => id)).toEqual([
+ "tasknotes.task",
+ "obsidian.base",
+ ]);
+ expect(manifest.provisions.type_packs[1]).toMatchObject({
+ manifest: { id: "obsidian.base", version: "1.0.0" },
+ provides: [manifest.requirements.contracts[1]],
});
+ expect(manifest.requirements.configuration).toEqual([
+ {
+ id: "tasknotes-planner-base-sources",
+ path: "/x-obsidian/bases/include",
+ predicate: "contains",
+ value: "TaskNotes/Views/**/*.base",
+ },
+ {
+ id: "tasknotes-planner-markdown-records",
+ path: "/settings/record_extensions",
+ predicate: "contains",
+ value: "md",
+ },
+ {
+ id: "tasknotes-planner-base-records",
+ path: "/settings/record_extensions",
+ predicate: "contains",
+ value: "base",
+ },
+ ]);
+ // Fresh collections default to Markdown: Bases must be declared as record
+ // extensions, not uploaded as opaque files. Preserve Markdown explicitly.
expect(manifest.provisions.configuration).toEqual([
- expect.objectContaining({
+ {
requirement: "tasknotes-planner-base-sources",
operation: "set_add",
- }),
+ path: "/x-obsidian/bases/include",
+ value: "TaskNotes/Views/**/*.base",
+ },
+ {
+ requirement: "tasknotes-planner-markdown-records",
+ operation: "set_add",
+ path: "/settings/record_extensions",
+ value: "md",
+ },
+ {
+ requirement: "tasknotes-planner-base-records",
+ operation: "set_add",
+ path: "/settings/record_extensions",
+ value: "base",
+ },
]);
});
diff --git a/scripts/planner-sdk-session.test.mjs b/scripts/planner-sdk-session.test.mjs
index e9c8743..4cd115e 100644
--- a/scripts/planner-sdk-session.test.mjs
+++ b/scripts/planner-sdk-session.test.mjs
@@ -40,6 +40,10 @@ async function fixture({
displayName: "Fixture",
operations,
scope: { access: "full_collection", contracts: [] },
+ fileCapability: {
+ actions: [...manifest.requirements.files.required],
+ scope: manifest.requirements.files.scope,
+ },
authority: { kind: "connector", durability: "computer" },
route: "relay",
directAccess: "unavailable",
diff --git a/scripts/verify-build.mjs b/scripts/verify-build.mjs
index fd51488..ce8efcd 100644
--- a/scripts/verify-build.mjs
+++ b/scripts/verify-build.mjs
@@ -21,6 +21,20 @@ export async function verifyPlannerBuild({
throw new Error(`Planner manifest does not declare ${appOrigin}.`);
await readFile(resolve(root, "auth", "mdbase", "callback", "index.html"));
+ // Only real routes reach the app shell; unknown paths get a real 404.
+ const redirects = (await readFile(resolve(root, "_redirects"), "utf8"))
+ .trim()
+ .split("\n");
+ if (
+ !redirects.includes("/auth/mdbase/callback / 200") ||
+ redirects.some(
+ (rule) => /^\/\*\s/.test(rule) || /\s\/index(\.html)?\b/.test(rule),
+ )
+ )
+ throw new Error("Planner _redirects must list only real routes.");
+ const notFound = await readFile(resolve(root, "404.html"), "utf8");
+ if (!notFound.includes("Page not found") || notFound.includes('id="root"'))
+ throw new Error("Planner 404.html must be the not-found page.");
const scripts = (await readdir(resolve(root, "assets")))
.filter((file) => file.endsWith(".js"))
.map((file) => resolve(root, "assets", file));
diff --git a/scripts/write-static-routes.mjs b/scripts/write-static-routes.mjs
index e486342..ca59023 100644
--- a/scripts/write-static-routes.mjs
+++ b/scripts/write-static-routes.mjs
@@ -1,4 +1,4 @@
-import { copyFile, mkdir } from "node:fs/promises";
+import { copyFile, mkdir, writeFile } from "node:fs/promises";
import { resolve } from "node:path";
const dist = resolve(import.meta.dirname, "..", "dist");
@@ -6,7 +6,13 @@ const index = resolve(dist, "index.html");
const callback = resolve(dist, "auth", "mdbase", "callback");
await mkdir(callback, { recursive: true });
-await Promise.all([
- copyFile(index, resolve(dist, "404.html")),
- copyFile(index, resolve(callback, "index.html")),
-]);
+await copyFile(index, resolve(callback, "index.html"));
+
+/** Planner's only client route besides `/` is the sign-in callback (views are
+ * query parameters). Pages applies _redirects before static files, and a
+ * rewrite to `/index.html` would loop, so it points at `/`. Files are served as
+ * they are; any other path gets public/404.html with a 404 status. */
+await writeFile(
+ resolve(dist, "_redirects"),
+ "/auth/mdbase/callback / 200\n/auth/mdbase/callback/ / 200\n",
+);
diff --git a/src/components/app.test.tsx b/src/components/app.test.tsx
new file mode 100644
index 0000000..6e679fa
--- /dev/null
+++ b/src/components/app.test.tsx
@@ -0,0 +1,74 @@
+import { cleanup, fireEvent, render, screen } from "@testing-library/react";
+import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
+
+import { App } from "./app";
+
+// Only the connection-screen boundary is a UI stand-in. The existing sample
+// repository and Planner renderer are real; no legacy session/snapshot fixture.
+vi.mock("./connection-gate", () => ({
+ ConnectionGate: ({ onDemo }: { onDemo(): void }) => (
+ Use sample tasks
+ ),
+}));
+
+const originalScrollTo = Object.getOwnPropertyDescriptor(
+ HTMLElement.prototype,
+ "scrollTo",
+);
+beforeEach(() => {
+ vi.stubGlobal(
+ "matchMedia",
+ vi.fn(() => ({ matches: false })),
+ );
+ HTMLElement.prototype.scrollTo = vi.fn();
+});
+
+afterEach(() => {
+ cleanup();
+ vi.unstubAllGlobals();
+ if (originalScrollTo)
+ Object.defineProperty(HTMLElement.prototype, "scrollTo", originalScrollTo);
+ else Reflect.deleteProperty(HTMLElement.prototype, "scrollTo");
+ history.replaceState(null, "", "/");
+});
+
+describe("first-run sample plan navigation", () => {
+ it("labels the real sample and preserves unrelated URL state when leaving a demo link", async () => {
+ history.replaceState(
+ { original: true },
+ "",
+ "/?demo=1&keep=original#context",
+ );
+ const view = render( );
+ fireEvent.click(
+ await screen.findByRole("button", { name: "Sample tasks" }),
+ );
+ expect(
+ await screen.findByRole("button", { name: "Use sample tasks" }),
+ ).toBeTruthy();
+ expect(new URL(location.href).searchParams.has("demo")).toBe(false);
+ expect(new URL(location.href).searchParams.get("keep")).toBe("original");
+ expect(location.hash).toBe("#context");
+ expect(history.state).toEqual({ original: true });
+ view.unmount();
+ render( );
+ expect(
+ await screen.findByRole("button", { name: "Use sample tasks" }),
+ ).toBeTruthy();
+ expect(screen.queryByRole("button", { name: "Sample tasks" })).toBeNull();
+ });
+ it("can enter and leave samples from the ordinary first-run action", async () => {
+ history.replaceState(null, "", "/?keep=original");
+ render( );
+ fireEvent.click(
+ await screen.findByRole("button", { name: "Use sample tasks" }),
+ );
+ fireEvent.click(
+ await screen.findByRole("button", { name: "Sample tasks" }),
+ );
+ expect(
+ await screen.findByRole("button", { name: "Use sample tasks" }),
+ ).toBeTruthy();
+ expect(location.search).toBe("?keep=original");
+ });
+});
diff --git a/src/components/app.tsx b/src/components/app.tsx
index c238b7a..9e8e622 100644
--- a/src/components/app.tsx
+++ b/src/components/app.tsx
@@ -1,19 +1,32 @@
-import { useState } from "react";
+import { lazy, Suspense } from "react";
import { DemoPlannerRepository } from "../data/demo-repository";
-import { ConnectionGate } from "./connection-gate";
import { Planner } from "./planner";
+import { useSampleMode } from "./use-sample-mode";
+// Native mode must not instantiate the legacy Connect session or selection.
+const ConnectionGate = lazy(async () => {
+ const module = await import("./connection-gate");
+ return { default: module.ConnectionGate };
+});
+
+/** Planner over legacy Connect (non-LAB builds). LAB builds use `SdkApp`. */
export function App() {
- const [demo, setDemo] = useState(
- () => new URL(location.href).searchParams.get("demo") === "1",
- );
+ const { demo, enter, leave } = useSampleMode();
return demo ? (
setDemo(false)}
+ onChangeCollection={leave}
/>
) : (
- setDemo(true)} />
+
+ Opening Planner…
+
+ }
+ >
+
+
);
}
diff --git a/src/components/connection-gate.tsx b/src/components/connection-gate.tsx
index 977c8e4..66697d6 100644
--- a/src/components/connection-gate.tsx
+++ b/src/components/connection-gate.tsx
@@ -23,11 +23,32 @@ import {
import { MdbasePlannerRepository } from "../data/mdbase-repository";
import { errorMessage, requireOutcome } from "../data/outcome";
import { Planner } from "./planner";
+import { NativeSignIn } from "./native-signin";
+import type { createNativeSignIn } from "../data/native-signin-ui";
const START_TIMEOUT_MS = 20_000;
const CALLBACK_START_TIMEOUT_MS = 60_000;
-export function ConnectionGate({ onDemo }: { onDemo(): void }) {
+export function ConnectionGate({
+ onDemo,
+ nativeSignIn,
+}: {
+ onDemo(): void;
+ nativeSignIn?: {
+ binding: ReturnType;
+ onSignedOut(): void;
+ };
+}) {
+ // Real native composition supplies authenticated build inputs and owns the SDK
+ // lifetime. Until delivered, preserve the existing default runtime unchanged.
+ return nativeSignIn ? (
+
+ ) : (
+
+ );
+}
+
+function LegacyConnectionGate({ onDemo }: { onDemo(): void }) {
const snapshot = useSyncExternalStore(
(listener) => plannerSession.subscribe(listener),
() => plannerSession.getSnapshot(),
diff --git a/src/components/connection-notice.test.ts b/src/components/connection-notice.test.ts
new file mode 100644
index 0000000..e7e42e1
--- /dev/null
+++ b/src/components/connection-notice.test.ts
@@ -0,0 +1,32 @@
+import { expect, it } from "vitest";
+import { connectionNotice } from "./connection-notice";
+
+const ready = { phase: { kind: "ready" } } as const;
+const sync = (health: string | null, live: boolean | null = true) =>
+ ({ kind: "synced", health, live }) as never;
+
+it("never reads as connected while offline, reconnecting or holding changes", () => {
+ expect(connectionNotice({ ...ready, sync: sync(null) } as never)).toBeNull();
+ expect(connectionNotice({ ...ready, sync: sync(null) } as never, false)).toBe(
+ "offline",
+ );
+ expect(connectionNotice({ ...ready, sync: sync("offline") } as never)).toBe(
+ "offline",
+ );
+ expect(
+ connectionNotice({ ...ready, sync: sync("unreachable") } as never),
+ ).toBe("reconnecting");
+ expect(connectionNotice({ ...ready, sync: sync(null, false) } as never)).toBe(
+ "reconnecting",
+ );
+ expect(
+ connectionNotice({
+ ...ready,
+ sync: sync("offline"),
+ writes: { saveState: "saved_on_device" },
+ } as never),
+ ).toBe("saved_on_device");
+ expect(
+ connectionNotice({ phase: { kind: "opening" }, live: false } as never),
+ ).toBeNull();
+});
diff --git a/src/components/connection-notice.ts b/src/components/connection-notice.ts
new file mode 100644
index 0000000..b88329e
--- /dev/null
+++ b/src/components/connection-notice.ts
@@ -0,0 +1,78 @@
+import { useCallback, useSyncExternalStore } from "react";
+import type { MdbaseSnapshot } from "@mdbase-dev/sdk";
+
+/**
+ * What the open collection's connection needs to say, from the SDK's own
+ * status: nothing while it is connected and live.
+ * - saved_on_device: changes are kept on this device until they can sync;
+ * - offline: this device has no network;
+ * - reconnecting: the sync service cannot be reached, or other devices'
+ * changes have stopped arriving live.
+ */
+export type ConnectionNotice = "offline" | "reconnecting" | "saved_on_device";
+
+export const connectionNoticeLabels: Record = {
+ offline: "Offline",
+ reconnecting: "Reconnecting",
+ saved_on_device: "Saved on this device; waiting for sync",
+};
+
+type Observed = Partial<
+ Pick
+>;
+
+export function connectionNotice(
+ snapshot: Observed | null | undefined,
+ online = true,
+): ConnectionNotice | null {
+ if (!snapshot || (snapshot.phase && snapshot.phase.kind !== "ready"))
+ return null;
+ if (snapshot.writes?.saveState === "saved_on_device")
+ return "saved_on_device";
+ const health = snapshot.sync?.health ?? snapshot.transport?.kind ?? null;
+ if (!online || health === "offline") return "offline";
+ if (
+ health === "unreachable" ||
+ health === "server_busy" ||
+ health === "rate_limited" ||
+ snapshot.sync?.kind === "offline" ||
+ (snapshot.sync?.live ?? snapshot.live) === false
+ )
+ return "reconnecting";
+ return null;
+}
+
+const noSource = {
+ getSnapshot: () => null,
+ subscribe: () => () => undefined,
+};
+
+/** The connection notice for an SDK entry, following its snapshots and the
+ * browser's online state. */
+export function useConnectionNotice(
+ source:
+ | {
+ getSnapshot(): Observed;
+ subscribe(listener: () => void): () => void;
+ }
+ | null
+ | undefined,
+): ConnectionNotice | null {
+ const entry = source ?? noSource;
+ const subscribe = useCallback(
+ (listener: () => void) => {
+ const stop = entry.subscribe(listener);
+ window.addEventListener("online", listener);
+ window.addEventListener("offline", listener);
+ return () => {
+ stop();
+ window.removeEventListener("online", listener);
+ window.removeEventListener("offline", listener);
+ };
+ },
+ [entry],
+ );
+ const read = () =>
+ connectionNotice(entry.getSnapshot(), globalThis.navigator?.onLine ?? true);
+ return useSyncExternalStore(subscribe, read, read);
+}
diff --git a/src/components/gantt-chart.test.tsx b/src/components/gantt-chart.test.tsx
index 2df87c3..cb4cf88 100644
--- a/src/components/gantt-chart.test.tsx
+++ b/src/components/gantt-chart.test.tsx
@@ -31,6 +31,106 @@ beforeEach(() => {
});
describe("GanttChart interactions", () => {
+ it("uses the responsive row height for ledger rows, timeline body and dependency endpoints", () => {
+ const readStyle = getComputedStyle;
+ const styleSpy = vi
+ .spyOn(globalThis, "getComputedStyle")
+ .mockImplementation((element) => {
+ const style = readStyle(element);
+ const readProperty = style.getPropertyValue.bind(style);
+ style.getPropertyValue = (name) =>
+ name === "--task-row-height" ? "65px" : readProperty(name);
+ return style;
+ });
+ try {
+ const first = makeTask({
+ id: "first",
+ scheduled: "2026-08-17",
+ due: "2026-08-18",
+ });
+ const second = makeTask({
+ id: "second",
+ scheduled: "2026-08-19",
+ due: "2026-08-20",
+ blockedBy: [{ uid: "first", reltype: "FINISHTOSTART" }],
+ });
+ const tasks = [first, second];
+ const view = render(
+ undefined}
+ onZoom={() => undefined}
+ onScheduleChange={vi.fn().mockResolvedValue(undefined)}
+ onDependenciesChange={vi.fn().mockResolvedValue(undefined)}
+ onCompletionChange={vi.fn().mockResolvedValue(undefined)}
+ />,
+ );
+ for (const row of view.container.querySelectorAll(".task-row")) {
+ expect(row).toHaveStyle({ height: "65px" });
+ }
+ expect(view.container.querySelector(".gantt-body")).toHaveStyle({
+ height: "165px",
+ });
+ expect(view.container.querySelector(".dependency-layer")).toHaveAttribute(
+ "height",
+ "165",
+ );
+ const path = view.container.querySelector(".dependency-layer > path");
+ expect(path?.getAttribute("d")).toContain("67.5");
+ expect(path?.getAttribute("d")).toContain("132.5");
+ } finally {
+ styleSpy.mockRestore();
+ }
+ });
+
+ it("flags imported reversed dates without presenting them as a valid range", () => {
+ const task = Object.freeze(
+ makeTask({
+ title: "Imported inversion",
+ scheduled: "2026-11-02",
+ due: "2026-10-29",
+ }),
+ );
+ const onSelect = vi.fn();
+ const onScheduleChange = vi.fn();
+ const view = render(
+ ,
+ );
+ const warning = screen.getByText("Scheduled after due");
+ expect(warning).toHaveAttribute(
+ "title",
+ "Scheduled Nov 2; due Oct 29. Scheduled is after the due date",
+ );
+ expect(screen.queryByText("Nov 2 — Oct 29")).not.toBeInTheDocument();
+ const ledger = view.container.querySelector(".task-ledger-main")!;
+ expect(ledger).toHaveAccessibleName(
+ /Imported inversion, Scheduled Nov 2; due Oct 29.*Scheduled is after the due date/,
+ );
+ expect(view.container.querySelector(".task-bar-main")).toHaveAccessibleName(
+ /Scheduled is after the due date/,
+ );
+ fireEvent.click(ledger);
+ expect(onSelect).toHaveBeenCalledWith(task);
+ expect(onScheduleChange).not.toHaveBeenCalled();
+ expect(task.scheduled).toBe("2026-11-02");
+ expect(task.due).toBe("2026-10-29");
+ });
+
it("gates timeline writes while keeping task selection available", async () => {
const task = makeTask({
id: "blocked",
@@ -163,6 +263,102 @@ describe("GanttChart interactions", () => {
expect(onZoom).not.toHaveBeenCalled();
});
+ it.each([
+ { target: "date header", clientX: 420, clientY: 50, saves: true },
+ { target: "task ledger", clientX: 120, clientY: 250, saves: false },
+ { target: "toolbar", clientX: 420, clientY: -10, saves: false },
+ ])(
+ "handles unscheduled title drops over the $target",
+ async ({ clientX, clientY, saves }) => {
+ const task = makeTask({ id: "title-drag", title: "Unscheduled title" });
+ const onScheduleChange = vi.fn().mockResolvedValue(undefined);
+ const onSelect = vi.fn();
+ render(
+ undefined}
+ />,
+ );
+ const surface = document.querySelector(".gantt-scroll")!;
+ vi.spyOn(surface, "getBoundingClientRect").mockReturnValue({
+ left: 0,
+ top: 0,
+ right: 1200,
+ bottom: 900,
+ width: 1200,
+ height: 900,
+ } as DOMRect);
+ vi.spyOn(
+ document.querySelector(".timeline-row")!,
+ "getBoundingClientRect",
+ ).mockReturnValue({ left: 350 } as DOMRect);
+ const title = screen.getByRole("button", {
+ name: /Unscheduled title, not scheduled. Select to edit or drag/,
+ });
+ fireEvent.pointerDown(title, {
+ button: 0,
+ clientX: 160,
+ clientY: 250,
+ pointerId: 1,
+ });
+ fireEvent.pointerMove(window, { clientX, clientY, pointerId: 1 });
+ fireEvent.pointerUp(window, { clientX, clientY, pointerId: 1 });
+ fireEvent.click(title);
+ expect(onSelect).not.toHaveBeenCalled();
+ if (saves) {
+ await waitFor(() => expect(onScheduleChange).toHaveBeenCalledOnce());
+ expect(onScheduleChange.mock.calls[0]).toEqual([
+ task,
+ {
+ due: undefined,
+ scheduled: expect.stringMatching(/^\d{4}-\d{2}-\d{2}$/),
+ },
+ ]);
+ } else {
+ expect(onScheduleChange).not.toHaveBeenCalled();
+ expect(screen.getByRole("status")).toHaveTextContent(
+ "Schedule unchanged. Drop over a date in the timeline to schedule this task.",
+ );
+ }
+ },
+ );
+
+ it("keeps an unscheduled title click as task selection", () => {
+ const task = makeTask({ id: "title-click", title: "Unscheduled title" });
+ const onScheduleChange = vi.fn();
+ const onSelect = vi.fn();
+ render(
+ undefined}
+ />,
+ );
+ const title = screen.getByRole("button", {
+ name: /Unscheduled title, not scheduled/,
+ });
+ fireEvent.pointerDown(title, { button: 0, clientX: 160, pointerId: 1 });
+ fireEvent.pointerUp(window, { clientX: 160, pointerId: 1 });
+ fireEvent.click(title);
+ expect(onSelect).toHaveBeenCalledWith(task);
+ expect(onScheduleChange).not.toHaveBeenCalled();
+ });
+
it("places an unscheduled task on the timeline by dragging", async () => {
const task = makeTask({ id: "unscheduled", title: "Unscheduled" });
const onScheduleChange = vi.fn().mockResolvedValue(undefined);
diff --git a/src/components/gantt-chart.tsx b/src/components/gantt-chart.tsx
index 3f948f7..0d259b5 100644
--- a/src/components/gantt-chart.tsx
+++ b/src/components/gantt-chart.tsx
@@ -23,6 +23,7 @@ import {
dateLabel,
dependencyRelationship,
groupTasks,
+ hasInvertedSchedule,
minuteToPlanningValue,
planningMinute,
resolveDependencyTask,
@@ -57,6 +58,7 @@ interface ScheduleDrag {
timelineLeft: number;
update: ScheduleUpdate;
changed: boolean;
+ validPlacement: boolean;
}
interface SchedulePreview {
@@ -129,6 +131,7 @@ export function GanttChart({
() => new Set(),
);
const [timelineViewportWidth, setTimelineViewportWidth] = useState(0);
+ const [taskHeight, setTaskHeight] = useState(TASK_HEIGHT);
const today = dateFromDate(new Date());
const now = new Date();
const scale = useMemo(
@@ -140,7 +143,7 @@ export function GanttChart({
const timelineWidth = scale.days.length * scale.cellWidth;
const bodyHeight = rows.reduce(
(height, row) =>
- height + (row.kind === "group" ? GROUP_HEIGHT : TASK_HEIGHT),
+ height + (row.kind === "group" ? GROUP_HEIGHT : taskHeight),
0,
);
const scaleStartMinute = planningMinute(scale.start)!;
@@ -158,6 +161,7 @@ export function GanttChart({
if (!surface) return;
const updateWidth = () => {
const width = Math.max(0, surface.clientWidth - taskColumnWidth(surface));
+ setTaskHeight(taskRowHeight(surface));
setTimelineViewportWidth((current) =>
Math.abs(current - width) < 1 ? current : width,
);
@@ -167,7 +171,7 @@ export function GanttChart({
const observer = new ResizeObserver(updateWidth);
observer.observe(surface);
return () => observer.disconnect();
- }, []);
+ }, [rows.length]);
useLayoutEffect(() => {
const surface = scroller.current;
@@ -321,7 +325,9 @@ export function GanttChart({
kind: ScheduleDragKind,
) {
if (event.button !== 0) return;
- const timeline = event.currentTarget.closest(".timeline-row");
+ const timeline = event.currentTarget
+ .closest(".gantt-row")
+ ?.querySelector(".timeline-row");
if (!timeline) return;
event.preventDefault();
event.stopPropagation();
@@ -333,13 +339,14 @@ export function GanttChart({
timelineLeft: timeline.getBoundingClientRect().left,
update: { scheduled: task.scheduled, due: task.due },
changed: false,
+ validPlacement: false,
};
window.addEventListener("pointermove", moveWindowScheduleDrag);
window.addEventListener("pointerup", endWindowScheduleDrag);
window.addEventListener("pointercancel", cancelWindowScheduleDrag);
}
- function moveScheduleDrag(event: { clientX: number }) {
+ function moveScheduleDrag(event: { clientX: number; clientY?: number }) {
const current = scheduleDrag.current;
if (!current) return;
const rawDelta =
@@ -351,9 +358,28 @@ export function GanttChart({
const delta = Math.round(rawDelta / step) * step;
const moved = Math.abs(event.clientX - current.originClientX) >= 4;
let update = current.update;
+ let validPlacement = current.validPlacement;
if (current.kind === "move")
update = shiftedScheduleByMinutes(current.task, delta);
else if (current.kind === "place") {
+ const surface = scroller.current;
+ const bounds = surface?.getBoundingClientRect();
+ const left =
+ bounds?.width && surface
+ ? Math.max(
+ current.timelineLeft,
+ bounds.left + taskColumnWidth(surface),
+ )
+ : current.timelineLeft;
+ const right = bounds?.width
+ ? Math.min(current.timelineLeft + timelineWidth, bounds.right)
+ : current.timelineLeft + timelineWidth;
+ validPlacement =
+ event.clientX >= left &&
+ event.clientX < right &&
+ (event.clientY === undefined ||
+ !bounds?.height ||
+ (event.clientY >= bounds.top && event.clientY <= bounds.bottom));
const offset = Math.max(
0,
Math.min(
@@ -380,8 +406,19 @@ export function GanttChart({
update = resizedScheduleAt(current.task, edge, origin + delta, step);
}
}
- scheduleDrag.current = { ...current, update, changed: moved };
- if (moved) setSchedulePreview({ taskId: current.task.id, update });
+ scheduleDrag.current = {
+ ...current,
+ update,
+ changed: moved,
+ validPlacement,
+ };
+ if (moved) {
+ setSchedulePreview(
+ current.kind !== "place" || validPlacement
+ ? { taskId: current.task.id, update }
+ : null,
+ );
+ }
}
function endScheduleDrag() {
@@ -395,6 +432,16 @@ export function GanttChart({
window.setTimeout(() => {
suppressClick.current = false;
}, 0);
+ if (current.kind === "place" && !current.validPlacement) {
+ showMessage(
+ {
+ tone: "neutral",
+ text: "Schedule unchanged. Drop over a date in the timeline to schedule this task.",
+ },
+ 4_500,
+ );
+ return;
+ }
void commitSchedule(current.task, current.update);
}
@@ -617,6 +664,7 @@ export function GanttChart({
selected={selectedId === row.task.id}
completionPending={completionPending.has(row.task.id)}
suppressClickRef={suppressClick}
+ taskHeight={taskHeight}
timelineWidth={timelineWidth}
onBeginLink={beginLink}
onCompletionChange={commitCompletion}
@@ -634,6 +682,7 @@ export function GanttChart({
)}
;
timelineWidth: number;
+ taskHeight: number;
scale: ReturnType;
selected: boolean;
completionPending: boolean;
@@ -861,6 +912,7 @@ function TaskRow({
onCancelLink(): void;
}) {
const task = preview ? withSchedule(row.task, preview) : row.task;
+ const inverted = hasInvertedSchedule(task);
const existingSpan = taskTimelineSpan(row.task, scale.snapMinutes);
const span = taskTimelineSpan(task, scale.snapMinutes);
const scaleStartMinute = planningMinute(scale.start)!;
@@ -896,7 +948,7 @@ function TaskRow({
return (
: null}
-
+ onBeginScheduleDrag(event, row.task, "place")
+ : undefined
+ }
+ >
{row.task.title}
- {scheduleLabel(task)}
+
+ {inverted ? "Scheduled after due" : scheduleLabel(task)}
+
;
timelineWidth: number;
bodyHeight: number;
+ taskHeight: number;
linkDrag: LinkDrag | null;
}) {
let offset = 0;
const taskY = new Map();
const tasks = new Map();
for (const row of rows) {
- const height = row.kind === "group" ? GROUP_HEIGHT : TASK_HEIGHT;
+ const height = row.kind === "group" ? GROUP_HEIGHT : taskHeight;
if (row.kind === "task") {
taskY.set(row.task.id, offset + height / 2);
tasks.set(row.task.id, row.task);
@@ -1221,6 +1296,9 @@ function DependencyLayer({
}
function scheduleLabel(task: PlannerTask): string {
+ if (hasInvertedSchedule(task)) {
+ return `Scheduled ${scheduleValueLabel(task.scheduled!)}; due ${scheduleValueLabel(task.due!)}. Scheduled is after the due date`;
+ }
const span = taskSpan(task);
if (!span) return "Not scheduled";
if (span.milestone) return `Due ${scheduleValueLabel(task.due!)}`;
@@ -1255,6 +1333,15 @@ function dependencyPath(x1: number, y1: number, x2: number, y2: number) {
return `M ${x1} ${y1} C ${x1 + bend} ${y1}, ${x2 - bend} ${y2}, ${x2} ${y2}`;
}
+function taskRowHeight(surface: HTMLElement): number {
+ const canvas = surface.querySelector(".gantt-canvas");
+ const value = canvas
+ ? getComputedStyle(canvas).getPropertyValue("--task-row-height")
+ : "";
+ const parsed = Number.parseFloat(value);
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : TASK_HEIGHT;
+}
+
function taskColumnWidth(surface: HTMLElement): number {
const canvas = surface.querySelector(".gantt-canvas");
const value = canvas
diff --git a/src/components/native-signin.test.tsx b/src/components/native-signin.test.tsx
new file mode 100644
index 0000000..565616c
--- /dev/null
+++ b/src/components/native-signin.test.tsx
@@ -0,0 +1,226 @@
+import {
+ act,
+ cleanup,
+ fireEvent,
+ render,
+ screen,
+ waitFor,
+} from "@testing-library/react";
+import { afterEach, describe, expect, it, vi } from "vitest";
+import type { AppWebSignInSnapshot } from "@mdbase-dev/sdk/app-host";
+import type { NativeSignInBinding } from "../data/native-signin-ui";
+import { NativeSignIn } from "./native-signin";
+
+afterEach(cleanup);
+
+let key = 0;
+function binding(initial: Partial = {}) {
+ let snapshot: AppWebSignInSnapshot = {
+ status: "signed_out",
+ signIn: null,
+ collections: [],
+ selectedCollectionId: null,
+ problem: null,
+ timing: null,
+ ...initial,
+ };
+ const listeners = new Set<() => void>();
+ const publish = (patch: Partial) => {
+ snapshot = { ...snapshot, ...patch };
+ for (const listener of listeners) listener();
+ };
+ const result: NativeSignInBinding = {
+ viewKey: ++key,
+ portal: { reserve: vi.fn(), open: vi.fn(), cancel: vi.fn() },
+ session: {
+ getSnapshot: () => snapshot,
+ subscribe(listener) {
+ listeners.add(listener);
+ return () => {
+ listeners.delete(listener);
+ };
+ },
+ start: vi.fn(async () => snapshot),
+ authorize: vi.fn(async () => {
+ publish({ status: "authorizing" });
+ return snapshot;
+ }),
+ renewExpiredPairing: vi.fn(async () => {
+ publish({ problem: null });
+ return snapshot;
+ }),
+ forget: vi.fn(async () => snapshot),
+ close: vi.fn(async () => {
+ publish({ status: "closed", signIn: null });
+ }),
+ setForeground: vi.fn(),
+ },
+ };
+ return { result, publish };
+}
+const paired: NonNullable = {
+ requestId: "request",
+ installationId: "installation",
+ deviceId: "device",
+ appId: "app",
+ kind: "app-runtime",
+ verificationUri: "https://mdbase.test/approve",
+ state: "paired",
+ accountId: "account",
+ accountEmail: "reader@example.test",
+ collectionIds: [],
+ createCollections: false,
+ requestedCreateCollections: false,
+};
+
+describe("public SDK sign-in UI bindings (stand-ins, not native acceptance)", () => {
+ it("one Sign in action reserves the tab and delegates authorization", async () => {
+ const h = binding();
+ render( );
+ fireEvent.click(screen.getByRole("button", { name: "Sign in" }));
+ await waitFor(() =>
+ expect(h.result.session.authorize).toHaveBeenCalledOnce(),
+ );
+ expect(h.result.portal.reserve).toHaveBeenCalledOnce();
+ expect(
+ vi.mocked(h.result.portal.reserve).mock.invocationCallOrder[0],
+ ).toBeLessThan(
+ vi.mocked(h.result.session.authorize).mock.invocationCallOrder[0],
+ );
+ expect(screen.getByRole("status").textContent).toBe(
+ "Waiting for approval in the mdbase tab…",
+ );
+ expect(
+ screen.getByRole("button", { name: "Open the mdbase tab again" }),
+ ).toBeTruthy();
+ });
+ it("keeps additional consent open and closes the owned portal only after completion", async () => {
+ const h = binding({ status: "authorizing", signIn: paired });
+ render( );
+ expect(h.result.portal.cancel).not.toHaveBeenCalled();
+ await act(async () => h.publish({ status: "unselected" }));
+ await waitFor(() => expect(h.result.portal.cancel).toHaveBeenCalledOnce());
+ expect(h.result.session.authorize).not.toHaveBeenCalled();
+ });
+ it.each([
+ "unselected",
+ "opening",
+ "setup_required",
+ "ready",
+ "blocked",
+ "closed",
+ ] as const)(
+ "cleans up the owned portal when the SDK reaches %s",
+ async (status) => {
+ const h = binding({ status: "authorizing", signIn: paired });
+ const view = render(
+ ,
+ );
+ await act(async () => h.publish({ status }));
+ expect(h.result.portal.cancel).toHaveBeenCalledOnce();
+ view.unmount();
+ expect(h.result.session.close).not.toHaveBeenCalled();
+ },
+ );
+ it("closes its popup on retired-view cleanup without closing the borrowed SDK session", () => {
+ const h = binding({ status: "authorizing", signIn: paired });
+ const view = render(
+ ,
+ );
+ view.unmount();
+ expect(h.result.portal.cancel).toHaveBeenCalledOnce();
+ expect(h.result.session.close).not.toHaveBeenCalled();
+ });
+ it("auto-detects the SDK's approval publication without an app polling action", async () => {
+ const h = binding({ status: "authorizing" });
+ render( );
+ await act(async () => h.publish({ status: "unselected", signIn: paired }));
+ expect(screen.getByText("Signed in as reader@example.test")).toBeTruthy();
+ expect(
+ screen.getByText(
+ "Opening collections isn't available in this build yet.",
+ ),
+ ).toBeTruthy();
+ expect(h.result.session.authorize).not.toHaveBeenCalled();
+ expect(screen.queryByText(/Set up|Continue setup/)).toBeNull();
+ });
+ it("one expired retry reserves BEFORE asynchronous SDK renewal", async () => {
+ const h = binding({ status: "blocked", problem: "expired" });
+ render( );
+ fireEvent.click(screen.getByRole("button", { name: "Sign in" }));
+ await waitFor(() =>
+ expect(h.result.session.authorize).toHaveBeenCalledOnce(),
+ );
+ expect(h.result.session.renewExpiredPairing).toHaveBeenCalledOnce();
+ expect(
+ vi.mocked(h.result.portal.reserve).mock.invocationCallOrder[0],
+ ).toBeLessThan(
+ vi.mocked(h.result.session.renewExpiredPairing).mock
+ .invocationCallOrder[0],
+ );
+ });
+ it("rapid repeated clicks do not create another UI authorization attempt", async () => {
+ const h = binding();
+ let finish!: (value: AppWebSignInSnapshot) => void;
+ vi.mocked(h.result.session.authorize).mockImplementation(
+ () =>
+ new Promise((resolve) => {
+ finish = resolve;
+ }),
+ );
+ render( );
+ const button = screen.getByRole("button", { name: "Sign in" });
+ fireEvent.click(button);
+ fireEvent.click(button);
+ expect(h.result.session.authorize).toHaveBeenCalledOnce();
+ await act(async () => finish(h.result.session.getSnapshot()));
+ });
+ it("publishes local sign-out only after SDK close completes", async () => {
+ const h = binding({ status: "unselected", signIn: paired });
+ let finish!: () => void;
+ vi.mocked(h.result.session.close).mockImplementation(
+ () =>
+ new Promise((resolve) => {
+ finish = resolve;
+ }),
+ );
+ const onSignedOut = vi.fn();
+ render( );
+ fireEvent.click(screen.getByRole("button", { name: "Sign out" }));
+ expect(onSignedOut).not.toHaveBeenCalled();
+ await act(async () => finish());
+ expect(onSignedOut).toHaveBeenCalledOnce();
+ });
+ it("a failed close cannot present sign-out or qualify a new owner", async () => {
+ const h = binding({ status: "unselected", signIn: paired });
+ vi.mocked(h.result.session.close).mockRejectedValue(
+ new Error("private diagnostic"),
+ );
+ const onSignedOut = vi.fn();
+ render( );
+ fireEvent.click(screen.getByRole("button", { name: "Sign out" }));
+ await waitFor(() =>
+ expect(screen.getByRole("alert").textContent).toBe(
+ "Sign-in was interrupted. Please try again.",
+ ),
+ );
+ expect(onSignedOut).not.toHaveBeenCalled();
+ expect(screen.queryByText("private diagnostic")).toBeNull();
+ });
+ it("forgets only the SDK's selected collection and closes no borrowed session on unmount", async () => {
+ const h = binding({
+ status: "unselected",
+ signIn: paired,
+ selectedCollectionId: "selected",
+ });
+ const view = render(
+ ,
+ );
+ fireEvent.click(screen.getByRole("button", { name: "Forget collection" }));
+ await waitFor(() =>
+ expect(h.result.session.forget).toHaveBeenCalledWith("selected"),
+ );
+ view.unmount();
+ expect(h.result.session.close).not.toHaveBeenCalled();
+ });
+});
diff --git a/src/components/native-signin.tsx b/src/components/native-signin.tsx
new file mode 100644
index 0000000..6789fe3
--- /dev/null
+++ b/src/components/native-signin.tsx
@@ -0,0 +1,169 @@
+import { useEffect, useRef, useState, useSyncExternalStore } from "react";
+import {
+ SignInTabBlocked,
+ authorizeNativeSignIn,
+ signInCopy,
+ signInPresentation,
+ type createNativeSignIn,
+} from "../data/native-signin-ui";
+
+interface NativeSignInProps {
+ /** Actual SDK instance plus its UI tab reservation; caller owns the lifetime. */
+ binding: ReturnType;
+ /** Close succeeded. Owner may show signed-out UI; original stores stay. */
+ onSignedOut(): void;
+}
+
+/** Presentation/actions only: no polling, custody, grants or session engine. */
+export function NativeSignIn(props: NativeSignInProps) {
+ return ;
+}
+
+function NativeSignInView({ binding, onSignedOut }: NativeSignInProps) {
+ const { session, portal } = binding;
+ const snapshot = useSyncExternalStore(
+ (listener) => session.subscribe(listener),
+ () => session.getSnapshot(),
+ () => session.getSnapshot(),
+ );
+ const [problem, setProblem] = useState<"tab_blocked" | "interrupted" | null>(
+ null,
+ );
+ const [working, setWorking] = useState(false);
+ const busy = useRef(false);
+ const mounted = useRef(false);
+
+ useEffect(() => {
+ mounted.current = true;
+ const foreground = () => {
+ if (session.getSnapshot().status === "closed") return;
+ try {
+ session.setForeground(document.visibilityState === "visible");
+ } catch {
+ if (mounted.current) setProblem("interrupted");
+ }
+ };
+ document.addEventListener("visibilitychange", foreground);
+ // External SDK synchronization, not a React-state reset. A fenced owner
+ // will publish closure or refuse the next explicit action.
+ if (session.getSnapshot().status !== "closed") {
+ try {
+ session.setForeground(document.visibilityState === "visible");
+ } catch {
+ /* Retired owner; do not publish late state. */
+ }
+ }
+ return () => {
+ mounted.current = false;
+ document.removeEventListener("visibilitychange", foreground);
+ portal.cancel();
+ // Borrowed SDK session: its actual owner handles unmount/HMR shutdown.
+ };
+ }, [session, portal]);
+
+ useEffect(() => {
+ // A paired account can still be authorizing additional consent. Only the
+ // public completed/terminal status closes this UI's original popup.
+ if (
+ [
+ "unselected",
+ "opening",
+ "setup_required",
+ "ready",
+ "blocked",
+ "closed",
+ ].includes(snapshot.status)
+ ) {
+ portal.cancel();
+ }
+ }, [portal, snapshot.status]);
+
+ const act = async (action: () => Promise) => {
+ if (busy.current) return;
+ busy.current = true;
+ setWorking(true);
+ setProblem(null);
+ try {
+ await action();
+ } catch (reason) {
+ if (mounted.current) {
+ setProblem(
+ reason instanceof SignInTabBlocked ? "tab_blocked" : "interrupted",
+ );
+ }
+ } finally {
+ if (mounted.current) {
+ busy.current = false;
+ setWorking(false);
+ }
+ }
+ };
+ const view = signInPresentation(snapshot, "TaskNotes Planner", problem);
+ const signOut = async () => {
+ await session.close();
+ portal.cancel();
+ if (mounted.current) onSignedOut();
+ };
+ const authorize = () => authorizeNativeSignIn(session, portal);
+
+ return (
+
+
+
+
+
TaskNotes Planner
+
+ Plan tasks on a timeline.
+ {view.identity ? {view.identity}
: null}
+
+ {view.message}
+
+ {view.unavailable ? {signInCopy.unavailable}
: null}
+
+ {view.waiting ? (
+ void act(authorize)}
+ >
+ {signInCopy.reopen}
+
+ ) : !view.paired || view.error ? (
+ void act(authorize)}
+ >
+ {view.action}
+
+ ) : null}
+ {view.paired ? (
+ void act(signOut)}
+ >
+ {signInCopy.signOut}
+
+ ) : null}
+ {snapshot.selectedCollectionId ? (
+ {
+ const collectionId = snapshot.selectedCollectionId;
+ if (collectionId) void act(() => session.forget(collectionId));
+ }}
+ >
+ Forget collection
+
+ ) : null}
+
+
+
+ );
+}
diff --git a/src/components/planner.native.test.tsx b/src/components/planner.native.test.tsx
new file mode 100644
index 0000000..b28c430
--- /dev/null
+++ b/src/components/planner.native.test.tsx
@@ -0,0 +1,78 @@
+import { cleanup, render, screen, waitFor } from "@testing-library/react";
+import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
+import type { MdbaseClient } from "@mdbase-dev/sdk";
+import { nativePlannerFixture } from "../test/native-planner-fixture";
+import { NextPlannerRepository } from "../data/next-planner-repository";
+import { Planner } from "./planner";
+
+const clients: MdbaseClient[] = [];
+const repositories: NextPlannerRepository[] = [];
+const originalScrollTo = Object.getOwnPropertyDescriptor(
+ HTMLElement.prototype,
+ "scrollTo",
+);
+beforeEach(() => {
+ vi.stubGlobal(
+ "matchMedia",
+ vi.fn(() => ({ matches: false })),
+ );
+ Object.defineProperty(HTMLElement.prototype, "scrollTo", {
+ configurable: true,
+ value: vi.fn(),
+ });
+});
+afterEach(() => {
+ cleanup();
+ for (const repository of repositories.splice(0)) repository.dispose();
+ for (const client of clients.splice(0)) client.close();
+ vi.restoreAllMocks();
+ vi.unstubAllGlobals();
+ if (originalScrollTo)
+ Object.defineProperty(HTMLElement.prototype, "scrollTo", originalScrollTo);
+ else Reflect.deleteProperty(HTMLElement.prototype, "scrollTo");
+});
+
+async function nativeFixture() {
+ const f = await nativePlannerFixture();
+ clients.push(f.client);
+ const repository = new NextPlannerRepository(
+ f.client,
+ "Native test collection",
+ );
+ repositories.push(repository);
+ return { ...f, repository };
+}
+
+describe("Planner native client surface (SDK testing fake, not native acceptance)", () => {
+ it("renders the native repository in the existing ledger without a legacy session", async () => {
+ const { client, repository } = await nativeFixture();
+ const get = vi.spyOn(client, "get");
+ const close = vi.spyOn(client, "close");
+ const changeCollection = vi.fn();
+ const view = render(
+ ,
+ );
+ await waitFor(() =>
+ expect(screen.getAllByText("Plan the SDK port").length).toBeGreaterThan(
+ 0,
+ ),
+ );
+ expect(
+ screen.getByRole("button", { name: /Native test collection/ }),
+ ).toBeTruthy();
+ expect(get).not.toHaveBeenCalled();
+ view.unmount();
+ repository.dispose();
+ expect(close).not.toHaveBeenCalled();
+ });
+
+ it("shows an exact-contract refusal instead of an empty or ready planning ledger", async () => {
+ const { client, repository, catalog } = await nativeFixture();
+ vi.mocked(client.describe).mockResolvedValue({ ...catalog, contracts: [] });
+ render( );
+ await waitFor(() =>
+ expect(screen.getByText(/does not provide tasknotes.task/)).toBeTruthy(),
+ );
+ expect(screen.queryByText("Plan the SDK port")).toBeNull();
+ });
+});
diff --git a/src/components/planner.test.tsx b/src/components/planner.test.tsx
index 535285c..b22c73c 100644
--- a/src/components/planner.test.tsx
+++ b/src/components/planner.test.tsx
@@ -1,4 +1,10 @@
-import { fireEvent, render, screen, waitFor } from "@testing-library/react";
+import {
+ fireEvent,
+ render,
+ screen,
+ waitFor,
+ within,
+} from "@testing-library/react";
import { MdbaseConnectError, type ConnectProblem } from "@mdbase-dev/connect";
import { Planner } from "./planner";
@@ -109,6 +115,25 @@ describe("Planner connection recovery", () => {
);
});
+ it("surfaces asynchronous SDK clearSelection refusal without dropping the current ledger", async () => {
+ const repository = repositoryFixture();
+ const onChangeCollection = vi
+ .fn<() => Promise>()
+ .mockRejectedValue(new Error("The original collection could not close."));
+ render(
+ ,
+ );
+ fireEvent.click(await screen.findByRole("button", { name: /Work/ }));
+ expect(await screen.findByRole("alert")).toHaveTextContent(
+ "The original collection could not close.",
+ );
+ expect(screen.getByRole("button", { name: /Work/ })).toBeTruthy();
+ expect(onChangeCollection).toHaveBeenCalledOnce();
+ });
+
it("recovers a durable pending handle explicitly and reconciles by loading", async () => {
let completeRecovery = () => undefined;
let pending: readonly PendingPlannerMutation[] = [
@@ -322,6 +347,64 @@ describe("Planner connection recovery", () => {
});
});
+describe("Planner save view dialog", () => {
+ it("keeps Tab inside the dialog and returns focus to the opener on Escape", async () => {
+ render(
+ undefined}
+ />,
+ );
+ const opener = await screen.findByRole("button", { name: "Save view" });
+ opener.focus();
+ fireEvent.click(opener);
+
+ const dialog = screen.getByRole("dialog", { name: "Create Planner view" });
+ expect(screen.getByRole("textbox", { name: "View name" })).toHaveFocus();
+ const close = within(dialog).getByRole("button", { name: "Close" });
+ const cancel = within(dialog).getByRole("button", { name: "Cancel" });
+
+ cancel.focus();
+ fireEvent.keyDown(cancel, { key: "Tab" });
+ expect(close).toHaveFocus();
+ fireEvent.keyDown(close, { key: "Tab", shiftKey: true });
+ expect(cancel).toHaveFocus();
+
+ fireEvent.keyDown(cancel, { key: "Escape" });
+ expect(screen.queryByRole("dialog")).not.toBeInTheDocument();
+ expect(opener).toHaveFocus();
+ });
+});
+
+describe("Planner save as new view", () => {
+ it("retries a renamed save under the same intent", async () => {
+ const saveView = vi
+ .fn()
+ .mockRejectedValueOnce(new Error("reply lost"))
+ .mockReturnValue(new Promise(() => undefined));
+ render(
+ undefined}
+ />,
+ );
+ fireEvent.click(await screen.findByRole("button", { name: "Save view" }));
+ const dialog = screen.getByRole("dialog", { name: "Create Planner view" });
+ const name = screen.getByRole("textbox", { name: "View name" });
+ fireEvent.change(name, { target: { value: "First" } });
+ fireEvent.submit(name.closest("form")!);
+ await within(dialog).findByRole("alert");
+ fireEvent.change(name, { target: { value: "Renamed" } });
+ fireEvent.submit(name.closest("form")!);
+ await waitFor(() => expect(saveView).toHaveBeenCalledTimes(2));
+ const [[first], [retry]] = saveView.mock.calls as [
+ [{ intent: string }],
+ [{ intent: string; name: string }],
+ ];
+ expect(retry).toMatchObject({ name: "Renamed", intent: first.intent });
+ });
+});
+
function repositoryFixture(
overrides: Partial = {},
): PlannerRepository {
diff --git a/src/components/planner.tsx b/src/components/planner.tsx
index b1a7710..588626a 100644
--- a/src/components/planner.tsx
+++ b/src/components/planner.tsx
@@ -1,3 +1,4 @@
+import { CollectionSaveWarning } from "@mdbase-dev/ui/collections";
import {
CalendarDays,
BookmarkPlus,
@@ -18,8 +19,10 @@ import {
useEffect,
useMemo,
useRef,
+ useSyncExternalStore,
useState,
type FormEvent,
+ type ReactNode,
} from "react";
import {
@@ -31,13 +34,19 @@ import {
zoomDefinition,
type TimelineZoom,
} from "../domain/gantt";
+import {
+ connectionNoticeLabels,
+ type ConnectionNotice,
+} from "./connection-notice";
import { GanttChart } from "./gantt-chart";
import { TaskInspector } from "./task-inspector";
+import { useModalFocus } from "./use-modal-focus";
import { errorMessage, isOperationOutcomeUnknown } from "../data/outcome";
import type {
PlannerCollection,
PendingPlannerMutation,
+ RejectedPlannerWrite,
PlannerRepository,
PlannerTask,
ScheduleUpdate,
@@ -45,12 +54,20 @@ import type {
TaskPropertyUpdate,
} from "../domain/task";
+const noop = () => {};
+
export function Planner({
repository,
onChangeCollection,
+ collectionSwitcher,
+ connectionNotice = null,
}: {
repository: PlannerRepository;
- onChangeCollection(): void;
+ onChangeCollection(): void | Promise;
+ /** The shared mdbase collection switcher, in place of the collection button. */
+ collectionSwitcher?: ReactNode;
+ /** The SDK's offline, reconnecting or saved-on-device state. */
+ connectionNotice?: ConnectionNotice | null;
}) {
const [collection, setCollection] = useState(null);
const [loading, setLoading] = useState(true);
@@ -66,7 +83,10 @@ export function Planner({
new URLSearchParams(location.search).get("view"),
);
const [saveOpen, setSaveOpen] = useState(false);
+ const saveDialogRef = useRef(null);
+ useModalFocus(saveOpen, saveDialogRef, () => setSaveOpen(false));
const [saveName, setSaveName] = useState("");
+ const [saveIntent, setSaveIntent] = useState("");
const [savingView, setSavingView] = useState(false);
const [saveError, setSaveError] = useState("");
const [selectedId, setSelectedId] = useState(null);
@@ -74,6 +94,9 @@ export function Planner({
const [pendingMutations, setPendingMutations] = useState<
readonly PendingPlannerMutation[]
>([]);
+ const [rejectedWrites, setRejectedWrites] = useState<
+ readonly RejectedPlannerWrite[]
+ >([]);
const [recoveringMutation, setRecoveringMutation] = useState("");
const [recoveryError, setRecoveryError] = useState("");
const [collectionActionError, setCollectionActionError] = useState("");
@@ -81,8 +104,19 @@ export function Planner({
const mutationsDisabled =
pendingMutations.length > 0 || Boolean(recoveringMutation);
+ const savedOnDevice = useSyncExternalStore(
+ useCallback(
+ (listener: () => void) => repository.onSaveState?.(listener) ?? noop,
+ [repository],
+ ),
+ () => repository.savedOnDevice?.() ?? false,
+ );
+ const notice: ConnectionNotice | null =
+ connectionNotice ?? (savedOnDevice ? "saved_on_device" : null);
+
const refreshPendingMutations = useCallback(() => {
setPendingMutations(repository.pendingMutations?.() ?? []);
+ setRejectedWrites(repository.rejectedWrites?.() ?? []);
}, [repository]);
const load = useCallback(
@@ -251,10 +285,10 @@ export function Planner({
}
}
- function changeCollection() {
+ async function changeCollection() {
setCollectionActionError("");
try {
- onChangeCollection();
+ await onChangeCollection();
} catch (reason) {
setCollectionActionError(errorMessage(reason));
}
@@ -272,6 +306,7 @@ export function Planner({
function openSaveView() {
setSaveName(collection?.activeView?.name ?? "");
+ setSaveIntent(crypto.randomUUID());
setSaveError("");
setSaveOpen(true);
}
@@ -288,6 +323,7 @@ export function Planner({
try {
const saved = await repository.saveView({
name: saveName,
+ intent: saveIntent,
...(collection.activeView?.writable
? { view: collection.activeView }
: {}),
@@ -333,11 +369,13 @@ export function Planner({
TaskNotes Planner
-
-
- {collection.name}
-
-
+ {collectionSwitcher ?? (
+
+
+ {collection.name}
+
+
+ )}
@@ -346,6 +384,9 @@ export function Planner({
) : null}
+ {notice ? (
+
+ {connectionNoticeLabels[notice]}
+
+ ) : null}
+
{pendingMutations.map((pending) => (
A {pending.operation} may already have completed. Recover its original
@@ -507,6 +554,21 @@ export function Planner({
))}
+ {rejectedWrites.map((write) => (
+
+ A change wasn’t saved: {write.message}
+
+ void repository
+ .dismissRejectedWrite?.(write.id)
+ .finally(refreshPendingMutations)
+ }
+ >
+ Dismiss
+
+
+ ))}
{recoveryError ? (
{recoveryError}
@@ -546,7 +608,9 @@ export function Planner({