diff --git a/AGENTS.md b/AGENTS.md index 114cd0e..ff420c8 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -220,3 +220,141 @@ Shared component CSS classes live in `shared/styles/components.css`. Both fronte - Changes to `shared/` affect both Desktop and Web. Verify both builds pass. - When adding a new shared component, follow the Props-in/Callbacks-out pattern. - When a shared component needs platform-specific behavior, add a slot prop — do not add platform detection. + +## New Feature Workflow + +Do not assume that every feature belongs on every surface. Before implementation, +analyze where the capability belongs, which layers it affects, what can be +shared, and which artifacts or documentation must follow it. The result may be +Desktop-only, Web-only, shared across both, package-only, or backend-only. + +### 1. Feature Impact Analysis + +Before editing code, add an impact matrix to the implementation notes or PR. +Mark every row **Yes**, **No**, or **N/A**, and give a short reason. A "No" +decision is valid; it just must be deliberate. + +| Area | Questions to answer | +|------|---------------------| +| Desktop app | Does this support local-first/offline vault work, local files, Tauri capabilities, or a focused desktop workflow? What is its entry point and persistence adapter? | +| Web app | Does this require cloud workspaces, collaboration, members/roles, admin, publishing, browser access, or server-owned data? What is its entry point and permission behavior? | +| Shared model/utilities | Do Desktop, Web, the board package, CLI, MCP, or backend need the same types, validation, IDs, parsing, or transformations? | +| Shared UI | Is the interaction and information architecture materially the same on Desktop and Web? Can it stay props-in/callbacks-out without platform branches? | +| Web service/API | Does it change HTTP contracts, auth, persistence, migrations, events, sync, conflicts, budgets, webhooks, or storage? | +| `packages/board-react` | Does the embeddable Kanban package expose or persist the affected board capability? Does its public API, types, bundle, example, or README need to change? | +| CLI/MCP | Should automation or headless users be able to read or mutate the feature? Do tool schemas or help text need updates? | +| In-app Help | Does the feature add or change a user-visible workflow, setting, limitation, or concept covered by the Help Center? | +| Other docs | Do README, API docs, internal design docs, screenshots, examples, or release notes become inaccurate? | +| Release/deployment | Which artifacts must be rebuilt or promoted: Desktop installers, Web image, board package, CLI binaries, or none? | + +Use repository searches to support the matrix. Do not infer that a change is +isolated from its filename. + +### 2. Surface Decision Rules + +Choose surfaces based on product responsibility, not symmetry: + +- Prefer **Desktop** for local vault and filesystem workflows, offline behavior, + native OS integration, and single-file editing. +- Prefer **Web** for cloud collaboration, member/role-aware behavior, admin, + publishing, and server-only capabilities. +- Implement on **both** when the same user-owned document or board can be opened + and edited on both surfaces and inconsistent behavior would corrupt, hide, or + surprise users. +- A feature can intentionally differ by surface. Keep the domain model + compatible, then document the UX difference and its reason. +- Do not add placeholder UI to a surface that cannot provide the real behavior. + +For each affected surface, define the entry point, default/empty state, +existing-data state, read-only/permission state, persistence path, error +recovery, and user-visible acceptance criteria. + +### 3. Decide What To Share + +Share the smallest stable layer that is genuinely common: + +- Put common types, parsing, validation, stable IDs, migrations, and pure + transformations in `shared/lib/` when multiple consumers need them. +- Put UI in `shared/components/` only when Desktop and Web have substantially + the same interaction. Shared UI must remain props-in/callbacks-out. +- Keep platform data access in adapters: Tauri/filesystem behavior in `src/`, + Web API behavior in `services/jtype-web/frontend/src/`. +- If workflows differ, share primitives or the domain model instead of forcing + a single component full of platform conditionals. +- A shared component is not proof of integration. Each selected host still + needs an explicit entry point, adapter, and persistence test. + +### 4. Decide Whether Kanban Package Changes + +Update `packages/board-react` when the feature changes board data or behavior +that external embedded boards should expose. In that case: + +- Update package source, public props/types, adapters, and localized strings as + applicable. +- Update `packages/board-react/README.md` and the example when consumers need new + setup or behavior guidance. +- Rebuild the checked-in `packages/board-react/dist/` output. +- Run `npm run build` and `npm test` from `packages/board-react/`. + +Do not update the package for app-shell-only behavior, Desktop filesystem +features, Web admin UI, or other capabilities the embeddable board cannot use. +Record that decision in the impact matrix. + +### 5. Decide Whether Documentation Changes + +Update documentation when the feature changes what a user can do, how they find +it, its data model, configuration, permissions, limitations, or recovery flow. + +- In-app Help lives in + `services/jtype-web/frontend/src/help/content/`. Update the relevant article + source and maintained locale variants when the user workflow changes. +- Update `packages/board-react/README.md` for public package behavior. +- Update API docs for contract or tool changes. +- Update internal design/ADR material when the architectural decision changes. +- Update screenshots, examples, and release notes when old material would + misrepresent the product. + +Docs are not required for invisible refactors with no behavior or contract +change. State why docs are unchanged in the impact matrix. + +### 6. Implement And Test The Selected Scope + +Implementation and verification follow the matrix; unaffected surfaces are not +modified merely for parity. + +- Add unit tests for shared models and transformations. +- Add a real Desktop entry-point/persistence test when Desktop is **Yes**. +- Add a real Web entry-point/API persistence test when Web is **Yes**. +- Add package tests and rebuild `dist/` when `packages/board-react` is **Yes**. +- Add API/Rust tests when service contracts or persistence are **Yes**. +- Test discoverability from the normal default state, not only a fixture where + the feature is already enabled. +- A shared fixture is useful for component behavior but does not replace the + selected host integration tests. + +### 7. Review, Release, And Verify + +- The PR must include the completed impact matrix, acceptance criteria, tests + run, documentation decisions, migration notes, and visuals for each changed UI + surface. +- Review the user flow from its real entry point and default state. +- Build and release only the affected artifacts identified in the matrix. +- Verify every released artifact comes from a commit containing the change. +- Promote Kubernetes changes with an explicit context and namespace. +- `/health` proves service availability, not feature completion. Run a + feature-specific smoke test on every promoted or published surface, including + persistence after reload where applicable. + +### Definition Of Done + +A feature is complete when: + +- Every impact area has a Yes/No/N/A decision with rationale. +- Every **Yes** area is implemented, tested, documented, and released as needed. +- Shared code is used only where the model or interaction is genuinely shared. +- Every selected UI surface exposes the feature from a discoverable real entry + point and handles its relevant states. +- Package bundles, public types, examples, and Help content are updated when + their impact rows are **Yes**. +- Feature-specific verification passes on the artifacts and environments that + were actually released. diff --git a/internal-docs/kanban/mockups/status-columns-filter-redesign.png b/internal-docs/kanban/mockups/status-columns-filter-redesign.png new file mode 100644 index 0000000..378ab6b Binary files /dev/null and b/internal-docs/kanban/mockups/status-columns-filter-redesign.png differ diff --git a/internal-docs/kanban/mockups/status-management-redesign.png b/internal-docs/kanban/mockups/status-management-redesign.png new file mode 100644 index 0000000..66de684 Binary files /dev/null and b/internal-docs/kanban/mockups/status-management-redesign.png differ diff --git a/internal-docs/kanban/mockups/vertical-swimlanes-redesign.png b/internal-docs/kanban/mockups/vertical-swimlanes-redesign.png new file mode 100644 index 0000000..140eaca Binary files /dev/null and b/internal-docs/kanban/mockups/vertical-swimlanes-redesign.png differ diff --git a/internal-docs/kanban/status-columns-filter-redesign.md b/internal-docs/kanban/status-columns-filter-redesign.md new file mode 100644 index 0000000..7d1b654 --- /dev/null +++ b/internal-docs/kanban/status-columns-filter-redesign.md @@ -0,0 +1,132 @@ +# Vertical swimlanes and lightweight filters + +## Feature impact analysis + +| Area | Decision | Rationale | +|------|----------|-----------| +| Desktop app | Yes | Local `.board` files must expose the same swimlane selection and drag writeback offline. | +| Web app | Yes | Cloud boards use the same interaction and persisted document model. | +| Shared model/utilities | Yes | One canonical lane resolver maps every host to the correct card field. | +| Shared UI | Yes | Desktop, Web, and the embed render the same `BoardSurface`. | +| Web service/API | No | Existing document save APIs already persist board config and card frontmatter. | +| `packages/board-react` | Yes | The embed ships the shared board and must write the same fields on drop. | +| CLI/MCP | No | Their status/card mutation contracts remain compatible. | +| In-app Help | Yes | The visible model and terminology changed. | +| Release/deployment | Yes | Desktop, Web, and package artifacts must be rebuilt after merge. | + +## Product model + +JType has one visible board dimension: **vertical swimlanes with their labels +at the top**. There is no second left-side row axis. + +The swimlane selector offers: + +1. **Status** — default. `To do`, `Doing`, and `Done` are workflow definitions. + Dropping a card changes frontmatter `status`. +2. **Priority** — fixed `Urgent`, `High`, `Medium`, `Low`, and `Unassigned` + columns. Dropping a card changes or clears `priority`. +3. **Assignee** — columns derived from current values plus `Unassigned`. + Dropping a card changes or clears `assignee`. +4. **Custom** — board-owned definitions with immutable IDs, editable names, + colors, and order. Dropping a card changes or clears frontmatter `swimlane`. + +Status is the conventional Kanban workflow and remains the default. Priority, +assignee, and custom swimlanes are alternate views, not filters and not an +additional grid dimension. + +## Stable identity and custom swimlanes + +Custom definitions persist in `.board` configuration: + +```json +{ + "swimlaneBy": "custom", + "swimlanes": [ + { + "key": "lane_platform_12345678", + "name": "Platform", + "color": "#0ea5e9" + } + ] +} +``` + +Cards persist only the immutable key: + +```yaml +swimlane: lane_platform_12345678 +``` + +Renaming a swimlane therefore never disconnects its cards. When a definition +is deleted without migrating cards, those cards render in **Unassigned** while +their original IDs remain recoverable. + +Priority and Assignee can be converted into editable custom swimlanes. The +conversion creates immutable IDs, migrates cards, and leaves the original +priority or assignee fields unchanged. + +## UI design + +The board toolbar has one **Swimlanes** selector, then the settings action for +that selection, followed by Sort, Filters, and Search. + +- Status shows **Manage statuses**. +- Priority and Assignee show **Make swimlanes editable**. +- Custom shows **Manage custom swimlanes**. + +Every swimlane is a fixed-width vertical column. Cards use pointer drag: + +- horizontal movement crosses swimlanes and updates the selected field; +- vertical movement reorders cards when Status + Manual sort is active; +- empty swimlanes are valid drop targets; +- read-only boards expose neither drag nor mutation controls. + +Custom management uses a shared Headless UI dialog. It supports add, rename, +reorder, color, stable-ID inspection, and deletion with optional card +migration. **Add swimlane** also appears after the final custom column. + +## Lightweight filters + +Filters focus the current view without changing membership or card data: + +- priority (multi-select); +- assignee (multi-select, including Unassigned); +- labels (multi-select); +- due date: overdue, today, next seven days, or no due date; +- blocked cards; +- cards assigned to the current user; +- recoverable cards whose custom swimlane definition is missing. + +Values within one dimension use OR; dimensions combine with AND. Filters are +local component state and apply to Board, Table, and Calendar. + +## Persisted compatibility + +- New Status, Priority, and Assignee selections persist in existing `groupBy`. +- Custom persists as `groupBy: "status"`, existing `swimlaneBy: "custom"`, + plus `swimlanes`; conversion normalizes to the same shape. +- Historical boards that stored `swimlaneBy: "status" | "priority" | + "assignee"` from the retired two-dimensional UI use that value as the single + active vertical swimlane dimension. +- No migration rewrites cards merely to open a board. + +## Acceptance criteria + +- Desktop, Web, and `jtype-board-react` render identical top-labelled vertical + swimlanes with no left-side row labels. +- Status is the default selection. +- Selecting Status, Priority, Assignee, or Custom produces exactly one set of + vertical columns. +- Dragging a card to another column updates the corresponding frontmatter + field in all three hosts. +- Custom swimlanes can be added, renamed, reordered, recolored, and deleted; + stable IDs remain inspectable. +- Empty and Unassigned swimlanes accept drops. +- Missing custom definitions surface their cards in Unassigned without + destroying the original mapping. +- Desktop and Web builds, shared unit tests, component drag E2E, real Desktop + E2E, real Web E2E, and the package build pass. + +## Implemented visual + +![Vertical custom swimlanes](mockups/vertical-swimlanes-redesign.png) diff --git a/internal-docs/kanban/swimlane-management-design.md b/internal-docs/kanban/swimlane-management-design.md index 013661f..019d123 100644 --- a/internal-docs/kanban/swimlane-management-design.md +++ b/internal-docs/kanban/swimlane-management-design.md @@ -1,5 +1,7 @@ # Kanban 可编辑泳道设计 +> **已于 2026-07-30 被取代。** 本文保留早期二维数据方案的历史记录;当前产品使用顶部标题的单一纵向泳道,不再渲染左侧横向行。现行设计见 [Vertical swimlanes and lightweight filters](./status-columns-filter-redesign.md)。 + 状态:Grok + Kimi 评审完成,已实现并通过 Desktop / Web / board-react 验证 日期:2026-07-29 diff --git a/internal-docs/kanban/swimlane-management-ui-design.md b/internal-docs/kanban/swimlane-management-ui-design.md index 73eab2a..d76c65b 100644 --- a/internal-docs/kanban/swimlane-management-ui-design.md +++ b/internal-docs/kanban/swimlane-management-ui-design.md @@ -1,5 +1,7 @@ # Kanban 泳道管理 UI 设计 +> **已于 2026-07-30 被取代。** 本文保留早期左侧横向泳道 UI 的历史记录;当前产品使用顶部标题的单一纵向泳道。现行设计见 [Vertical swimlanes and lightweight filters](./status-columns-filter-redesign.md)。 + 状态:Grok + Kimi 评审完成,推荐方案已确认并实现 日期:2026-07-29 diff --git a/packages/board-react/README.md b/packages/board-react/README.md index e17a488..7f8b87d 100644 --- a/packages/board-react/README.md +++ b/packages/board-react/README.md @@ -21,9 +21,11 @@ import 'jtype-board-react/style.css' The component resolves `boardRef` to the `.board` config document itself (exact path first, then unique basename anywhere in the workspace), scans the -board folder's card documents, and gives you the full board: columns, cards, -drag-to-move (with document writeback), search/filter/sort, Board/Table/ -Calendar views, and a built-in read-only card detail. +board folder's card documents, and gives you the full board: selectable +vertical swimlanes (status, priority, assignee, or custom), cards, +drag-to-move (with document writeback), multi-select filters, search/sort, +Board/Table/Calendar views, and a +built-in read-only card detail. The wrapper fills its container — **give the parent element a height.** @@ -37,6 +39,7 @@ The wrapper fills its container — **give the parent element a height.** | `token` | `string` | — | Session token, typically `mcp`-scoped (mint via the OAuth device flow or the board Settings → MCP access panel). | | `client` | `JTypeBoardDataClient` | — | Injected data client; replaces `baseUrl`+`token`. **Memoize it** — a new identity per render remounts the board. | | `readOnly` | `boolean` | `false` | Hides every mutation affordance (drag, composers, menus). View switching stays usable but is kept local, never written back. | +| `currentUser` | `string` | — | Current user's display name. Enables the personal **My cards** filter. | | `live` | `boolean` | `true` | Try the live SSE feed; see *Live updates* below. | | `pollIntervalMs` | `number` | `30000` | Polling cadence (min 5000). | | `onCardOpen` | `(card: BoardViewCard) => void` | — | Intercept card opens; replaces the built-in read-only detail panel. | @@ -130,9 +133,12 @@ successful poll. ## MVP scope -Included: column + card rendering, drag to move/reorder cards (frontmatter -`status`/`position` writeback), card create/delete, board/table/calendar and -swimlane views, search/filter/sort, read-only card detail, localized chrome. +Included: vertical swimlane management and drag-to-move with `status`, +`priority`, `assignee`, or custom `swimlane` frontmatter writeback. Manual +within-lane reorder applies to Status swimlanes; alternate dimensions move +cards between lanes without rewriting workflow order. Also included: card +create/delete, board/table/calendar, multi-select filters, search/sort, +read-only card detail, and localized chrome. Not yet (flag-gated later): members/assignee options, versions/activity, ticket badges (the `OCCSV-####` chip — the embed client has no ticket-index endpoint, so cards never show it even when the board configures `ticketKey`), diff --git a/packages/board-react/dist/index.d.ts b/packages/board-react/dist/index.d.ts index 63cbca9..4312329 100644 --- a/packages/board-react/dist/index.d.ts +++ b/packages/board-react/dist/index.d.ts @@ -118,11 +118,12 @@ declare type BoardViewConfig = { /** Board ticket-id prefix (e.g. `OCCSV`) for per-card `OCCSV-3371` ticket links. */ ticketKey?: string; /** - * Second grouping dimension rendered as horizontal swimlanes (rows) in the - * board view. Must differ from `groupBy`; unset = no swimlanes. - */ - swimlaneBy?: BoardSwimlaneGroupKey; - /** Persistent definitions used when `swimlaneBy === "custom"`. */ + * Active custom swimlane mode. Historical configs may also contain + * status/priority/assignee here from the retired two-dimensional layout; + * those values now render as the single vertical swimlane dimension. + */ + swimlaneBy?: BoardSwimlaneGroupKey; + /** Persistent definitions used by custom vertical swimlanes. */ swimlanes?: BoardSwimlane[]; /** Present only while a derived-lane conversion is incomplete/retryable. */ swimlaneMigration?: SwimlaneMigration; @@ -159,7 +160,7 @@ export declare class JTypeApiError extends Error { * `client`) plus `workspaceId`+`boardRef` and it renders the same shared * BoardSurface the jtype desktop + web apps use, backed by the document API. */ -export declare function JTypeBoard({ workspaceId, boardRef, baseUrl, token, client: injectedClient, readOnly, live, pollIntervalMs, onCardOpen, onConnectionChange, locale, className, style, }: JTypeBoardProps): ReactElement; +export declare function JTypeBoard({ workspaceId, boardRef, baseUrl, token, client: injectedClient, readOnly, currentUser, live, pollIntervalMs, onCardOpen, onConnectionChange, locale, className, style, }: JTypeBoardProps): ReactElement; export declare type JTypeBoardConnection = 'live' | 'polling' | 'error'; @@ -216,6 +217,8 @@ export declare type JTypeBoardProps = { client?: JTypeBoardDataClient; /** Hide all mutation affordances (view-only board). Default false. */ readOnly?: boolean; + /** Current user's display name; enables the personal "My cards" filter. */ + currentUser?: string; /** * Try the live SSE feed (default true). Post PR #45 the feed requires a * full-scope session token — with an mcp-scoped token the server answers diff --git a/packages/board-react/dist/index.js b/packages/board-react/dist/index.js index 8c4f9ae..b6a641f 100644 --- a/packages/board-react/dist/index.js +++ b/packages/board-react/dist/index.js @@ -105,12 +105,12 @@ function L(e) { } //#endregion //#region node_modules/@lingui/core/dist/index.mjs -var R = (e) => typeof e == "string", te = (e) => typeof e == "function", z = /* @__PURE__ */ new Map(), ne = "en"; -function re(e) { - return [...Array.isArray(e) ? e : [e], ne]; +var R = (e) => typeof e == "string", z = (e) => typeof e == "function", B = /* @__PURE__ */ new Map(), te = "en"; +function ne(e) { + return [...Array.isArray(e) ? e : [e], te]; } -function ie(e, t, n) { - let r = re(e); +function re(e, t, n) { + let r = ne(e); n ||= "default"; let i; if (typeof n == "string") switch (i = { @@ -127,9 +127,9 @@ function ie(e, t, n) { break; } else i = n; - return ce(() => le("date", r, n), () => new Intl.DateTimeFormat(r, i)).format(R(t) ? new Date(t) : t); + return se(() => ce("date", r, n), () => new Intl.DateTimeFormat(r, i)).format(R(t) ? new Date(t) : t); } -function ae(e, t, n) { +function ie(e, t, n) { let r; if (n ||= "default", typeof n == "string") switch (r = { second: "numeric", @@ -143,24 +143,24 @@ function ae(e, t, n) { case "short": delete r.second; } else r = n; - return ie(e, t, r); + return re(e, t, r); } -function oe(e, t, n) { - let r = re(e); - return ce(() => le("number", r, n), () => new Intl.NumberFormat(r, n)).format(t); +function ae(e, t, n) { + let r = ne(e); + return se(() => ce("number", r, n), () => new Intl.NumberFormat(r, n)).format(t); } -function se(e, t, n, { offset: r = 0, ...i }) { - let a = re(e), o = t ? ce(() => le("plural-ordinal", a), () => new Intl.PluralRules(a, { type: "ordinal" })) : ce(() => le("plural-cardinal", a), () => new Intl.PluralRules(a, { type: "cardinal" })); +function oe(e, t, n, { offset: r = 0, ...i }) { + let a = ne(e), o = t ? se(() => ce("plural-ordinal", a), () => new Intl.PluralRules(a, { type: "ordinal" })) : se(() => ce("plural-cardinal", a), () => new Intl.PluralRules(a, { type: "cardinal" })); return i[n] ?? i[o.select(n - r)] ?? i.other; } -function ce(e, t) { - let n = e(), r = z.get(n); - return r || (r = t(), z.set(n, r)), r; +function se(e, t) { + let n = e(), r = B.get(n); + return r || (r = t(), B.set(n, r)), r; } -function le(e, t, n) { +function ce(e, t, n) { return `${e}-${t.join("-")}-${JSON.stringify(n)}`; } -var ue = /\\u[a-fA-F0-9]{4}|\\x[a-fA-F0-9]{2}/, de = (e) => e.replace(/\\u([a-fA-F0-9]{4})|\\x([a-fA-F0-9]{2})/g, (e, t, n) => { +var le = /\\u[a-fA-F0-9]{4}|\\x[a-fA-F0-9]{2}/, ue = (e) => e.replace(/\\u([a-fA-F0-9]{4})|\\x([a-fA-F0-9]{2})/g, (e, t, n) => { if (t) { let e = parseInt(t, 16); return String.fromCharCode(e); @@ -168,30 +168,30 @@ var ue = /\\u[a-fA-F0-9]{4}|\\x[a-fA-F0-9]{2}/, de = (e) => e.replace(/\\u([a-fA let e = parseInt(n, 16); return String.fromCharCode(e); } -}), fe = "%__lingui_octothorpe__%", pe = (e, t, n = {}) => { +}), de = "%__lingui_octothorpe__%", fe = (e, t, n = {}) => { let r = t || e, i = (e) => typeof e == "object" ? e : n[e], a = (e, t) => { - let a = Object.keys(n).length ? i("number") : void 0, o = oe(r, e, a); - return t.replace(new RegExp(fe, "g"), o); + let a = Object.keys(n).length ? i("number") : void 0, o = ae(r, e, a); + return t.replace(new RegExp(de, "g"), o); }; return { plural: (e, t) => { - let { offset: n = 0 } = t, i = se(r, !1, e, t); + let { offset: n = 0 } = t, i = oe(r, !1, e, t); return a(e - n, i); }, selectordinal: (e, t) => { - let { offset: n = 0 } = t, i = se(r, !0, e, t); + let { offset: n = 0 } = t, i = oe(r, !0, e, t); return a(e - n, i); }, - select: me, - number: (e, t) => oe(r, e, i(t) || { style: t }), - date: (e, t) => ie(r, e, i(t) || t), - time: (e, t) => ae(r, e, i(t) || t) + select: pe, + number: (e, t) => ae(r, e, i(t) || { style: t }), + date: (e, t) => re(r, e, i(t) || t), + time: (e, t) => ie(r, e, i(t) || t) }; -}, me = (e, t) => t[e] ?? t.other; -function he(e, t, n) { +}, pe = (e, t) => t[e] ?? t.other; +function me(e, t, n) { return (r = {}, i) => { - let a = pe(t, n, i), o = (e, t = !1) => Array.isArray(e) ? e.reduce((e, n) => { - if (n === "#" && t) return e + fe; + let a = fe(t, n, i), o = (e, t = !1) => Array.isArray(e) ? e.reduce((e, n) => { + if (n === "#" && t) return e + de; if (R(n)) return e + n; let [i, s, c] = n, l = {}; s === "plural" || s === "selectordinal" || s === "select" ? Object.entries(c).forEach(([e, t]) => { @@ -204,10 +204,10 @@ function he(e, t, n) { } else u = r[i]; return u == null ? e : e + u; }, "") : e, s = o(e); - return R(s) && ue.test(s) ? de(s) : R(s) ? s : s ? String(s) : ""; + return R(s) && le.test(s) ? ue(s) : R(s) ? s : s ? String(s) : ""; }; } -var ge = class { +var he = class { _events = {}; on(e, t) { return this._events[e] ??= /* @__PURE__ */ new Set(), this._events[e].add(t), () => this.removeListener(e, t); @@ -220,14 +220,14 @@ var ge = class { let n = this._events[e]; if (n) for (let e of [...n]) e.apply(this, t); } -}, _e = class extends ge { +}, ge = class extends he { _locale = ""; _locales; _messages = {}; _missing; _messageCompiler; constructor(e) { - super(), e.missing != null && (this._missing = e.missing), e.messages != null && this.load(e.messages), (typeof e.locale == "string" || e.locales) && this.activate(e.locale ?? ne, e.locales); + super(), e.missing != null && (this._missing = e.missing), e.messages != null && this.load(e.messages), (typeof e.locale == "string" || e.locales) && this.activate(e.locale ?? te, e.locales); } get locale() { return this._locale; @@ -259,7 +259,7 @@ var ge = class { let r = n?.message; e ||= "", R(e) || (t = e.values || t, r = e.message, e = e.id); let i = this.messages[e], a = i === void 0, o = this._missing; - if (o && a) return te(o) ? o(this._locale, e) : o; + if (o && a) return z(o) ? o(this._locale, e) : o; a && this.emit("missing", { id: e, locale: this._locale @@ -273,52 +273,52 @@ That means you use raw catalog or your catalog doesn't have a translation for th ICU features such as interpolation and plurals will not work properly for that message. Please compile your catalog first. -`)), R(s) && ue.test(s) ? de(s) : R(s) ? s : he(s, this._locale, this._locales)(t, n?.formats); +`)), R(s) && le.test(s) ? ue(s) : R(s) ? s : me(s, this._locale, this._locales)(t, n?.formats); } t = this._.bind(this); date(e, t) { - return ie(this._locales || this._locale, e, t); + return re(this._locales || this._locale, e, t); } number(e, t) { - return oe(this._locales || this._locale, e, t); + return ae(this._locales || this._locale, e, t); } }; -function ve(e = {}) { - return new _e(e); +function _e(e = {}) { + return new ge(e); } -var B = ve(), ye = (e) => e?.ownerDocument ?? document, be = (e) => e && "window" in e && e.window === e ? e : ye(e).defaultView || window; -function xe(e) { +var V = _e(), ve = (e) => e?.ownerDocument ?? document, ye = (e) => e && "window" in e && e.window === e ? e : ve(e).defaultView || window; +function be(e) { return typeof e == "object" && !!e && "nodeType" in e && typeof e.nodeType == "number"; } -function Se(e) { - return xe(e) && e.nodeType === Node.DOCUMENT_FRAGMENT_NODE && "host" in e; +function xe(e) { + return be(e) && e.nodeType === Node.DOCUMENT_FRAGMENT_NODE && "host" in e; } //#endregion //#region ../../node_modules/.pnpm/react-stately@3.47.0_react@19.2.7/node_modules/react-stately/dist/private/flags/flags.mjs -var Ce = !1; -function we() { - return Ce; +var Se = !1; +function Ce() { + return Se; } //#endregion //#region ../../node_modules/.pnpm/react-aria@3.49.0_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/react-aria/dist/private/utils/shadowdom/DOMFunctions.mjs -function Te(e, t) { - if (!we()) return t && e ? e.contains(t) : !1; +function we(e, t) { + if (!Ce()) return t && e ? e.contains(t) : !1; if (!e || !t) return !1; let n = t; for (; n !== null;) { if (n === e) return !0; - n = n.tagName === "SLOT" && n.assignedSlot ? n.assignedSlot.parentNode : Se(n) ? n.host : n.parentNode; + n = n.tagName === "SLOT" && n.assignedSlot ? n.assignedSlot.parentNode : xe(n) ? n.host : n.parentNode; } return !1; } -var Ee = (e = document) => { - if (!we()) return e.activeElement; +var Te = (e = document) => { + if (!Ce()) return e.activeElement; let t = e.activeElement; for (; t && "shadowRoot" in t && t.shadowRoot?.activeElement;) t = t.shadowRoot.activeElement; return t; }; -function De(e) { - if (we() && e.target instanceof Element && e.target.shadowRoot) { +function Ee(e) { + if (Ce() && e.target instanceof Element && e.target.shadowRoot) { if ("composedPath" in e) return e.composedPath()[0] ?? null; if ("composedPath" in e.nativeEvent) return e.nativeEvent.composedPath()[0] ?? null; } @@ -326,26 +326,26 @@ function De(e) { } //#endregion //#region ../../node_modules/.pnpm/react-aria@3.49.0_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/react-aria/dist/private/utils/focusWithoutScrolling.mjs -function Oe(e) { - if (Ae()) e.focus({ preventScroll: !0 }); +function De(e) { + if (ke()) e.focus({ preventScroll: !0 }); else { - let t = je(e); - e.focus(), Me(t); + let t = Ae(e); + e.focus(), je(t); } } -var ke = null; -function Ae() { - if (ke == null) { - ke = !1; +var Oe = null; +function ke() { + if (Oe == null) { + Oe = !1; try { document.createElement("div").focus({ get preventScroll() { - return ke = !0, !0; + return Oe = !0, !0; } }); } catch {} } - return ke; + return Oe; } -function je(e) { +function Ae(e) { let t = e.parentNode, n = [], r = document.scrollingElement || document.documentElement; for (; t instanceof HTMLElement && t !== r;) (t.offsetHeight < t.scrollHeight || t.offsetWidth < t.scrollWidth) && n.push({ element: t, @@ -358,46 +358,46 @@ function je(e) { scrollLeft: r.scrollLeft }), n; } -function Me(e) { +function je(e) { for (let { element: t, scrollTop: n, scrollLeft: r } of e) t.scrollTop = n, t.scrollLeft = r; } //#endregion //#region ../../node_modules/.pnpm/react-aria@3.49.0_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/react-aria/dist/private/utils/useLayoutEffect.mjs -var Ne = typeof document < "u" ? t.useLayoutEffect : () => {}; +var Me = typeof document < "u" ? t.useLayoutEffect : () => {}; //#endregion //#region ../../node_modules/.pnpm/react-aria@3.49.0_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/react-aria/dist/private/interactions/utils.mjs -function Pe(e) { +function Ne(e) { let t = e; return t.nativeEvent = e, t.isDefaultPrevented = () => t.defaultPrevented, t.isPropagationStopped = () => t.cancelBubble, t.persist = () => {}, t; } -function Fe(e, t) { +function Pe(e, t) { Object.defineProperty(e, "target", { value: t }), Object.defineProperty(e, "currentTarget", { value: t }); } -function Ie(e) { +function Fe(e) { let t = v({ isFocused: !1, observer: null }); - return Ne(() => { + return Me(() => { let e = t.current; return () => { e.observer &&= (e.observer.disconnect(), null); }; }, []), l((n) => { - let r = De(n); + let r = Ee(n); if (r instanceof HTMLButtonElement || r instanceof HTMLInputElement || r instanceof HTMLTextAreaElement || r instanceof HTMLSelectElement) { t.current.isFocused = !0; let n = r; n.addEventListener("focusout", (r) => { if (t.current.isFocused = !1, n.disabled) { - let t = Pe(r); + let t = Ne(r); e?.(t); } t.current.observer && (t.current.observer.disconnect(), t.current.observer = null); }, { once: !0 }), t.current.observer = new MutationObserver(() => { if (t.current.isFocused && n.disabled) { t.current.observer?.disconnect(); - let e = n === Ee() ? null : Ee(); + let e = n === Te() ? null : Te(); n.dispatchEvent(new FocusEvent("blur", { relatedTarget: e })), n.dispatchEvent(new FocusEvent("focusout", { bubbles: !0, relatedTarget: e @@ -412,42 +412,42 @@ function Ie(e) { } //#endregion //#region ../../node_modules/.pnpm/react-aria@3.49.0_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/react-aria/dist/private/utils/platform.mjs -function Le(e) { +function Ie(e) { if (typeof window > "u" || window.navigator == null) return !1; let t = window.navigator.userAgentData?.brands; return Array.isArray(t) && t.some((t) => e.test(t.brand)) || e.test(window.navigator.userAgent); } -function Re(e) { +function Le(e) { return typeof window < "u" && window.navigator != null && e.test(window.navigator.userAgentData?.platform || window.navigator.platform); } -function ze(e) { +function Re(e) { let t = null; return () => (t ??= e(), t); } -var Be = ze(function() { - return Re(/^Mac/i); -}), Ve = ze(function() { - return Re(/^iPad/i) || Be() && navigator.maxTouchPoints > 1; -}), He = ze(function() { - return Le(/AppleWebKit/i) && !Ue(); -}), Ue = ze(function() { - return Le(/Chrome/i); -}), We = ze(function() { - return Le(/Android/i); -}), Ge = ze(function() { - return Le(/Firefox/i); +var ze = Re(function() { + return Le(/^Mac/i); +}), Be = Re(function() { + return Le(/^iPad/i) || ze() && navigator.maxTouchPoints > 1; +}), Ve = Re(function() { + return Ie(/AppleWebKit/i) && !He(); +}), He = Re(function() { + return Ie(/Chrome/i); +}), Ue = Re(function() { + return Ie(/Android/i); +}), We = Re(function() { + return Ie(/Firefox/i); }); //#endregion //#region ../../node_modules/.pnpm/react-aria@3.49.0_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/react-aria/dist/private/utils/isVirtualEvent.mjs -function Ke(e) { - return e.pointerType === "" && e.isTrusted ? !0 : We() && e.pointerType ? e.type === "click" && e.buttons === 1 : e.detail === 0 && !e.pointerType; +function Ge(e) { + return e.pointerType === "" && e.isTrusted ? !0 : Ue() && e.pointerType ? e.type === "click" && e.buttons === 1 : e.detail === 0 && !e.pointerType; } //#endregion //#region ../../node_modules/.pnpm/react-aria@3.49.0_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/react-aria/dist/private/utils/openLink.mjs -function qe(e, t, n = !0) { +function Ke(e, t, n = !0) { let { metaKey: r, ctrlKey: i, altKey: a, shiftKey: o } = t; - Ge() && window.event?.type?.startsWith("key") && e.target === "_blank" && (Be() ? r = !0 : i = !0); - let s = He() && Be() && !Ve() ? new KeyboardEvent("keydown", { + We() && window.event?.type?.startsWith("key") && e.target === "_blank" && (ze() ? r = !0 : i = !0); + let s = Ve() && ze() && !Be() ? new KeyboardEvent("keydown", { keyIdentifier: "Enter", metaKey: r, ctrlKey: i, @@ -462,63 +462,63 @@ function qe(e, t, n = !0) { bubbles: !0, cancelable: !0 }); - qe.isOpening = n, Oe(e), e.dispatchEvent(s), qe.isOpening = !1; + Ke.isOpening = n, De(e), e.dispatchEvent(s), Ke.isOpening = !1; } -qe.isOpening = !1; +Ke.isOpening = !1; //#endregion //#region ../../node_modules/.pnpm/react-aria@3.49.0_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/react-aria/dist/private/interactions/useFocusVisible.mjs -var Je = null, Ye = /* @__PURE__ */ new Set(), Xe = /* @__PURE__ */ new Map(), Ze = !1, Qe = !1, $e = { +var qe = null, Je = /* @__PURE__ */ new Set(), Ye = /* @__PURE__ */ new Map(), Xe = !1, Ze = !1, Qe = { Tab: !0, Escape: !0 }; -function et(e, t) { - for (let n of Ye) n(e, t); +function $e(e, t) { + for (let n of Je) n(e, t); +} +function et(e) { + return !(e.metaKey || !ze() && e.altKey || e.ctrlKey || e.key === "Control" || e.key === "Shift" || e.key === "Meta"); } function tt(e) { - return !(e.metaKey || !Be() && e.altKey || e.ctrlKey || e.key === "Control" || e.key === "Shift" || e.key === "Meta"); + Xe = !0, !Ke.isOpening && et(e) && (qe = "keyboard", $e("keyboard", e)); } function nt(e) { - Ze = !0, !qe.isOpening && tt(e) && (Je = "keyboard", et("keyboard", e)); + qe = "pointer", "pointerType" in e && e.pointerType, (e.type === "mousedown" || e.type === "pointerdown") && (Xe = !0, $e("pointer", e)); } function rt(e) { - Je = "pointer", "pointerType" in e && e.pointerType, (e.type === "mousedown" || e.type === "pointerdown") && (Ze = !0, et("pointer", e)); + !Ke.isOpening && Ge(e) && (Xe = !0, qe = "virtual"); } function it(e) { - !qe.isOpening && Ke(e) && (Ze = !0, Je = "virtual"); -} -function at(e) { - let t = be(De(e)), n = ye(De(e)); - De(e) === t || De(e) === n || !e.isTrusted || (!Ze && !Qe && (Je = "virtual", et("virtual", e)), Ze = !1, Qe = !1); + let t = ye(Ee(e)), n = ve(Ee(e)); + Ee(e) === t || Ee(e) === n || !e.isTrusted || (!Xe && !Ze && (qe = "virtual", $e("virtual", e)), Xe = !1, Ze = !1); } -function ot() { - Ze = !1, Qe = !0; +function at() { + Xe = !1, Ze = !0; } -function st(e) { +function ot(e) { if (typeof window > "u" || typeof document > "u") return; - let t = be(e), n = ye(e); - if (Xe.get(t)) return; + let t = ye(e), n = ve(e); + if (Ye.get(t)) return; let r = t.HTMLElement.prototype.focus; t.HTMLElement.prototype.focus = function() { - Ze = !0, r.apply(this, arguments); - }, n.addEventListener("keydown", nt, !0), n.addEventListener("keyup", nt, !0), n.addEventListener("click", it, !0), t.addEventListener("focus", at, !0), t.addEventListener("blur", ot, !1), typeof PointerEvent < "u" && (n.addEventListener("pointerdown", rt, !0), n.addEventListener("pointermove", rt, !0), n.addEventListener("pointerup", rt, !0)), t.addEventListener("beforeunload", () => { - ct(e); - }, { once: !0 }), Xe.set(t, { focus: r }); -} -var ct = (e, t) => { - let n = be(e), r = ye(e); - t && r.removeEventListener("DOMContentLoaded", t), Xe.has(n) && (n.HTMLElement.prototype.focus = Xe.get(n).focus, r.removeEventListener("keydown", nt, !0), r.removeEventListener("keyup", nt, !0), r.removeEventListener("click", it, !0), n.removeEventListener("focus", at, !0), n.removeEventListener("blur", ot, !1), typeof PointerEvent < "u" && (r.removeEventListener("pointerdown", rt, !0), r.removeEventListener("pointermove", rt, !0), r.removeEventListener("pointerup", rt, !0)), Xe.delete(n)); + Xe = !0, r.apply(this, arguments); + }, n.addEventListener("keydown", tt, !0), n.addEventListener("keyup", tt, !0), n.addEventListener("click", rt, !0), t.addEventListener("focus", it, !0), t.addEventListener("blur", at, !1), typeof PointerEvent < "u" && (n.addEventListener("pointerdown", nt, !0), n.addEventListener("pointermove", nt, !0), n.addEventListener("pointerup", nt, !0)), t.addEventListener("beforeunload", () => { + st(e); + }, { once: !0 }), Ye.set(t, { focus: r }); +} +var st = (e, t) => { + let n = ye(e), r = ve(e); + t && r.removeEventListener("DOMContentLoaded", t), Ye.has(n) && (n.HTMLElement.prototype.focus = Ye.get(n).focus, r.removeEventListener("keydown", tt, !0), r.removeEventListener("keyup", tt, !0), r.removeEventListener("click", rt, !0), n.removeEventListener("focus", it, !0), n.removeEventListener("blur", at, !1), typeof PointerEvent < "u" && (r.removeEventListener("pointerdown", nt, !0), r.removeEventListener("pointermove", nt, !0), r.removeEventListener("pointerup", nt, !0)), Ye.delete(n)); }; -function lt(e) { - let t = ye(e), n; +function ct(e) { + let t = ve(e), n; return t.readyState === "loading" ? (n = () => { - st(e); - }, t.addEventListener("DOMContentLoaded", n)) : st(e), () => ct(e, n); + ot(e); + }, t.addEventListener("DOMContentLoaded", n)) : ot(e), () => st(e, n); } -typeof document < "u" && lt(); -function ut() { - return Je !== "pointer"; +typeof document < "u" && ct(); +function lt() { + return qe !== "pointer"; } -var dt = /* @__PURE__ */ new Set([ +var ut = /* @__PURE__ */ new Set([ "checkbox", "radio", "range", @@ -529,28 +529,28 @@ var dt = /* @__PURE__ */ new Set([ "submit", "reset" ]); -function ft(e, t, n) { - let r = n ? De(n) : void 0, i = ye(r), a = be(r), o = a === void 0 ? HTMLInputElement : a.HTMLInputElement, s = a === void 0 ? HTMLTextAreaElement : a.HTMLTextAreaElement, c = a === void 0 ? HTMLElement : a.HTMLElement, l = a === void 0 ? KeyboardEvent : a.KeyboardEvent, u = Ee(i); - return e = e || u instanceof o && !dt.has(u.type) || u instanceof s || u instanceof c && u.isContentEditable, !(e && t === "keyboard" && n instanceof l && !$e[n.key]); +function dt(e, t, n) { + let r = n ? Ee(n) : void 0, i = ve(r), a = ye(r), o = a === void 0 ? HTMLInputElement : a.HTMLInputElement, s = a === void 0 ? HTMLTextAreaElement : a.HTMLTextAreaElement, c = a === void 0 ? HTMLElement : a.HTMLElement, l = a === void 0 ? KeyboardEvent : a.KeyboardEvent, u = Te(i); + return e = e || u instanceof o && !ut.has(u.type) || u instanceof s || u instanceof c && u.isContentEditable, !(e && t === "keyboard" && n instanceof l && !Qe[n.key]); } -function pt(e, t, n) { - st(), f(() => { +function ft(e, t, n) { + ot(), f(() => { if (n?.enabled === !1) return; let t = (t, r) => { - ft(!!n?.isTextInput, t, r) && e(ut()); + dt(!!n?.isTextInput, t, r) && e(lt()); }; - return Ye.add(t), () => { - Ye.delete(t); + return Je.add(t), () => { + Je.delete(t); }; }, t); } //#endregion //#region ../../node_modules/.pnpm/react-aria@3.49.0_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/react-aria/dist/private/interactions/useFocus.mjs -function mt(e) { +function pt(e) { let { isDisabled: t, onFocus: n, onBlur: r, onFocusChange: i } = e, a = l((e) => { - if (De(e) === e.currentTarget) return r && r(e), i && i(!1), !0; - }, [r, i]), o = Ie(a), s = l((e) => { - let t = De(e), r = ye(t), a = r ? Ee(r) : Ee(); + if (Ee(e) === e.currentTarget) return r && r(e), i && i(!1), !0; + }, [r, i]), o = Fe(a), s = l((e) => { + let t = Ee(e), r = ve(t), a = r ? Te(r) : Te(); t === e.currentTarget && t === a && (n && n(e), i && i(!0), o(e)); }, [ i, @@ -564,7 +564,7 @@ function mt(e) { } //#endregion //#region ../../node_modules/.pnpm/react-aria@3.49.0_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/react-aria/dist/private/utils/useGlobalListeners.mjs -function ht() { +function mt() { let e = v(/* @__PURE__ */ new Map()), t = l((t, n, r, i) => { let a = i?.once ? (...t) => { e.current.delete(r), r(...t); @@ -591,26 +591,26 @@ function ht() { } //#endregion //#region ../../node_modules/.pnpm/react-aria@3.49.0_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/react-aria/dist/private/interactions/useFocusWithin.mjs -function gt(e) { - let { isDisabled: t, onBlurWithin: n, onFocusWithin: r, onFocusWithinChange: i } = e, a = v({ isFocusWithin: !1 }), { addGlobalListener: o, removeAllGlobalListeners: s } = ht(), c = l((e) => { - Te(e.currentTarget, De(e)) && a.current.isFocusWithin && !Te(e.currentTarget, e.relatedTarget) && (a.current.isFocusWithin = !1, s(), n && n(e), i && i(!1)); +function ht(e) { + let { isDisabled: t, onBlurWithin: n, onFocusWithin: r, onFocusWithinChange: i } = e, a = v({ isFocusWithin: !1 }), { addGlobalListener: o, removeAllGlobalListeners: s } = mt(), c = l((e) => { + we(e.currentTarget, Ee(e)) && a.current.isFocusWithin && !we(e.currentTarget, e.relatedTarget) && (a.current.isFocusWithin = !1, s(), n && n(e), i && i(!1)); }, [ n, i, a, s - ]), u = Ie(c), d = l((e) => { - if (!Te(e.currentTarget, De(e))) return; - let t = De(e), n = ye(t), s = Ee(n); + ]), u = Fe(c), d = l((e) => { + if (!we(e.currentTarget, Ee(e))) return; + let t = Ee(e), n = ve(t), s = Te(n); if (!a.current.isFocusWithin && s === t) { r && r(e), i && i(!0), a.current.isFocusWithin = !0, u(e); let t = e.currentTarget; o(n, "focus", (e) => { - let r = De(e); - if (a.current.isFocusWithin && !Te(t, r)) { + let r = Ee(e); + if (a.current.isFocusWithin && !we(t, r)) { let e = new n.defaultView.FocusEvent("blur", { relatedTarget: r }); - Fe(e, t); - let i = Pe(e); + Pe(e, t); + let i = Ne(e); c(i); } }, { capture: !0 }); @@ -632,23 +632,23 @@ function gt(e) { } //#endregion //#region ../../node_modules/.pnpm/react-aria@3.49.0_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/react-aria/dist/private/focus/useFocusRing.mjs -function _t(e = {}) { +function gt(e = {}) { let { autoFocus: t = !1, isTextInput: n, within: r } = e, i = v({ isFocused: !1, - isFocusVisible: t || ut() + isFocusVisible: t || lt() }), [a, o] = y(!1), [s, c] = y(() => i.current.isFocused && i.current.isFocusVisible), u = l(() => c(i.current.isFocused && i.current.isFocusVisible), []), d = l((e) => { - i.current.isFocused = e, i.current.isFocusVisible = ut(), o(e), u(); + i.current.isFocused = e, i.current.isFocusVisible = lt(), o(e), u(); }, [u]); - pt((e) => { + ft((e) => { i.current.isFocusVisible = e, u(); }, [n, a], { enabled: a, isTextInput: n }); - let { focusProps: f } = mt({ + let { focusProps: f } = pt({ isDisabled: r, onFocusChange: d - }), { focusWithinProps: p } = gt({ + }), { focusWithinProps: p } = ht({ isDisabled: !r, onFocusWithinChange: d }); @@ -660,36 +660,36 @@ function _t(e = {}) { } //#endregion //#region ../../node_modules/.pnpm/react-aria@3.49.0_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/react-aria/dist/private/interactions/useHover.mjs -var vt = !1, yt = 0; -function bt() { - vt = !0, setTimeout(() => { - vt = !1; +var _t = !1, vt = 0; +function yt() { + _t = !0, setTimeout(() => { + _t = !1; }, 500); } -function xt(e) { - e.pointerType === "touch" && bt(); +function bt(e) { + e.pointerType === "touch" && yt(); } -function St() { - let e = ye(null); - if (e !== void 0) return yt === 0 && typeof PointerEvent < "u" && e.addEventListener("pointerup", xt), yt++, () => { - yt--, !(yt > 0) && typeof PointerEvent < "u" && e.removeEventListener("pointerup", xt); +function xt() { + let e = ve(null); + if (e !== void 0) return vt === 0 && typeof PointerEvent < "u" && e.addEventListener("pointerup", bt), vt++, () => { + vt--, !(vt > 0) && typeof PointerEvent < "u" && e.removeEventListener("pointerup", bt); }; } -function Ct(e) { +function St(e) { let { onHoverStart: t, onHoverChange: n, onHoverEnd: r, isDisabled: i } = e, [a, o] = y(!1), s = v({ isHovered: !1, ignoreEmulatedMouseEvents: !1, pointerType: "", target: null }).current; - f(St, []); - let { addGlobalListener: c, removeAllGlobalListeners: l } = ht(), { hoverProps: u, triggerHoverEnd: d } = g(() => { + f(xt, []); + let { addGlobalListener: c, removeAllGlobalListeners: l } = mt(), { hoverProps: u, triggerHoverEnd: d } = g(() => { let e = (e, r) => { - if (s.pointerType = r, i || r === "touch" || s.isHovered || !Te(e.currentTarget, De(e))) return; + if (s.pointerType = r, i || r === "touch" || s.isHovered || !we(e.currentTarget, Ee(e))) return; s.isHovered = !0; let l = e.currentTarget; - s.target = l, c(ye(De(e)), "pointerover", (e) => { - s.isHovered && s.target && !Te(s.target, De(e)) && a(e, e.pointerType); + s.target = l, c(ve(Ee(e)), "pointerover", (e) => { + s.isHovered && s.target && !we(s.target, Ee(e)) && a(e, e.pointerType); }, { capture: !0 }), t && t({ type: "hoverstart", target: l, @@ -704,9 +704,9 @@ function Ct(e) { }), n && n(!1), o(!1)); }, u = {}; return typeof PointerEvent < "u" && (u.onPointerEnter = (t) => { - vt && t.pointerType === "mouse" || e(t, t.pointerType); + _t && t.pointerType === "mouse" || e(t, t.pointerType); }, u.onPointerLeave = (e) => { - !i && Te(e.currentTarget, De(e)) && a(e, e.pointerType); + !i && we(e.currentTarget, Ee(e)) && a(e, e.pointerType); }), { hoverProps: u, triggerHoverEnd: a @@ -729,14 +729,14 @@ function Ct(e) { } //#endregion //#region ../../node_modules/.pnpm/@headlessui+react@2.2.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@headlessui/react/dist/utils/env.js -var wt = Object.defineProperty, Tt = (e, t, n) => t in e ? wt(e, t, { +var Ct = Object.defineProperty, wt = (e, t, n) => t in e ? Ct(e, t, { enumerable: !0, configurable: !0, writable: !0, value: n -}) : e[t] = n, Et = (e, t, n) => (Tt(e, typeof t == "symbol" ? t : t + "", n), n), Dt = new class { +}) : e[t] = n, Tt = (e, t, n) => (wt(e, typeof t == "symbol" ? t : t + "", n), n), Et = new class { constructor() { - Et(this, "current", this.detect()), Et(this, "handoffState", "pending"), Et(this, "currentId", 0); + Tt(this, "current", this.detect()), Tt(this, "handoffState", "pending"), Tt(this, "currentId", 0); } set(e) { this.current !== e && (this.handoffState = "pending", this.currentId = 0, this.current = e); @@ -765,28 +765,28 @@ var wt = Object.defineProperty, Tt = (e, t, n) => t in e ? wt(e, t, { }(); //#endregion //#region ../../node_modules/.pnpm/@headlessui+react@2.2.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@headlessui/react/dist/utils/owner.js +function Dt(e) { + return Et.isServer ? null : e == null ? document : e?.ownerDocument ?? document; +} function Ot(e) { - return Dt.isServer ? null : e == null ? document : e?.ownerDocument ?? document; + return Et.isServer ? null : e == null ? document : (e?.getRootNode)?.call(e) ?? document; } function kt(e) { - return Dt.isServer ? null : e == null ? document : (e?.getRootNode)?.call(e) ?? document; + return Ot(e)?.activeElement ?? null; } function At(e) { - return kt(e)?.activeElement ?? null; -} -function jt(e) { - return At(e) === e; + return kt(e) === e; } //#endregion //#region ../../node_modules/.pnpm/@headlessui+react@2.2.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@headlessui/react/dist/utils/micro-task.js -function Mt(e) { +function jt(e) { typeof queueMicrotask == "function" ? queueMicrotask(e) : Promise.resolve().then(e).catch((e) => setTimeout(() => { throw e; })); } //#endregion //#region ../../node_modules/.pnpm/@headlessui+react@2.2.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@headlessui/react/dist/utils/disposables.js -function Nt() { +function Mt() { let e = [], t = { addEventListener(e, n, r, i) { return e.addEventListener(n, r, i), t.add(() => e.removeEventListener(n, r, i)); @@ -804,7 +804,7 @@ function Nt() { }, microTask(...e) { let n = { current: !0 }; - return Mt(() => { + return jt(() => { n.current && e[0](); }), t.add(() => { n.current = !1; @@ -817,7 +817,7 @@ function Nt() { }); }, group(e) { - let t = Nt(); + let t = Mt(); return e(t), this.add(() => t.dispose()); }, add(t) { @@ -834,32 +834,32 @@ function Nt() { } //#endregion //#region ../../node_modules/.pnpm/@headlessui+react@2.2.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@headlessui/react/dist/hooks/use-disposables.js -function Pt() { - let [e] = y(Nt); +function Nt() { + let [e] = y(Mt); return f(() => () => e.dispose(), [e]), e; } //#endregion //#region ../../node_modules/.pnpm/@headlessui+react@2.2.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@headlessui/react/dist/hooks/use-iso-morphic-effect.js -var V = (e, t) => { - Dt.isServer ? f(e, t) : h(e, t); +var H = (e, t) => { + Et.isServer ? f(e, t) : h(e, t); }; //#endregion //#region ../../node_modules/.pnpm/@headlessui+react@2.2.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@headlessui/react/dist/hooks/use-latest-value.js -function Ft(e) { +function Pt(e) { let t = v(e); - return V(() => { + return H(() => { t.current = e; }, [e]), t; } //#endregion //#region ../../node_modules/.pnpm/@headlessui+react@2.2.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@headlessui/react/dist/hooks/use-event.js -var H = function(e) { - let n = Ft(e); +var U = function(e) { + let n = Pt(e); return t.useCallback((...e) => n.current(...e), [n]); }; //#endregion //#region ../../node_modules/.pnpm/@headlessui+react@2.2.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@headlessui/react/dist/hooks/use-active-press.js -function It(e) { +function Ft(e) { let t = e.width / 2, n = e.height / 2; return { top: e.clientY - n, @@ -868,21 +868,21 @@ function It(e) { left: e.clientX - t }; } -function Lt(e, t) { +function It(e, t) { return !(!e || !t || e.right < t.left || e.left > t.right || e.bottom < t.top || e.top > t.bottom); } -function Rt({ disabled: e = !1 } = {}) { - let t = v(null), [n, r] = y(!1), i = Pt(), a = H(() => { +function Lt({ disabled: e = !1 } = {}) { + let t = v(null), [n, r] = y(!1), i = Nt(), a = U(() => { t.current = null, r(!1), i.dispose(); - }), o = H((e) => { + }), o = U((e) => { if (i.dispose(), t.current === null) { t.current = e.currentTarget, r(!0); { - let n = Ot(e.currentTarget); + let n = Dt(e.currentTarget); i.addEventListener(n, "pointerup", a, !1), i.addEventListener(n, "pointermove", (e) => { if (t.current) { - let n = It(e); - r(Lt(n, t.current.getBoundingClientRect())); + let n = Ft(e); + r(It(n, t.current.getBoundingClientRect())); } }, !1), i.addEventListener(n, "pointercancel", a, !1); } @@ -899,57 +899,57 @@ function Rt({ disabled: e = !1 } = {}) { } //#endregion //#region ../../node_modules/.pnpm/@headlessui+react@2.2.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@headlessui/react/dist/hooks/use-slot.js -function U(e) { +function W(e) { return g(() => e, Object.values(e)); } //#endregion //#region ../../node_modules/.pnpm/@headlessui+react@2.2.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@headlessui/react/dist/internal/disabled.js -var zt = i(void 0); -function Bt() { - return u(zt); +var Rt = i(void 0); +function zt() { + return u(Rt); } //#endregion //#region ../../node_modules/.pnpm/@headlessui+react@2.2.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@headlessui/react/dist/utils/class-names.js -function Vt(...e) { +function Bt(...e) { return Array.from(new Set(e.flatMap((e) => typeof e == "string" ? e.split(" ") : []))).filter(Boolean).join(" "); } //#endregion //#region ../../node_modules/.pnpm/@headlessui+react@2.2.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@headlessui/react/dist/utils/match.js -function Ht(e, t, ...n) { +function Vt(e, t, ...n) { if (e in t) { let r = t[e]; return typeof r == "function" ? r(...n) : r; } let r = /* @__PURE__ */ Error(`Tried to handle "${e}" but there is no handler defined. Only defined handlers are: ${Object.keys(t).map((e) => `"${e}"`).join(", ")}.`); - throw Error.captureStackTrace && Error.captureStackTrace(r, Ht), r; + throw Error.captureStackTrace && Error.captureStackTrace(r, Vt), r; } //#endregion //#region ../../node_modules/.pnpm/@headlessui+react@2.2.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@headlessui/react/dist/utils/render.js -var Ut = ((e) => (e[e.None = 0] = "None", e[e.RenderStrategy = 1] = "RenderStrategy", e[e.Static = 2] = "Static", e))(Ut || {}), Wt = ((e) => (e[e.Unmount = 0] = "Unmount", e[e.Hidden = 1] = "Hidden", e))(Wt || {}); -function W() { - let e = qt(); - return l((t) => Gt({ +var Ht = ((e) => (e[e.None = 0] = "None", e[e.RenderStrategy = 1] = "RenderStrategy", e[e.Static = 2] = "Static", e))(Ht || {}), Ut = ((e) => (e[e.Unmount = 0] = "Unmount", e[e.Hidden = 1] = "Hidden", e))(Ut || {}); +function G() { + let e = Kt(); + return l((t) => Wt({ mergeRefs: e, ...t }), [e]); } -function Gt({ ourProps: e, theirProps: t, slot: n, defaultTag: r, features: i, visible: a = !0, name: o, mergeRefs: s }) { - s ??= Jt; - let c = Yt(t, e); - if (a) return Kt(c, n, r, o, s); +function Wt({ ourProps: e, theirProps: t, slot: n, defaultTag: r, features: i, visible: a = !0, name: o, mergeRefs: s }) { + s ??= qt; + let c = Jt(t, e); + if (a) return Gt(c, n, r, o, s); let l = i ?? 0; if (l & 2) { let { static: e = !1, ...t } = c; - if (e) return Kt(t, n, r, o, s); + if (e) return Gt(t, n, r, o, s); } if (l & 1) { let { unmount: e = !0, ...t } = c; - return Ht(+!e, { + return Vt(+!e, { 0() { return null; }, 1() { - return Kt({ + return Gt({ ...t, hidden: !0, style: { display: "none" } @@ -957,11 +957,11 @@ function Gt({ ourProps: e, theirProps: t, slot: n, defaultTag: r, features: i, v } }); } - return Kt(c, n, r, o, s); + return Gt(c, n, r, o, s); } -function Kt(e, t = {}, n, i, o) { - let { as: s = n, children: l, refName: u = "ref", ...d } = Qt(e, ["unmount", "static"]), f = e.ref === void 0 ? {} : { [u]: e.ref }, p = typeof l == "function" ? l(t) : l; - p = en(p), "className" in d && d.className && typeof d.className == "function" && (d.className = d.className(t)), d["aria-labelledby"] && d["aria-labelledby"] === d.id && (d["aria-labelledby"] = void 0); +function Gt(e, t = {}, n, i, o) { + let { as: s = n, children: l, refName: u = "ref", ...d } = Zt(e, ["unmount", "static"]), f = e.ref === void 0 ? {} : { [u]: e.ref }, p = typeof l == "function" ? l(t) : l; + p = $t(p), "className" in d && d.className && typeof d.className == "function" && (d.className = d.className(t)), d["aria-labelledby"] && d["aria-labelledby"] === d.id && (d["aria-labelledby"] = void 0); let m = {}; if (t) { let e = !1, n = []; @@ -971,25 +971,25 @@ function Kt(e, t = {}, n, i, o) { for (let e of n) m[`data-${e}`] = ""; } } - if (tn(s) && (Object.keys(Zt(d)).length > 0 || Object.keys(Zt(m)).length > 0)) if (!c(p) || Array.isArray(p) && p.length > 1 || nn(p)) { - if (Object.keys(Zt(d)).length > 0) throw Error([ + if (en(s) && (Object.keys(Xt(d)).length > 0 || Object.keys(Xt(m)).length > 0)) if (!c(p) || Array.isArray(p) && p.length > 1 || tn(p)) { + if (Object.keys(Xt(d)).length > 0) throw Error([ "Passing props on \"Fragment\"!", "", `The current component <${i} /> is rendering a "Fragment".`, "However we need to passthrough the following props:", - Object.keys(Zt(d)).concat(Object.keys(Zt(m))).map((e) => ` - ${e}`).join("\n"), + Object.keys(Xt(d)).concat(Object.keys(Xt(m))).map((e) => ` - ${e}`).join("\n"), "", "You can apply a few solutions:", ["Add an `as=\"...\"` prop, to ensure that we render an actual element instead of a \"Fragment\".", "Render a single element as the child so that we can forward the props onto that element."].map((e) => ` - ${e}`).join("\n") ].join("\n")); } else { - let e = p.props?.className, t = typeof e == "function" ? (...t) => Vt(e(...t), d.className) : Vt(e, d.className), n = t ? { className: t } : {}, i = Yt(p.props, Zt(Qt(d, ["ref"]))); + let e = p.props?.className, t = typeof e == "function" ? (...t) => Bt(e(...t), d.className) : Bt(e, d.className), n = t ? { className: t } : {}, i = Jt(p.props, Xt(Zt(d, ["ref"]))); for (let e in m) e in i && delete m[e]; - return r(p, Object.assign({}, i, m, f, { ref: o($t(p), f.ref) }, n)); + return r(p, Object.assign({}, i, m, f, { ref: o(Qt(p), f.ref) }, n)); } - return a(s, Object.assign({}, Qt(d, ["ref"]), !tn(s) && f, !tn(s) && m), p); + return a(s, Object.assign({}, Zt(d, ["ref"]), !en(s) && f, !en(s) && m), p); } -function qt() { +function Kt() { let e = v([]), t = l((t) => { for (let n of e.current) n != null && (typeof n == "function" ? n(t) : n.current = t); }, []); @@ -997,12 +997,12 @@ function qt() { if (!n.every((e) => e == null)) return e.current = n, t; }; } -function Jt(...e) { +function qt(...e) { return e.every((e) => e == null) ? void 0 : (t) => { for (let n of e) n != null && (typeof n == "function" ? n(t) : n.current = t); }; } -function Yt(...e) { +function Jt(...e) { if (e.length === 0) return {}; if (e.length === 1) return e[0]; let t = {}, n = {}; @@ -1017,7 +1017,7 @@ function Yt(...e) { } }); return t; } -function Xt(...e) { +function Yt(...e) { if (e.length === 0) return {}; if (e.length === 1) return e[0]; let t = {}, n = {}; @@ -1028,61 +1028,61 @@ function Xt(...e) { } }); return t; } -function G(e) { +function K(e) { return Object.assign(s(e), { displayName: e.displayName ?? e.name }); } -function Zt(e) { +function Xt(e) { let t = Object.assign({}, e); for (let e in t) t[e] === void 0 && delete t[e]; return t; } -function Qt(e, t = []) { +function Zt(e, t = []) { let n = Object.assign({}, e); for (let e of t) e in n && delete n[e]; return n; } -function $t(e) { +function Qt(e) { return t.version.split(".")[0] >= "19" ? e.props.ref : e.ref; } -function en(e) { +function $t(e) { if (e != null && e.$$typeof === Symbol.for("react.lazy")) { let t = e._payload; - if (t != null && t.status === "fulfilled") return en(t.value); + if (t != null && t.status === "fulfilled") return $t(t.value); } return e; } -function tn(e) { +function en(e) { return e === n || e === Symbol.for("react.fragment"); } -function nn(e) { - return tn(e.type); +function tn(e) { + return en(e.type); } //#endregion //#region ../../node_modules/.pnpm/@headlessui+react@2.2.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@headlessui/react/dist/hooks/use-controllable.js -function rn(e, t, n) { +function nn(e, t, n) { let [r, i] = y(n), a = e !== void 0, o = v(a), s = v(!1), c = v(!1); - return a && !o.current && !s.current ? (s.current = !0, o.current = a, console.error("A component is changing from uncontrolled to controlled. This may be caused by the value changing from undefined to a defined value, which should not happen.")) : !a && o.current && !c.current && (c.current = !0, o.current = a, console.error("A component is changing from controlled to uncontrolled. This may be caused by the value changing from a defined value to undefined, which should not happen.")), [a ? e : r, H((e) => (a || E(() => i(e)), t?.(e)))]; + return a && !o.current && !s.current ? (s.current = !0, o.current = a, console.error("A component is changing from uncontrolled to controlled. This may be caused by the value changing from undefined to a defined value, which should not happen.")) : !a && o.current && !c.current && (c.current = !0, o.current = a, console.error("A component is changing from controlled to uncontrolled. This may be caused by the value changing from a defined value to undefined, which should not happen.")), [a ? e : r, U((e) => (a || E(() => i(e)), t?.(e)))]; } //#endregion //#region ../../node_modules/.pnpm/@headlessui+react@2.2.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@headlessui/react/dist/hooks/use-default-value.js -function an(e) { +function rn(e) { let [t] = y(e); return t; } //#endregion //#region ../../node_modules/.pnpm/@headlessui+react@2.2.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@headlessui/react/dist/utils/form.js -function on(e = {}, t = null, n = []) { - for (let [r, i] of Object.entries(e)) cn(n, sn(t, r), i); +function an(e = {}, t = null, n = []) { + for (let [r, i] of Object.entries(e)) sn(n, on(t, r), i); return n; } -function sn(e, t) { +function on(e, t) { return e ? e + "[" + t + "]" : t; } -function cn(e, t, n) { - if (Array.isArray(n)) for (let [r, i] of n.entries()) cn(e, sn(t, r.toString()), i); - else n instanceof Date ? e.push([t, n.toISOString()]) : typeof n == "boolean" ? e.push([t, n ? "1" : "0"]) : typeof n == "string" ? e.push([t, n]) : typeof n == "number" ? e.push([t, `${n}`]) : n == null ? e.push([t, ""]) : un(n) && !c(n) && on(n, t, e); +function sn(e, t, n) { + if (Array.isArray(n)) for (let [r, i] of n.entries()) sn(e, on(t, r.toString()), i); + else n instanceof Date ? e.push([t, n.toISOString()]) : typeof n == "boolean" ? e.push([t, n ? "1" : "0"]) : typeof n == "string" ? e.push([t, n]) : typeof n == "number" ? e.push([t, `${n}`]) : n == null ? e.push([t, ""]) : ln(n) && !c(n) && an(n, t, e); } -function ln(e) { +function cn(e) { var t; let n = e?.form ?? e.closest("form"); if (n) { @@ -1093,15 +1093,15 @@ function ln(e) { (t = n.requestSubmit) == null || t.call(n); } } -function un(e) { +function ln(e) { if (Object.prototype.toString.call(e) !== "[object Object]") return !1; let t = Object.getPrototypeOf(e); return t === null || Object.getPrototypeOf(t) === null; } //#endregion //#region ../../node_modules/.pnpm/@headlessui+react@2.2.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@headlessui/react/dist/internal/hidden.js -var dn = "span", fn = ((e) => (e[e.None = 1] = "None", e[e.Focusable = 2] = "Focusable", e[e.Hidden = 4] = "Hidden", e))(fn || {}); -function pn(e, t) { +var un = "span", dn = ((e) => (e[e.None = 1] = "None", e[e.Focusable = 2] = "Focusable", e[e.Hidden = 4] = "Hidden", e))(dn || {}); +function fn(e, t) { let { features: n = 1, ...r } = e, i = { ref: t, "aria-hidden": (n & 2) == 2 ? !0 : r["aria-hidden"] ?? void 0, @@ -1121,35 +1121,35 @@ function pn(e, t) { ...(n & 4) == 4 && (n & 2) != 2 && { display: "none" } } }; - return W()({ + return G()({ ourProps: i, theirProps: r, slot: {}, - defaultTag: dn, + defaultTag: un, name: "Hidden" }); } -var mn = G(pn), hn = i(null); -function gn({ children: e }) { - let n = u(hn); +var pn = K(fn), mn = i(null); +function hn({ children: e }) { + let n = u(mn); if (!n) return t.createElement(t.Fragment, null, e); let { target: r } = n; return r ? T(t.createElement(t.Fragment, null, e), r) : null; } -function _n({ data: e, form: n, disabled: r, onReset: i, overrides: a }) { - let [o, s] = y(null), c = Pt(); +function gn({ data: e, form: n, disabled: r, onReset: i, overrides: a }) { + let [o, s] = y(null), c = Nt(); return f(() => { if (i && o) return c.addEventListener(o, "reset", i); }, [ o, n, i - ]), t.createElement(gn, null, t.createElement(vn, { + ]), t.createElement(hn, null, t.createElement(_n, { setForm: s, formId: n - }), on(e).map(([e, i]) => t.createElement(mn, { - features: fn.Hidden, - ...Zt({ + }), an(e).map(([e, i]) => t.createElement(pn, { + features: dn.Hidden, + ...Xt({ key: e, as: "input", type: "hidden", @@ -1163,14 +1163,14 @@ function _n({ data: e, form: n, disabled: r, onReset: i, overrides: a }) { }) }))); } -function vn({ setForm: e, formId: n }) { +function _n({ setForm: e, formId: n }) { return f(() => { if (n) { let t = document.getElementById(n); t && e(t); } - }, [e, n]), n ? null : t.createElement(mn, { - features: fn.Hidden, + }, [e, n]), n ? null : t.createElement(pn, { + features: dn.Hidden, as: "input", type: "hidden", hidden: !0, @@ -1184,97 +1184,97 @@ function vn({ setForm: e, formId: n }) { } //#endregion //#region ../../node_modules/.pnpm/@headlessui+react@2.2.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@headlessui/react/dist/internal/id.js -var yn = i(void 0); -function bn() { - return u(yn); +var vn = i(void 0); +function yn() { + return u(vn); } //#endregion //#region ../../node_modules/.pnpm/@headlessui+react@2.2.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@headlessui/react/dist/utils/dom.js -function xn(e) { +function bn(e) { return typeof e != "object" || !e ? !1 : "nodeType" in e; } +function xn(e) { + return bn(e) && "tagName" in e; +} function Sn(e) { - return xn(e) && "tagName" in e; + return xn(e) && "accessKey" in e; } function Cn(e) { - return Sn(e) && "accessKey" in e; + return xn(e) && "tabIndex" in e; } function wn(e) { - return Sn(e) && "tabIndex" in e; + return xn(e) && "style" in e; } function Tn(e) { - return Sn(e) && "style" in e; + return Sn(e) && e.nodeName === "IFRAME"; } function En(e) { - return Cn(e) && e.nodeName === "IFRAME"; + return Sn(e) && e.nodeName === "INPUT"; } function Dn(e) { - return Cn(e) && e.nodeName === "INPUT"; + return Sn(e) && e.nodeName === "LABEL"; } function On(e) { - return Cn(e) && e.nodeName === "LABEL"; + return Sn(e) && e.nodeName === "FIELDSET"; } function kn(e) { - return Cn(e) && e.nodeName === "FIELDSET"; + return Sn(e) && e.nodeName === "LEGEND"; } function An(e) { - return Cn(e) && e.nodeName === "LEGEND"; -} -function jn(e) { - return Sn(e) ? e.matches("a[href],audio[controls],button,details,embed,iframe,img[usemap],input:not([type=\"hidden\"]),label,select,textarea,video[controls]") : !1; + return xn(e) ? e.matches("a[href],audio[controls],button,details,embed,iframe,img[usemap],input:not([type=\"hidden\"]),label,select,textarea,video[controls]") : !1; } //#endregion //#region ../../node_modules/.pnpm/@headlessui+react@2.2.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@headlessui/react/dist/utils/bugs.js -function Mn(e) { +function jn(e) { let t = e.parentElement, n = null; - for (; t && !kn(t);) An(t) && (n = t), t = t.parentElement; + for (; t && !On(t);) kn(t) && (n = t), t = t.parentElement; let r = t?.getAttribute("disabled") === ""; - return r && Nn(n) ? !1 : r; + return r && Mn(n) ? !1 : r; } -function Nn(e) { +function Mn(e) { if (!e) return !1; let t = e.previousElementSibling; for (; t !== null;) { - if (An(t)) return !1; + if (kn(t)) return !1; t = t.previousElementSibling; } return !0; } //#endregion //#region ../../node_modules/.pnpm/@headlessui+react@2.2.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@headlessui/react/dist/hooks/use-sync-refs.js -var Pn = Symbol(); -function Fn(e, t = !0) { - return Object.assign(e, { [Pn]: t }); +var Nn = Symbol(); +function Pn(e, t = !0) { + return Object.assign(e, { [Nn]: t }); } -function K(...e) { +function q(...e) { let t = v(e); f(() => { t.current = e; }, [e]); - let n = H((e) => { + let n = U((e) => { for (let n of t.current) n != null && (typeof n == "function" ? n(e) : n.current = e); }); - return e.every((e) => e == null || e?.[Pn]) ? void 0 : n; + return e.every((e) => e == null || e?.[Nn]) ? void 0 : n; } //#endregion //#region ../../node_modules/.pnpm/@headlessui+react@2.2.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@headlessui/react/dist/components/description/description.js -var In = i(null); -In.displayName = "DescriptionContext"; -function Ln() { - let e = u(In); +var Fn = i(null); +Fn.displayName = "DescriptionContext"; +function In() { + let e = u(Fn); if (e === null) { let e = /* @__PURE__ */ Error("You used a component, but it is not inside a relevant parent."); - throw Error.captureStackTrace && Error.captureStackTrace(e, Ln), e; + throw Error.captureStackTrace && Error.captureStackTrace(e, In), e; } return e; } -function Rn() { - return u(In)?.value ?? void 0; +function Ln() { + return u(Fn)?.value ?? void 0; } -function zn() { +function Rn() { let [e, n] = y([]); return [e.length > 0 ? e.join(" ") : void 0, g(() => function(e) { - let r = H((e) => (n((t) => [...t, e]), () => n((t) => { + let r = U((e) => (n((t) => [...t, e]), () => n((t) => { let n = t.slice(), r = n.indexOf(e); return r !== -1 && n.splice(r, 1), n; }))), i = g(() => ({ @@ -1290,14 +1290,14 @@ function zn() { e.props, e.value ]); - return t.createElement(In.Provider, { value: i }, e.children); + return t.createElement(Fn.Provider, { value: i }, e.children); }, [n])]; } -var Bn = "p"; -function Vn(e, t) { - let n = m(), r = Bt(), { id: i = `headlessui-description-${n}`, ...a } = e, o = Ln(), s = K(t); - V(() => o.register(i), [i, o.register]); - let c = U({ +var zn = "p"; +function Bn(e, t) { + let n = m(), r = zt(), { id: i = `headlessui-description-${n}`, ...a } = e, o = In(), s = q(t); + H(() => o.register(i), [i, o.register]); + let c = W({ ...o.slot, disabled: r || !1 }), l = { @@ -1305,32 +1305,32 @@ function Vn(e, t) { ...o.props, id: i }; - return W()({ + return G()({ ourProps: l, theirProps: a, slot: c, - defaultTag: Bn, + defaultTag: zn, name: o.name || "Description" }); } -var Hn = G(Vn), Un = Object.assign(Hn, {}), q = ((e) => (e.Space = " ", e.Enter = "Enter", e.Escape = "Escape", e.Backspace = "Backspace", e.Delete = "Delete", e.ArrowLeft = "ArrowLeft", e.ArrowUp = "ArrowUp", e.ArrowRight = "ArrowRight", e.ArrowDown = "ArrowDown", e.Home = "Home", e.End = "End", e.PageUp = "PageUp", e.PageDown = "PageDown", e.Tab = "Tab", e))(q || {}), Wn = i(null); -Wn.displayName = "LabelContext"; -function Gn() { - let e = u(Wn); +var Vn = K(Bn), Hn = Object.assign(Vn, {}), J = ((e) => (e.Space = " ", e.Enter = "Enter", e.Escape = "Escape", e.Backspace = "Backspace", e.Delete = "Delete", e.ArrowLeft = "ArrowLeft", e.ArrowUp = "ArrowUp", e.ArrowRight = "ArrowRight", e.ArrowDown = "ArrowDown", e.Home = "Home", e.End = "End", e.PageUp = "PageUp", e.PageDown = "PageDown", e.Tab = "Tab", e))(J || {}), Un = i(null); +Un.displayName = "LabelContext"; +function Wn() { + let e = u(Un); if (e === null) { let e = /* @__PURE__ */ Error("You used a